Verilog 如何正确处理零位宽的情况?
在编写泛型模块时,我经常遇到0位宽度的情况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
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
构造。