单(&)和双(&&)&符号二元运算符有什么区别?

Vic*_*sky 2 verilog system-verilog

在IEEE 1800-2005或更高版本中,&&&二元运算符有什么区别?它们是等价的吗?

我注意到这些封面定义的行为相同,其中a和b的类型是bit:

  • cp: coverpoint a & b;
  • cp: coverpoint a && b;

Vas*_*liy 10

&&是一个布尔运算符,我们称之为"逻辑AND".这并不意味着它必须对布尔操作数进行操作,但它的返回类型是布尔值.在SV中,布尔表示:

1'b1 \\ true
1'b0 \\ false
1'bx \\ undef
Run Code Online (Sandbox Code Playgroud)

当逻辑AND对单个位操作数进行操作时,结果很明显,但是当它在向量上运行时会出现问题.例如:

logic [1:0] vector;
...
vector = 2'b10;
if (1'b1 && vector) ...
Run Code Online (Sandbox Code Playgroud)

出于此逻辑操作的目的,向量的相等性测试为0.如果是,则将其布尔值定义为"false",否则定义为"true".在上面的例子中,结果是"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
Run Code Online (Sandbox Code Playgroud)

按位运算符对每对操作数的相应位执行逻辑AND运算.结果是一个向量,其宽度等于操作数的最大宽度.

简化运算符在单个向量的所有位之间执行逻辑AND运算.结果是一位布尔值.

注意:在单个位操作数上执行时,按位和逻辑运算符的结果是相同的.但是,即使其中一个操作数是向量,结果也可能不同.