了解Verilog分层事件队列 [英] Understanding the Verilog Stratified Event Queue

查看:25
本文介绍了了解Verilog分层事件队列的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想了解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)的算法的逐步流程,因为它适用于上面的例子吗?

谢谢!

推荐答案

您说得对,非阻塞分配(Nba)和连续分配(CA)就像两步流程,因为它们确实是两步流程。问题是,您所说的"下一个时间步"并不是时间上的推进;它是没有推进时间的WHILE()循环的迭代。这通常称为增量步骤

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

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

这篇关于了解Verilog分层事件队列的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆