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
相关产品推荐
相关产品推荐

