理解Verilog分层事件队列

理解Verilog分层事件队列,verilog,system-verilog,iverilog,Verilog,System Verilog,Iverilog,我试图理解Verilog调度算法是如何工作的。下面的示例输出0、xxxx和not1010。我不清楚为什么。如果我在$display之前加上延迟,它将输出1010 module test; reg [3:0] t_var; initial begin t_var <= 4'b1010; $display("%0t, %b", $realtime, t_var); end endmodule 根据示例,非阻塞分配和连续分配似乎都是两步过程,其中在当前时间步评估RH

我试图理解Verilog调度算法是如何工作的。下面的示例输出
0、xxxx
和not
1010
。我不清楚为什么。如果我在
$display
之前加上延迟,它将输出
1010

module test;
  reg [3:0] t_var;
  initial begin
    t_var <= 4'b1010;
    $display("%0t, %b", $realtime, t_var);
  end
endmodule
根据示例,非阻塞分配连续分配似乎都是两步过程,其中在当前时间步评估RHS,并计划在下一个时间步(如果未指定延迟)或稍后的时间步(如果指定延迟)发生LHS

请有人确认并向我解释以下算法的一步一步流程(来自Clifford Cummings),因为它适用于上述示例

谢谢


你说的没错,非阻塞分配(NBA)和连续分配(CA)就像两个步骤,因为它们是。问题是你所说的“下一步”并不是时间上的进步;它是while()循环的一次迭代,不需要提前时间。这通常被称为增量步长

当使用NBA时,LHS被安排为NBA更新事件,但紧接着,
$display
是下一个要执行的活动事件。它在NBA更新事件有机会执行之前打印y的值。一旦你引入延迟,NBA有机会在进入下一个比赛时间之前执行


当使用CA时,您正在创建一个单独的进程,该进程在RHS更改时激活,它将分配给同一活动区域中的LHS。
initial
和CA是两个独立的过程,活动区域中语句之间的顺序是不确定的。因此,您是否看到
y
的更新值的
y
的旧未初始化值是一个竞争条件。您将看到模拟器之间的差异,这取决于它们优化代码的方式。

您正确地说,非阻塞分配(NBA)和连续分配(CA)就像两步过程,因为它们是。问题是你所说的“下一步”并不是时间上的进步;它是while()循环的一次迭代,不需要提前时间。这通常被称为增量步长

当使用NBA时,LHS被安排为NBA更新事件,但紧接着,
$display
是下一个要执行的活动事件。它在NBA更新事件有机会执行之前打印y的值。一旦你引入延迟,NBA有机会在进入下一个比赛时间之前执行

当使用CA时,您正在创建一个单独的进程,该进程在RHS更改时激活,它将分配给同一活动区域中的LHS。
initial
和CA是两个独立的过程,活动区域中语句之间的顺序是不确定的。因此,您是否看到
y
的更新值的
y
的旧未初始化值是一个竞争条件。您将看到模拟器之间的差异,这取决于它们如何优化代码

module test;
  reg [3:0] t_var;
  wire [3:0] y;
  assign y = ~t_var;
  initial begin
    t_var = 4'b1010;
    $display("%0t, %b, %b", $realtime, t_var, y);
  end
endmodule