verilog中的$display vs $strobe vs $monitor有什么区别?每个在事件队列中的时间都适用,语句如何交互?任何陈述都可以抑制另一个陈述吗?
问问题
34950 次
2 回答
10
我会很好地总结一下LRM(语言参考手册),但你应该阅读它。一切都在IEEE Std 1800-2012 § 21.2显示系统任务(技术上 SystemVerilog,但这些功能是相同的。)
$display
: 打印立即数- § 21.2.1显示和写入任务
$strobe
:打印当前时间步结束时的值- § 21.2.2频闪监控
$monitor
:如果有任何值更改,则在当前时间步的末尾打印值。$monitor
只能调用一次;顺序调用将覆盖前一个。- § 21.2.3持续监测
$write
: 与换行符 ( ) 相同$display
但不终止\n
- § 21.2.1显示和写入任务
例子:
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
输出:(请注意打印顺序,并且该监视器在时间 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
于 2015-09-29T21:59:35.627 回答
4
Verilog/SystemVerilog 包含一个组织良好的事件队列。每个时间戳中的所有语句都根据该队列执行。
- $display 在ACTIVE 区域执行,所以如果有任何非阻塞赋值(在 INACTIVE 区域执行),它不会被 $display 显示。
- $write 也在ACTIVE region中执行,但需要显式调用换行符 (\n) 才能插入另一行。当您想使用 for 循环显示多维数组时,通常使用此系统任务。
- $strobe 在MONITOR/POSTPONE region执行,即在时间戳结束时。因此更新的值由 $strobe 显示。
- 每次其显示参数之一更改时,$monitor 都会显示。每个模拟只使用一个 $monitor。
看看这张图片:VERILOG EVENT REGIONS
示例代码位于:显示/频闪/监视器
希望这段代码清楚。
于 2015-09-30T04:54:17.790 回答