我正在分享一个简单的 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”,它将按预期工作。
请参阅 IEEE Std 1800-2023,第 11 节。运算符和表达式,尤其是以下部分:
b
和|b
之间的区别是位长度。 b
为 4 位,表达式 |b
为 1 位。
我知道许多其他解决方法。
包含多个三元运算符的复杂表达式难以理解和维护。 推荐的编码风格是使用
case
语句。