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

Verilog 如何正确处理零位宽的情况?,verilog,system-verilog,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中提取最小宽度位。 当宽度为0时,输出为“不在乎”。 但是,当以宽度0实例化模块时,Modelsim

在编写泛型模块时,我经常遇到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中提取最小宽度位。 当宽度为0时,输出为“不在乎”。 但是,当以宽度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

我更喜欢在always_comb(无赋值)中处理它,但当y不关心时,第一种方法将不起作用。(x[0]变为y)虽然我给出了一个无关紧要的示例,但当宽度为0时,我的实际模块需要输出0。在这种情况下还有其他方法吗?哦,我错了,x[0]不进入y。虽然它看起来不“干净”,但它确实有效。谢谢。在我的第二个示例中,您可以将
分配
替换为
始终梳
。只要
if
保持在程序代码之外,它就成为
generate if
构造。