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

SystemVerilog中@(a or b)与@(a || b)的差异及问题解析

Verilog中@(a or b)与@(a || b)的行为差异解析

这两种写法的本质是Verilog事件控制的两种不同构造,行为差异完全源于它们的设计意图:

1. @(a or b):敏感列表触发

这里的or是Verilog敏感列表的专用语法,它的作用是监听列表中任意信号的数值变化——只要a或者b的数值发生改变(不管变化前后的逻辑真假),就会触发后续的代码执行。

你的测试代码如下:

module wait_test;
  int a, b;
  initial
    begin
      #10 a += 10;
      #10 b += 10;
      #10 a += 10;
      #10 b += 10;
    end
   initial
     forever
       begin
         @(a or b)
         $display($time,"\ta = %0d,b = %0d", a, b);
       end
endmodule

执行后输出四次结果,对应每次信号变化:

10 a = 10,b = 0
 20 a = 10,b = 10
 30 a = 20,b = 10
 40 a = 20,b = 20

2. @(a || b):逻辑表达式值变化触发

这里的||是逻辑或运算符,构造的是一个逻辑表达式,事件触发的条件是这个表达式的结果发生变化。

Verilog中逻辑判断遵循“非0为真,0为假”的规则:

  • 初始状态a=0、b=0,a||b结果为0(假)
  • #10时a=10,a||b结果变为1(真)——表达式值从0变1,触发事件,输出第一次结果
  • 后续不管a变成20,还是b变成10、20,a||b的结果始终是1(真),没有发生变化,所以不会再触发事件,仅输出一次:
10 a = 10,b = 0

简单来说,@(a or b)盯的是信号本身的数值变化,@(a || b)盯的是逻辑表达式的结果变化,这就是两者行为差异的核心原因。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 22:45:14