在编写通用模块时,我经常遇到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];
这种情况有补救办法吗?
答案 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