三元运算不适用于一元运算

问题描述 投票:0回答:1

我正在分享一个简单的 SystemVerilog 代码,其中三元运算由于归约或 ("|b") 运算而行为不当。我知道许多其他解决方法。我只是想知道幕后到底出了什么问题。

module tb();
  bit signed [0:3] a = 5;
  bit signed [0:3] b = -3;
  bit [0:1] op;
  
  bit signed [0:4] result;
  
  initial begin
    op = 0;
    result = 0;
    result = (op == 0)? a+b : (op == 1)? a-b: (op == 2)? ~a : |b;
    $display("%0p %0p %0p", result, a, b);
    
    op = 1;
    result = 0;
    result = (op == 0)? a+b : (op == 1)? a-b: (op == 2)? ~a : |b;
    $display("%0p %0p %0p", result, a, b);
    
    op = 2;
    result = 0;
    result = (op == 0)? a+b : (op == 1)? a-b: (op == 2)? ~a : |b;
    $display("%0b %0b %0p", result, a, b);
    
    op = 3;
    result = 0;
    result = (op == 0)? a+b : (op == 1)? a-b: (op == 2)? a : |b;
    $display("%0p %0p %0p", result, a, b);
  end

endmodule

我在这里分享代码。我确信一元运算是罪魁祸首。如果我只输入“b”而不是“|b”,它将按预期工作。

verilog system-verilog
1个回答
0
投票

请参阅 IEEE Std 1800-2023,第 11 节。运算符和表达式,尤其是以下部分:

  • 11.6 表达式位长度
  • 11.8 表达式评估规则

b
|b
之间的区别是位长度。
b
为 4 位,表达式
|b
为 1 位。

我知道许多其他解决方法。

包含多个三元运算符的复杂表达式难以理解和维护。 推荐的编码风格是使用

case
语句。

© www.soinside.com 2019 - 2024. All rights reserved.