FPGAExpress2.1/ FPGA编译器1998.08 -错误的逻辑与“向下”范围整数比较是在VHDL中产生的

描述

FPGAExpress、FPGA编译器、VHDL、比较、范围、HDL—395

紧迫性:标准

一般描述:
在VHDL编译器中已经识别出导致错误逻辑的创建的问题。当在比较中使用具有非负“下行”范围的约束整数子类型时,可能会出现问题。

这个问题已经追溯到VHDL编译器的更改,这是Turbo增强的一部分,它加快了细化时间。它可以可靠地检测在综合后仿真。

这里有两个场景会导致VHDL编译器产生错误的逻辑(注意Verilog中不存在这个问题):

在第一种情况下,将“for循环”索引与具有非负下降范围的约束整数进行比较,如图所示:

信号ADDR:整数范围A to B;
- a & gt;0和b& gt=0

这种情况在1998.02*(1998.02,1998年02-1,和1998年02-2)发布中产生了错误的逻辑。注意,循环索引被VHDL编译器隐式地处理为无约束整数。


场景1(1998.02版中的错误逻辑):

信号ADDR:整数范围7下降到0;


进程(ADDR,A,B,C)
开始
我在3下0圈
如果(ADDR=i),则是整数到整数的比较
--作为“for循环”的索引“i”
--总是当作整数来处理。这个
-其他整数具有非负
——向下延伸。请注意
在for循环中的向下范围
--声明不是问题。


结束行为;

虽然对所有情况都不正确,但是当不正确的逻辑产生时,您可能会得到以下HDL 395警告消息:

警告:文件%s中例程%s行%d中的语句始终未达到。(HDL—395)

如果您试图在for循环中生成触发器,您可能会发现,触发器的一些错误是由于错误的逻辑而丢失的。


第二种情况是当两个信号、变量或端口类型为“整数”比较时,只有一个整数具有非负下降范围。例如,比较“ADDR1”和“ADDR2”:

“ADDR1”是一个范围A的整数to A to B,其中a & gt;0和b& gt;=0。

“ADDR2”可以是:整数,范围C的整数降到D,或者是D到C的整数,其中D & lt;0和C是任意数。

这将在1997.08*和1998.02*版本中产生错误的逻辑。

场景2(1997.08和1998.02*版本中的错误逻辑):


信号ADDR1:整数;
信号ADDR2:整数范围7下降到0;


进程(ADDR1、ADDR2、A、B、C);
开始
如果(ADDR1//ADDR2)然后--整数到整数比较
--其中一个整数有
-一个非负下降范围。



结束行为;

解决方案

下面两个工作将解决这个问题。其中一个牺牲了Turbo增强对细化过程造成的一些加速;另一个则需要一个小的代码修改。

1。在DCYS壳提示符下使用以下隐藏变量禁用部分Turbo加速。确保在阅读或分析/阐述VHDL之前设置变量:

HDLIN AccelS级=4


2。整数的比较产生了一个非负下降范围的问题。如前所示,将前7个场景中的0个整数降为0到7。

情景1:
信号ADDR:整数范围0至7;

情景2:
信号ADDR2:整数范围0至7;

这个问题在1998.08版本中是固定的,这对应于FPGAExpress2.1.1和基础F1.5。
编辑 重设标签(回车键确认) 标为违禁 关闭 合并 删除

提问于 2018-07-29 13:59:35 +0800

这个帖子被标记为一个社区wiki

这个帖子是一个wiki(维基). 任何一个积分 >500的人都可以完善它