在 SystemVerilog 中使用“==”运算符时如何消除 always_comb 块中的非法操作数错误
How to get rid of illegal operand error in always_comb block when used "==" operator in SystemVerilog
我一直收到错误
以下代码块中运算符“==”的非法操作数
module ALU(input logic oppCode[2:0], input logic [3:0] rf1, input logic [3:0] rf2
,output logic [3:0] result, output logic EQ );
always_comb begin
if(oppCode == 3'b010) begin // Problem
result <= rf1 - rf2;
end
else if(oppCode == 3'b101) begin // Problem
result <= rf1 + rf2;
end
else if(oppCode == 3'b111) begin // Problem
EQ <= (rf1 == rf2);
end
end
endmodule
我想在这里做的是将 oppCode
与硬编码指令类型进行比较。但我不断收到“==”错误的非法操作数。
“==”是逻辑比较运算符,为什么不比较?
我怎样才能摆脱这个?
在您的代码中,oppCode
被 解包 (logic oppCode[2:0]
)。
您不能将未打包的值与打包的值进行比较 (3'b010
)。
使 oppCode
打包 logic [2:0] oppCode
或添加中间信号以使用 always_comb
和 for 循环或仅手动将未打包的 oppCode 转换为打包版本。
logic [2:0] oppCode_packed;
always_comb begin
for (int i=0; i<3; i++) begin
oppCode_packed[i] = oppCode[i];
end
end
然后在比较中使用 oppCode_packed
。
一条建议: 当你声明一个未打包的信号时,使用你想要的 bits/elements 的数量:logic oppCode[3]
。这更容易混淆,你也不太可能混淆它们。
我一直收到错误 以下代码块中运算符“==”的非法操作数
module ALU(input logic oppCode[2:0], input logic [3:0] rf1, input logic [3:0] rf2
,output logic [3:0] result, output logic EQ );
always_comb begin
if(oppCode == 3'b010) begin // Problem
result <= rf1 - rf2;
end
else if(oppCode == 3'b101) begin // Problem
result <= rf1 + rf2;
end
else if(oppCode == 3'b111) begin // Problem
EQ <= (rf1 == rf2);
end
end
endmodule
我想在这里做的是将 oppCode
与硬编码指令类型进行比较。但我不断收到“==”错误的非法操作数。
“==”是逻辑比较运算符,为什么不比较?
我怎样才能摆脱这个?
在您的代码中,oppCode
被 解包 (logic oppCode[2:0]
)。
您不能将未打包的值与打包的值进行比较 (3'b010
)。
使 oppCode
打包 logic [2:0] oppCode
或添加中间信号以使用 always_comb
和 for 循环或仅手动将未打包的 oppCode 转换为打包版本。
logic [2:0] oppCode_packed;
always_comb begin
for (int i=0; i<3; i++) begin
oppCode_packed[i] = oppCode[i];
end
end
然后在比较中使用 oppCode_packed
。
一条建议: 当你声明一个未打包的信号时,使用你想要的 bits/elements 的数量:logic oppCode[3]
。这更容易混淆,你也不太可能混淆它们。