序列中的Verilog阻塞和非阻塞

序列中的Verilog阻塞和非阻塞,verilog,blocking,nonblocking,Verilog,Blocking,Nonblocking,我在Verilog中有以下内容: reg a; always @ (clk) begin a = 0; a <= 1; $display(a); end reg a; 始终@(clk) 开始 a=0; 如IEEE 1364-1995§5.3、IEEE 1364-2001§5.3和IEEE 1364-2005§11.3所述,Verilog模拟在5个队列中进行: 活动事件(在#0之前) 评估所有非阻塞分配的RHS 评估RHS并更改所有阻塞分配的LHS 评估RHS并更改所有连

我在Verilog中有以下内容:

reg a;

always @ (clk)
begin
  a = 0;
  a <= 1;
  $display(a);
end
reg a;
始终@(clk)
开始
a=0;

如IEEE 1364-1995§5.3、IEEE 1364-2001§5.3和IEEE 1364-2005§11.3所述,Verilog模拟在5个队列中进行:

  • 活动事件(在
    #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
    • 用原因调用PLI进行同步(IEEE 1364-2005中已弃用)
  • 未来
    • 在未来某个模拟时间发生的事件

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

你试过模拟吗?可能是@Qiu的复制品,这不是那个的复制品。这很接近,但我想看到其他人的答案关于Verilog模拟器中的调度语义,我知道以下几点:事件被调度执行的顺序如下:1-活动事件,如阻塞分配和非阻塞分配的RHS计算。2-非活动分配,3-非阻塞分配更新。对于上面的例子,我相信$display可能会显示0或1,这取决于display的执行时间。@Ari,你能推荐一个好的Mac模拟器供我免费使用吗?你的(好的)问题有一个简单的答案,但你发布的代码显然从未接近过模拟器。如果你先把它修好,你就更有可能得到答案。