【问题标题】:How to get rid of illegal operand error in always_comb block when used "==" operator in SystemVerilog在 SystemVerilog 中使用“==”运算符时如何消除 always_comb 块中的非法操作数错误
【发布时间】:2021-12-26 14:10:15
【问题描述】:

我不断收到错误 下面代码块中运算符“==”的非法操作数

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 与硬编码指令类型进行比较。但我不断收到“==”错误的非法操作数。

"==" 是逻辑比较运算符,为什么不比较呢?

我怎样才能摆脱这个?

【问题讨论】:

    标签: system-verilog


    【解决方案1】:

    在您的代码中,oppCode解包 (logic oppCode[2:0])。

    您无法将未打包的值与打包的值 (3'b010) 进行比较。

    要么使oppCode 打包logic [2:0] oppCode,要么添加一个中间信号来将解压的oppCode 转换为带有always_comb 和for 循环的打包版本,或者只是手动。

    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

    忠告:当您声明一个解压信号时,请使用您想要的位数/元素数:logic oppCode[3]。这更容易听懂,你不太可能混淆他们。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-19
      • 2020-07-05
      • 2020-12-10
      • 1970-01-01
      • 2016-07-08
      • 1970-01-01
      • 1970-01-01
      • 2015-01-17
      相关资源
      最近更新 更多