否则正文正在系统Verilog中执行



我正在使用以下代码在System Verilog中处理一个模块:

module my_module (input             [7:0] rd_i // rd_i = 00001001
                 ,input             [7:0] rs_i // rs_i = 10010010
                 ,output logic  [7:0] result_o // result_o = 00001010
);
    always_comb
        if ((rd_i << 4) & 8'hF0 == rs_i & 8'hF0) begin
            result_o = 'b0101;
        end
        else begin
            result_o = 'b1010;
        end
endmodule
module my_module_tb();
    logic [7:0] rd_i = 'b00001001;
    logic [7:0] rs_i = 'b10010010;
    logic [7:0] result_o;
    my_module uut (
        .rd_i(rd_i),
        .rs_i(rs_i),
        .result_o(result_o)
    );
endmodule

似乎我应该期望 result_o = 5,但它等于 10。 我不明白为什么我的 if 条件评估为错误。

问题是运算符优先级。IEEE Std 1800-2012 第 11.3.2 节运算符优先级显示==运算符的优先级高于二进制运算符&运算符。 这意味着您的代码的行为类似于以下内容,并添加了括号:

    if ((rd_i << 4) & (8'hF0 == rs_i) & 8'hF0) begin

因为rs_i不等于8'hF0if子句是假的。

若要获取所需的行为,请添加括号,如下所示:

    if ( ((rd_i << 4) & 8'hF0) == (rs_i & 8'hF0) ) begin

最新更新