【问题标题】:What is the difference between single (&) and double (&&) ampersand binary operators?单 (&) 和双 (&&) 与符号二元运算符有什么区别?
【发布时间】:2013-06-26 18:23:52
【问题描述】:

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

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

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

【问题讨论】:

    标签: verilog system-verilog


    【解决方案1】:

    && 是一个布尔运算符,我们称之为“逻辑与”。这并不意味着它必须对布尔操作数进行操作,而是它的返回类型是布尔值。 在 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
    

    位运算符对每对对应的操作数位执行逻辑与运算。结果是一个宽度等于操作数最大宽度的向量。

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

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

    【讨论】:

    • 这不太正确。在 Verilog 中,如果一个向量(或任何其他)对象不为零,那么它就是“真”,并且它是已知的——换句话说,它不包含 x/z 元值。因此,它没有“测试是否等于 0”。 @VL:尽量不要将 Verilog 和 SV 问题结合起来——它们是不同的语言。你不会在 C++ 小组中问 C 问题,反之亦然。
    • @EML,我提到逻辑运算有“undef”的结果,但我不想解释,因为这不是问题的重点。无论如何,我确实认为它的工作方式是测试是否等于 0,否则分配“真”。很明显,如果向量包含 X 或 Z,则逻辑运算的结果是不可靠的(除非使用特殊运算符)。顺便说一句,我不知道 Verilog 和 SV 之间这些运算符的行为差异。它们是什么?
    • Verilog 中没有“真”的实际定义(不了解 SV)。 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。在这两种情况下,向量都是非零的,但结果不同。
    • 更上一层楼 - IMO,“测试是否等于 0”将是一种更合乎逻辑的方式,并且是对两态逻辑的更好扩展,但这不是 Verilog 的做法。我不知道 SV 发生了什么变化(如果有的话),但它仍然是一种不同的语言。
    • @EML“没有真正的定义”。嗯,IEEE 1364-2005 第 5.1.9 节“逻辑运算符”:“逻辑比较的评估结果应为 1(定义为真)、0(定义为假)......”
    【解决方案2】:

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

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

    在上面的示例中,如果 a 和 b 都打包 bit [1:0],则行为会有所不同。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-06-16
      • 1970-01-01
      • 2022-06-10
      • 1970-01-01
      • 2017-07-25
      • 2012-08-05
      相关资源
      最近更新 更多