序列中的Verilog阻塞和非阻塞

时间:2014-05-11 03:33:06

标签: verilog blocking nonblocking

我在Verilog中有以下内容:

reg a;

always @ (clk)
begin
  a = 0;
  a <= 1;
  $display(a);
end

字面'a'的价值会告诉我什么?是0还是1?

1 个答案:

答案 0 :(得分:3)

Verilog仿真发生在5个队列中,如IEEE1364-1995§5.3,IEEE1364-2001§5.3和IEEE1364-2005§11.3中所述:

  • 活动事件 #0之前)
    • 评估所有非阻止作业的RHS
    • 评估RHS并更改所有阻止分配的LHS
    • 评估RHS并更改所有连续作业的LHS
    • 评估输入并更改所有原语的输出
    • 评估并打印$display$write
    • 的输出
  • 非活动事件 (在#0之后)
    • #0延迟后评估RHS,其他过程与 活动事件
    • 相同
    • 使用PLI例程安排的回调程序,例如tf_synchronize() (在IEEE 1364-2005中弃用)vpi_register_cb(cbReadWriteSynch)
  • NBA更新
    • 更改所有非阻止作业的LHS
  • 监控活动
    • 评估并打印$monitor$strobe
    • 的输出
    • 使用reason_rosynchronize 调用PLI(IEEE 1364-2005中弃用)
  • 将来
    • 将来某个模拟时间发生的事件

由于$display在分配非阻塞分配之前发生,因此该值将为0.请注意,每个队列中的执行顺序可能会发生变化。