Verilog 单(&;)和双(&;)安培和二进制运算符之间有什么区别?

Verilog 单(&;)和双(&;)安培和二进制运算符之间有什么区别?,verilog,system-verilog,Verilog,System Verilog,在IEEE 1800-2005或更高版本中,&和&二进制运算符之间有什么区别?它们相等吗 我注意到,当a和b的类型为bit时,这些覆盖点定义的行为相同: cp:coverpointa&b cp:coverpointa&b &&是逻辑的和。它接受两个布尔值并返回布尔值 &是按位和。它接受两个数字并返回一个数字 在上面的示例中,如果a和b都是压缩的位[1:0]&&的布尔运算符,则行为会有所不同,我们称之为“逻辑and”。这并不意味着它必须对布尔操作数进行操作,但它的返回类型是布尔。 在SV中,布尔

在IEEE 1800-2005或更高版本中,
&
&
二进制运算符之间有什么区别?它们相等吗

我注意到,当a和b的类型为
bit
时,这些覆盖点定义的行为相同:

  • cp:coverpointa&b
  • cp:coverpointa&b

&&是逻辑的和。它接受两个布尔值并返回布尔值

&是按位和。它接受两个数字并返回一个数字


在上面的示例中,如果a和b都是压缩的
位[1:0]
&&的布尔运算符,则行为会有所不同,我们称之为“逻辑and”。这并不意味着它必须对布尔操作数进行操作,但它的返回类型是布尔。 在SV中,布尔表示:

1'b1 \\ true
1'b0 \\ false
1'bx \\ undef
当逻辑AND对单位操作数进行运算时,结果是显而易见的,但当它对向量进行运算时,问题就出现了。例如:

logic [1:0] vector;
...
vector = 2'b10;
if (1'b1 && vector) ...
为了进行此逻辑运算,测试向量是否等于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
逐位运算符对操作数的每对对应位执行逻辑“与”运算。结果是一个向量,其宽度等于操作数的最大宽度

归约运算符在单个向量的所有位之间执行逻辑“与”运算。结果是一个单位布尔值


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

这不太正确。在Verilog中,如果向量(或任何其他)对象为非零且已知,则该对象为“真”——换句话说,它不包含x/z元值。所以,它不是“测试0的相等性”@VL:尽量不要把Verilog和SV问题结合起来——它们是不同的语言。你不会在C++组中问C问题,反之亦然。@ EML,我提到逻辑运算有“unDEF”结果,但我不想解释,因为它不是问题的关键。无论如何,我确实认为它的工作方式是测试是否等于0,否则赋值为“true”。很明显,如果向量包含X或Z,逻辑运算的结果是不可靠的(除非使用特殊运算符)。顺便说一句,我不知道Verilog和SV之间这些操作符的行为有什么不同。它们是什么?在Verilog中没有“真”的实际定义(不知道SV)
if(2'b0x)
采用假路径,而
if(2'b1x)
采用真路径。关键是对向量操作数进行约化或运算,并查看得到的1位值在相同情况下的作用。因此,您的
(1'b1&&vector)
示例相当于
(1'b1&(| vector))
。如果你这样看的话,你会发现
vector
没有被测试为等于0
(1'b1和&2'b0x)
返回
1'bx
,而
(1'b1和&2'b1x)
返回
1'b1
。在这两种情况下,向量都是非零的,但结果不同。更进一步地说,在上面的IMO中,“tested for equality to 0”将是一种更符合逻辑的方法,并且是两态逻辑的更好扩展,但Verilog不是这样做的。我不知道SV发生了什么变化,但它仍然是一种不同的语言。@EML“真的没有定义”。Hmmm,IEEE 1364-2005第5.1.9节“逻辑运算符”:“逻辑比较的评估结果应为1(定义为真)、0(定义为假)”