signal a:bit:='1'; signal b:bit:='0'; signal c:bit:='0';
begin
process
variable d:bit:='0';
begin
if (a='1')or(b='0') then a <= inertial not d after 1ns;
else a<=inertial not c after 1.5ns;
end if;
d := a and b;
b <= inertial (b)nand(a or d) after 1ns;
wait on a,b,c;end process;
c <= a and b after 1ns;
end Behavioral;
如果a和b同时改变它们的值,前者为2ns
,会发生什么这个过程会触发2次吗?
如果确实如此,那么应该将哪些值用于a,b,如果我们要通过a事件的过程,那么b信号是在那时改变了,还是当b再次运行时它会被改变?
1ns后声明c&lt; = a和b;在这个过程之外,它如何与之相关?如果之后没有,它将只是一个AND单位,没有延迟。
答案 0 :(得分:2)
wait on a,b,c;
在delta周期期间等待其中一个信号进行事务处理。
如果发生了两个或全部&#34;激活&#34;,它对模拟器没有任何影响,它仍然会退出等待。它赢了&#34;拯救&#34;来自当前delta周期的剩余信号的交易并将它们转发。
答案 1 :(得分:1)
我希望你理解这个过程不会正确合成!
对于触发一次或两次的过程,这将取决于a或b上的事件是否出现在相同的增量循环中。向流程添加Report语句并查找。
因为进程通过延迟语句驱动A和B,所以我希望两个赋值都在相同的delta周期内运行;时间步长的第一个增量,所以我希望它能被触发一次。
现在,如果您引入了一个新信号“e”并将其从过程中驱逐而不是“b”,并在过程外添加了信号赋值b <= e;
,那么您已将delta循环延迟引入“b”然后这个过程应该醒来两次。
语句c <= a and b after 1ns;
本质上是对a和b敏感的单独进程,因此它应该以相同的方式工作。
您可能会发现this answer有助于理解增量循环模型。