bli*_*itz 1 verilog register-transfer-level vlsi
verilog 中的$display与$strobe与$monitor 有什么区别?当在事件队列中时,每个都适用,语句如何交互?任何声明都可以抑制另一个声明吗?
Gre*_*reg 10
我会很好地总结LRM(语言参考手册),但您应该阅读它。一切都在IEEE Std 1800-2012 § 21.2显示系统任务中(技术上是 SystemVerilog,但这些功能是相同的。)
$display
: 打印立即数
$strobe
: 打印当前时间步长的值
$monitor
:如果有任何值更改,则在当前时间步长的末尾打印值。$monitor
只能调用一次;顺序调用将覆盖前一个。
$write
:$display
与换行符 ( \n
)
相同但不以换行符结尾例子:
reg [3:0] a,b;
integer i;
initial begin
$monitor("monitor a:%h b:%h @ %0t", a, b, $time);
for(i=0; i<4; i=i+1) begin
$strobe("strobe a:%h b:%h @ %0t", a, b, $time);
$display("display a:%h b:%h @ %0t", a, b, $time);
case(i)
0 : a = 4;
1 : b = 1;
2 : begin end // do nothing
3 : {a,b} = 9;
endcase
$display("display a:%h b:%h @ %0t", a, b, $time);
#1;
end
end
Run Code Online (Sandbox Code Playgroud)
输出:(请注意打印顺序并且该监视器在时间 2 时未显示)
显示 a:xb:x @ 0
显示 a:4 b:x @ 0
监视器 a:4 b:x @ 0
频闪 a:4 b:x @ 0
显示 a:4 b:x @ 1
显示 a:4 b: 1 @ 1
显示器 a:4 b:1 @ 1
频闪 a:4 b:1 @ 1
显示 a:4 b:1 @ 2
显示 a:4 b:1 @ 2
频闪 a:4 b:1 @ 2
显示 a :4 b:1 @ 3
显示器 a:0 b:9 @ 3
显示器 a:0 b:9 @ 3
频闪 a:0 b:9 @ 3