我在其他地方读过这个语法j = j + 1
是不允许的,但是有可能在for循环的循环表达式之外增加变量吗?
这是我最初想做的事情。我不确定如何制作这个生成语句,所以我想,我想生成参数20, 21, 22, 23, 25, 28, 29, 31
的模块,同时使用来自使用0, 1, 2, 3, 4, 5, 6, 7
索引的2d参数数组的值。所以我想,我只想制作一个for循环,然后让第二个变量j
从0
开始,然后转到7
。我能这样做吗?如果没有,推荐什么?
genvar i;
integer j = 0;
generate
for (i = 20; i <= 31; i = i + 1) begin : NUM_OF_FF
if (i != 21 && i != 24 && i != 26 && i != 27 && i != 30) begin
lfsr
#(
.num_of_ff(i),
.poly(lsfr_taps[j])
)
random_data_gen_lsfr
(
.clk(sys_clk),
.rst(rst),
.out(lsfr_bits[i])
);
j = j + 1;
end
end
endgenerate
答案 0 :(得分:1)
你可以使用一个整数参数数组(在你的例子中,lsfr_taps可能类似吗?)
module lfsr#(int num_of_ff=1, int poly=1)();
initial $display("%m: %0d %0d", num_of_ff, poly);
endmodule
module simple;
parameter int index_list_size = 8;
parameter int index_list[index_list_size] = {20, 21, 22, 23, 25, 28, 29, 31};
for (genvar i=0; i<index_list_size; ++i) begin: NUM_OF_FF
lfsr#(.num_of_ff(i), .poly(index_list[i])) random_data_gen_lsfr();
end
endmodule
答案 1 :(得分:0)
您可以使用常量函数,并将poly参数转换为输入,而不是尝试在内部循环中递增第二个变量(j):
function [7:0] tap_number;
input [31:0] polynomial;
input [7:0] max_valid;
integer i;
begin
tap_number = 0;
for (i=0; i<max_valid; i=i+1)
begin
if (polynomial[i])
tap_number = tap_number + 1;
end
end
endfunction
wire [7:0] lfsr_taps;
assign lfsr_taps = tap_number (poly, i);
lfsr
#(
.num_of_ff(i),
)
random_data_gen_lsfr
(
.poly(lsfr_taps[j])
.clk(sys_clk),
.rst(rst),
.out(lsfr_bits[i])
);