$display vs $strobe vs $monitor in verilog?

bli*_*itz 1 verilog register-transfer-level vlsi

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

Gre*_*reg 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
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