&
在 IEEE 1800-2005 或更高版本中,二元运算符和二元运算符有什么区别&&
?它们是等价的吗?
我注意到这些覆盖点定义的行为与 a 和 b 的类型相同bit
:
cp: coverpoint a & b;
cp: coverpoint a && b;
&
在 IEEE 1800-2005 或更高版本中,二元运算符和二元运算符有什么区别&&
?它们是等价的吗?
我注意到这些覆盖点定义的行为与 a 和 b 的类型相同bit
:
cp: coverpoint a & b;
cp: coverpoint a && b;
&&是一个布尔运算符,我们称之为“逻辑与”。这并不意味着它必须对布尔操作数进行操作,而是它的返回类型是布尔值。在 SV 中,布尔值意味着:
1'b1 \\ true
1'b0 \\ false
1'bx \\ undef
当逻辑 AND 对单个操作数进行运算时,结果是显而易见的,但是当它对向量进行运算时就会出现问题。例如:
logic [1:0] vector;
...
vector = 2'b10;
if (1'b1 && vector) ...
为了这个逻辑运算的目的,向量被测试是否等于 0。如果是,那么它的布尔值被定义为“假”,否则被定义为“真”。在上面的例子中,结果是“真”。
&是按位 AND 和归约 AND 运算符。是按位执行还是归约执行取决于上下文:
logic [1:0] vector1;
logic [1:0] vector2;
logic [1:0] vector3;
...
vector1 = 2'b10;
vector2 = 2'b01;
...
vector3 = vector2 & vector1; // bitwise; vector3 = 2'b00
if ( (&vector1) || (&vector2) ) ... // reduction; the result of each reduction is 1'b0
位运算符对每对相应的操作数位执行逻辑与运算。结果是一个宽度等于操作数最大宽度的向量。
归约运算符在单个向量的所有位之间执行逻辑与运算。结果是一个布尔值。
注意:在单个位操作数上执行时,位运算符和逻辑运算符的结果是相同的。但是,即使其中一个操作数是向量,结果也可能不同。
&& 是逻辑与。它接受两个布尔值并返回布尔值。
& 是按位与。它接受两个数字并返回一个数字。
在上面的示例中,如果 a 和 b 都被打包,则行为会有所不同bit [1:0]
。