【发布时间】:2013-06-26 18:23:52
【问题描述】:
在 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。如果是,那么它的布尔值被定义为“假”,否则为“真”。在上面的例子中,结果是“真”。
& 是按位与和归约与运算符。是按位执行还是归约执行由上下文决定:
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
位运算符对每对对应的操作数位执行逻辑与运算。结果是一个宽度等于操作数最大宽度的向量。
归约运算符在单个向量的所有位之间执行逻辑与运算。结果是一个布尔值。
注意:在单个位操作数上执行时,位运算符和逻辑运算符的结果是相同的。但是,即使其中一个操作数是向量,结果也可能不同。
【讨论】:
if(2'b0x) 采用假路径,if(2'b1x) 采用真路径。关键是对向量操作数进行归约 OR 并查看生成的 1 位值在相同情况下会做什么。因此,您的(1'b1 && vector) 示例等同于(1'b1 & (|vector))。如果你这样看,你会发现vector 没有被测试等于0。(1'b1 && 2'b0x) 返回1'bx,而(1'b1 && 2'b1x) 返回1'b1。在这两种情况下,向量都是非零的,但结果不同。
&& 是逻辑与。它接受两个布尔值并返回布尔值。
& 是按位与。它接受两个数字并返回一个数字。
在上面的示例中,如果 a 和 b 都打包 bit [1:0],则行为会有所不同。
【讨论】: