module display_cmds;
reg a;
initial $monitor("\$ monitor: a = %b", a);
initial begin
$strobe ("\$ strobe : a = %b", a);
a = 0;
a <= 1;
$display ("\$ display: a = %b", a);
#1 $finish;
end
endmodule
误解1:使用 d i s p l a y 命令不能用来显示非阻塞语句的赋值;事实:非阻塞语句的赋值在所有的 display命令不能用来显示非阻塞语句的赋值; 事实:非阻塞语句的赋值在所有的 display命令不能用来显示非阻塞语句的赋值;事实:非阻塞语句的赋值在所有的display命令执行后才更新数值。
对上述语句的解释:
以上3条语句是非阻塞赋值和 d i s p l a y 模块的仿真结果,这说明 display模块的仿真结果,这说明 display模块的仿真结果,这说明display命令的执行是安排在活动事件队列中,但排在非阻塞赋值数据更新事件之前。
注意事项:
$display,在仿真期间会自动执行,但在综合到实际硬件时可能会被忽略,因此请仅将其用于仿真和调试目的。
// #0延时赋值
module nb_schedule;
reg a, b;
initial begin
a = 0;
b = 1;
a <= b;
b <= a;
$monitor("%0dns: \ $ monitor: a = %b, b = %b", $stime, a, b);
$display("%0dns: \ $ display: a = %b, b = %b", $stime, a, b);
$strobe ("%0dns: \ $ strobe: a = %b, b = %b\n", $stime, a, b);
#0 $display("%0dns: #0: a = %b, b = %b", $stime, a, b);
#1 $monitor("%0dns: \ $ monitor: a = %b, b = %b", $stime, a, b);
$display("%0dns: \ $ display: a = %b, b = %b", $stime, a, b);
$strobe ("%0dns: \ $ strobe : a = %b, b = %b\n", $stime, a, b);
$display("%0dns: #0: a = %b, b = %b", $stime, a, b);
#200 $finish;
end
endmodule
以上8条语句是#0
延时赋值模块的仿真结果,这说明#0
延时命令在非阻塞赋值事件发生前,在停止运行事件队列中执行。
#0
延时赋值建议遵循以下的原则7:
原则7 用$strobe系统任务来显示,应该用非阻塞赋值的变量值。
误解2:#0延时把赋值强制到仿真时间步的末尾;
事实是:#0延时将赋值事件强制加入停止运行事件队列中。