如何正确处理零位宽情况?
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
我在写泛型模块的时候经常遇到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