Verilog内部延迟,用于阻塞和非阻塞语句

时间:2019-02-19 01:14:47

标签: verilog

在Verilog中,

#1 x = y; 
#1; x = y;

是一样的吗?

也是

#1 x <= y; 
#1; x <= y; 

一样吗?

我找到了一个相关的链接How does #delay work for verilog non blocking statements?,我的问题将更清楚地解决这一困惑。

2 个答案:

答案 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
  1. 初始块开始
  2. 该块停止执行1滴答声
  3. do-something语句被执行
  4. 该块停止执行另一个滴答声。
  5. 下一条语句被执行。

从延迟模型的角度来看,您使用哪种类型的语句都没有关系。在这两种情况下,该块的执行都将跨越2个滴答声。

但是,语句本身很重要。阻塞分配=与非阻塞<=不同。它们的行为不同,并且用于特定的单独目的。尽管在某些情况下它们的结果可能相同。

通常,阻塞分配总是在块中立即执行,无论是否保证在单个仿真刻度内的所有阻塞分配之后执行