我正在研究VHDL并遇到了一个我无法找到答案的问题 . 我理解下面的例子以及结果为7的原因:
architecture SIGN of EXAMPLE is
signal TRIGGER, RESULT: integer := 0;
signal signal1: integer :=1;
signal signal2: integer :=2;
signal signal3: integer :=3;
begin
process
begin
wait on TRIGGER;
signal1 <= signal2;
signal2 <= signal1 + signal3;
signal3 <= signal2;
RESULT <= signal1 + signal2 + signal3;
end process;
end SIGN;
但是,如果我将signal1放在灵敏度列表中会发生什么?还是所有的信号?
2 回答
首先,如果为进程创建了敏感性列表,则必须删除或注释掉
wait on TRIGGER
语句,因为具有敏感性列表的进程也不能具有wait
语句 .如果
signal1
是过程敏感性列表,则该过程最初运行,然后只要signal1
发生更改就重新运行 .默认值后或基于进程运行中的赋值的值适用于
signal1
,signal2
,signal3
和RESULT
:请记住,信号分配在过程完成之后才会生效,基于增量循环仿真模型 .
由于重新运行1和2之间的
signal1
没有变化,因此该进程不再运行,因此RESULT
的值为12,从上次运行开始 .如果
signal1
和signal2
在过程灵敏度列表中,则每个过程运行将改变其中一个信号,因此过程将继续重新运行,直到达到模拟器增量循环迭代限制或integer
数据将超出范围值类型,导致值没有进一步变化 .你没有展示完整的例子以及你提出的改变,而是在挥手 .
目前,为什么RESULT = 0?
你为什么不模拟这一切?
将
RESULT
和TRIGGER
添加到灵敏度列表会给出相同的答案 . 你能说出原因吗?值翻转实际上揭示了此VHDL实现中的错误 .
IEEE标准1076-2008,5.2.3整数类型,5.2.3.1概述,第7 / -1993号,3.1.2整数类型,第7段(注释9.2参考文献在1992年的7.2中):
“这是一个错误”没有留下没有正确结果的余地 . 对于超过INTEGER'HIGH的“”运算结果,模拟应该有一个错误 . 测试声明为INTEGER类型的信号子类型的边界是错误的 .