【问题标题】:Understanding the Verilog Stratified Event Queue了解 Verilog 分层事件队列
【发布时间】:2019-10-19 20:33:25
【问题描述】:

我试图了解 Verilog 调度算法的工作原理。下面的示例输出 0, xxxx 而不是 1010。我不清楚为什么。如果我确实在$display 之前设置了延迟,它将输出1010

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

以下示例的输出相同,0, xxxx

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

根据示例,非阻塞分配连续分配似乎都是两步过程,其中 RHS 在当前时间步进行评估,LHS 是计划在下一个时间步(如果未指定延迟)或稍后的时间步(如果指定延迟)发生。

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

谢谢!

【问题讨论】:

    标签: verilog system-verilog iverilog


    【解决方案1】:

    您说非阻塞分配(NBA)和连续分配(CA)就像两步过程是正确的,因为它们是。问题是您所说的“下一个时间步”不是时间提前;它是 while() 循环的迭代,没有提前时间。这通常被称为delta-step

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-04-19
      • 1970-01-01
      • 2017-01-20
      • 2023-02-15
      • 1970-01-01
      • 2018-09-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多