考虑下面的例子:
module test;
reg a;
initial begin
a = 1'b0;
a <= 1'b1;
$display(a);
end
endmodule
上面的例子显示为 0。我的原因是因为非阻塞赋值将在“分层事件队列”的第 3 步进行分配,而阻塞赋值和 $display 在第 1 步完成。如果我将示例修改为:
module test;
reg a;
initial begin
a = 1'b0;
a <= 1'b1;
$display(a);
$monitor(a);
end
endmodule
然后打印 0 和 1,因为我假设 $monitor 在事件队列(?)的第 4 步执行。但是,如果我进一步修改示例:
module test;
reg a;
initial begin
a = 1'b0;
a <= 1'b1;
$monitor(a);
$display(a);
end
endmodule
同样的输出是:0 和 1——这是我没想到的。我希望打印 1 和 1,因为 $monitor 将在事件队列的第 4 步进行评估,到那时,“a”已经是 1。之后我们有 $display,它应该打印 1。
我可以找到有关“当前模拟时间”和“分层事件队列”的参考资料,但我不确定它是如何工作的。
我很欣赏你的解释!谢谢