1

verilog中的$display vs $strobe vs $monitor有什么区别?每个在事件队列中的时间都适用,语句如何交互?任何陈述都可以抑制另一个陈述吗?

4

2 回答 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 回答