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

时间:2019-05-28 06:20:38

标签: verilog system-verilog

在编写通用模块时,我经常遇到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];

这种情况有补救办法吗?

1 个答案:

答案 0 :(得分:2)

即使从未使用具有错误范围的分支,您的过程代码也需要编译。

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