You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于$strobe与$display对同一目标输出差异的技术问询

Verilog中$display与$strobe的输出差异解析

测试案例

module n;
reg [1:0]a, b;
initial begin
    a=1;
    a<=a+1;
    $strobe("strobe",a);
    $display("display",a);
end
endmodule

输出结果

display  1
strobe   2

参考说明

Then, still at time=0, you increment a by 1 with a<=a+1. This means a becomes 2 at time=0.

技术疑问解答

1. 既然a在time=0时变为2,为何$strobe与$display输出不同结果?

核心原因是Verilog事件队列的执行逻辑:

  • a=1是阻塞赋值,执行后立即将a的值更新为1;
  • a<=a+1是非阻塞赋值,它不会立即修改a,而是把赋值操作放入非阻塞赋值队列,要等当前时间步的所有阻塞操作完成后才执行;
  • $display是立即执行类系统任务,调用时直接读取a的即时值(也就是阻塞赋值后的1);
  • $strobe是** strobe类系统任务**,会在当前时间步所有赋值操作(包括非阻塞赋值)完成后,再读取变量值,此时a已经被更新为2,所以输出结果不同。

2. 在begin end块中,为何$display的输出早于$strobe?

这是由Verilog事件队列的执行优先级决定的,同一时间步内的执行顺序大致为:

  1. 执行当前的阻塞赋值和立即系统任务(如$display);
  2. 执行非阻塞赋值队列中的操作;
  3. 执行strobe类系统任务(如$strobe)。

所以即便代码里$strobe写在$display前面,实际执行时$display会先触发输出,等所有赋值操作完成后$strobe才执行,最终呈现出$display结果在前的现象。

内容的提问来源于stack exchange,提问作者kittygirl

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 19:33:13