在Verilog中,
#1 x = y;
#1; x = y;
是一样的吗?
也是
#1 x <= y;
#1; x <= y;
一样吗?
我找到了一个相关的链接How does #delay work for verilog non blocking statements?,我的问题将更清楚地解决这一困惑。
答案 0 :(得分:3)
#1 x = y;
表示等待一滴答,然后将y分配给x 。
#1; x = y;
表示等待一个刻度,然后什么也不做,然后将y分配给x 。这两个语句的行为相同。
#1 x <= y;
表示等待一个刻度,然后在 active 区域中采样y,然后在 NBA 区域中分配x。
#1; x <= y;
表示等待一滴答声,然后不执行任何操作,然后在 active 区域中采样y,然后在 NBA 区域中分配x。同样,两个语句的行为相同。
但是...
x = #1 y;
表示样本y,然后等待一个,然后在一个滴答声中将 active 区域中的x分配给x;在延迟结束之前,不要执行以下行。
x <= #1 y;
这意味着对y进行采样,然后立即执行以下行,但是将 NBA 地区的分配安排在将来的1滴答之内。这些语句的行为有所不同,整洁地说明了<=
被称为非阻塞分配的原因。
在这样的赋值运算符之后加上延迟称为内部赋值延迟。
答案 1 :(得分:0)
此处的延迟按以下方式工作。假设以下内容:
initial begin
#1 do-something;
#1 do-something;
end
do-something
语句被执行从延迟模型的角度来看,您使用哪种类型的语句都没有关系。在这两种情况下,该块的执行都将跨越2个滴答声。
但是,语句本身很重要。阻塞分配=
与非阻塞<=
不同。它们的行为不同,并且用于特定的单独目的。尽管在某些情况下它们的结果可能相同。
通常,阻塞分配总是在块中立即执行,无论是否保证在单个仿真刻度内的所有阻塞分配之后执行。