本文介绍了了解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就有机会在进入下一场比赛之前执行。
initial
和CA是两个独立的进程,活动区域中语句之间的顺序是不确定的。因此,您是否看到y
的更新值的旧的未初始化值y
是争用条件。根据模拟器优化代码的方式,您将看到不同模拟器之间的差异。 这篇关于了解Verilog分层事件队列的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!