关于$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事件队列的执行优先级决定的,同一时间步内的执行顺序大致为:
- 执行当前的阻塞赋值和立即系统任务(如
$display); - 执行非阻塞赋值队列中的操作;
- 执行strobe类系统任务(如
$strobe)。
所以即便代码里$strobe写在$display前面,实际执行时$display会先触发输出,等所有赋值操作完成后$strobe才执行,最终呈现出$display结果在前的现象。
内容的提问来源于stack exchange,提问作者kittygirl
相关产品推荐
相关产品推荐

