如何正确处理零位宽情况?

How to properly handle zero bit width case?

我在写泛型模块的时候经常遇到0位宽的情况

module test #(
    parameter WIDTH
) (
    input logic [31 : 0] x,
    output logic [31 : 0] y
);
    always_comb begin
        y = x[WIDTH - 1 : 0];
    end
endmodule

例如,上面的模块从x中提取最低的WIDTH位。 当 WIDTH 为 0 时,输出无关。 但是,当使用 WIDTH 0 实例化模块时,我在 Modelsim 中收到以下错误:

# ** Fatal: (vsim-3373) test.sv(8): Range of part-select [-1:0] into 'x' [31:0] is reversed.

我尝试了以下代码,希望在编译时优化掉错误的部分,但错误仍然存​​在。

if (WIDTH == 0) y = 0;
else y = x[WIDTH - 1 : 0];

这种情况有什么补救办法吗?

您的程序代码需要编译,即使包含错误范围的分支从未被采用。

module test #(
    parameter WIDTH
) (
    input logic [31 : 0] x,
    output logic [31 : 0] y
);
    always_comb
       if (WIDTH == 0) y = 'x;
       else y = x[WIDTH - 1 + (WIDTH==0): 0];
endmodule

你也可以

module test #(
    parameter WIDTH
) (
    input logic [31 : 0] x,
    output logic [31 : 0] y
);
if (WIDTH==0)
  assign y = 'x;
else
  assign  y = x[WIDTH - 1: 0];
endmodule