在 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]。这更容易混淆,你也不太可能混淆它们。