always@(a)
begin
#1 t<=a;
#1 c<=t;
end我正在用下面的测试平台分析上面的verilog代码
a=0;
#5 a=1;
#5 a=0;
#5 a=1;
#5;下面是我的分析:从上面的测试平台上,我可以看出'a‘是一个时钟信号,它的长度为20 ns,关闭时间为5ns,两个respectively.At都是0 ns,'a’从X变为0。因此,块获取triggered.since的第一条语句在块内有1ns的内部延迟,等待1ns。当1ns编译器知道它是非阻塞语句后,就不会执行assignment.hence 'a‘值,它将作为临时的并行存储,执行第二个statement.since,第二个也有内部延迟,等待1ns。然后评估是done.since,两种评估都完成了,现在就会有作业了。
time a t c
0ns 0 x x
1ns 0 x x
2ns 0 x x
3ns 0 0 x
4ns 0 0 x这个分析正确吗?
发布于 2019-09-01 10:53:50
不,这不是发生的事情,非阻塞作业的工作方式与你描述的不同。
您是对的,非阻塞语句的实际分配将被推迟,“稍后”执行。但“晚些时候”是什么时候?
当没有更多突出的阻塞事件时,将处理‘no阻塞’事件。但在处理延迟之前。因此,一旦模拟器看到它必须处理您的#1,它首先处理所有非阻塞分配,然后才开始处理延迟。
这意味着即使在启动#1延迟之前,t就已经收到了a的值。
在Verilog标准中有一个完整的章节,它描述了应该按照什么顺序执行各种“操作”。
https://stackoverflow.com/questions/57744055
复制相似问题