在IEEE 1800-2005或更高版本中,&
和&&
二元运算符之间有什么区别?它们是等价的吗?
我注意到这些封面定义的行为相同,其中a和b的类型为bit
:
cp: coverpoint a & b;
cp: coverpoint a && b;
答案 0 :(得分:8)
&& 是一个布尔运算符,我们将其称为“逻辑AND”。这并不意味着它必须对布尔操作数进行操作,但它的返回类型是布尔值。 在SV中,布尔表示:
1'b1 \\ true
1'b0 \\ false
1'bx \\ undef
当逻辑AND对单个位操作数进行操作时,结果很明显,但是当它在向量上运行时会出现问题。例如:
logic [1:0] vector;
...
vector = 2'b10;
if (1'b1 && vector) ...
为了这个逻辑操作的目的,向量被测试相等为0.如果是,那么它的布尔值被定义为“假”,否则被定义为“真”。在上面的例子中,结果是“true”。
& 是按位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
按位运算符对每对操作数的相应位执行逻辑AND运算。结果是一个向量,其宽度等于操作数的最大宽度。
Reducer运算符在单个向量的所有位之间执行逻辑AND运算。结果是一位布尔值。
注意:在单个位操作数上执行时,按位和逻辑运算符的结果是相同的。但是,即使其中一个操作数是向量,结果也可能不同。
答案 1 :(得分:0)
&安培;&安培;是合乎逻辑的。它接受两个布尔值并返回布尔值。
&安培;是按位AND。它接受两个数字并返回一个数字。
在上面的示例中,如果a和b都打包bit [1:0]
,行为会有所不同。