我想在verilog中使用一个生成块来实现多路复用器,每个复用器都将genvar变量作为常量输入。仿真结果表明,该方法没有误差。但是,我想确保"i“被认为是9位常量。
genvar i;
generate
for (i=254; i>-1; i=i-1) begin : ripple
mux mux_0(.sel(in[i]), .input1(i), .input0(input_num[i+1]), .out(input_num[i]));
end
module mux(
input sel,
input [8:0] input0, input1,
output reg [8:0] out
);
always@(*) begin
out = 0;
if(sel)
out = input1;
else
out = input0;
end
endmodule
发布于 2022-05-20 04:12:36
正如其他提到的,genvar
被视为一个常量的32位有符号值.您可以选择一个genvar
的位范围,就像您可以为一个integer
选择一样。
在Verilog中,它应该是:(注意:i[8:0]+1'b1
将计算为10位值)
for (i=254; i>-1; i=i-1) begin : ripple
mux mux_0(.sel(in[i[8:0]]), .input1(i[8:0]), .input0(input_num[i[8:0]+1'b1]), .out(input_num[i[8:0]]));
end
如果您有SystemVerilog,可以使用:
for (i=254; i>-1; i=i-1) begin : ripple
mux mux_0(.sel(in[9'(i)]), .input1(9'(i)), .input0(input_num[9'(i+1)]), .out(input_num[9'(i)]));
end
发布于 2022-05-09 15:48:30
genvar
以常量integer
类型展开,这是一个32位有符号的值.这与您可以手动编写下面的内容一样。
mux ripple[254].mux_0(.sel(in[254]), .input1(254), .input0(input_num[255]), .out(input_num[254]));
mux ripple[253].mux_0(.sel(in[253]), .input1(253), .input0(input_num[254]), .out(input_num[253]));
...
mux ripple[ 0].mux_0(.sel(in[ 0]), .input1( 0), .input0(input_num[ 1]), .out(input_num[ 0]));
https://stackoverflow.com/questions/72169472
复制相似问题