Verilog,generate/loop 带参数化数组声明
Verilog, generate/loop with parameterized array declaration
我试图在参数化数组中找到最大值,我正在查看这个 并遇到了 forloop-generate。我想做的唯一改变是将显式数组的方法更改为参数化数组,但我 运行 变成了 genvar
赋值问题。
reg [$clog2(LENGTH)-1:0] arr [0:LENGTH-1];
wire [$clog2(LENGTH)-1:0] value_l1[0:LENGTH-2];
wire [$clog2(LENGTH)-1:0] index_l1[0:LENGTH-2];
genvar gen_i, gen_j, gen_k;
generate
for(gen_i = 0; gen_i < LENGTH; gen_i = gen_i + 2) begin : loop1
Compare cmp1(.A(arr[i])
,.B(arr[i+1])
,.indexA(i)
,.indexB(i+1)
,.value(value_l1[i/2])
,.index(index_l1[i/2])
);
end
gen_k = 0;
for(gen_i = 1; gen_i < $clog2(LENGTH); gen_i = gen_i + 1) begin : loop2_1
for(gen_j = 0; gen_j < LENGTH / (2*gen_i); gen_j = gen_j + 2) begin : loop2_2
Compare cmp2(.A(value_l1[gen_k + gen_j])
,.B(value_l1[gen_k + gen_j+1])
,.indexA(index_l1[gen_k + gen_j])
,.indexB(index_l1[gen_k + gen_j+1])
,.value(value_l1[(LENGTH/(2*gen_i))+(gen_j/2)])
,.index(index_l1[(LENGTH/(2*gen_i))+(gen_j/2)])
);
end
//gen_k = gen_j; // <--------- problem here
end
endgenerate
我的方法是有一个被比较元素的列表,然后比较该列表并将结果写回同一个列表。例如:
original array : 0 1 2 3 4 5 6 7
结果会变成
compare array : 1 3 5 7 | 3 7 | 7
^ ^
| |
| largest element
|
gen_k + gen_j
然后输出 7
作为最大的元素,但我不能做 gen_k = gen_j
来保存索引(偏移到比较数组的第二部分)。甚至可以将 generate
与参数化数组一起使用吗?如果是这样,我该如何解决这个问题?
您可以使用中间参数执行此操作。
for(gen_i = 1; gen_i < $clog2(LENGTH); gen_i = gen_i + 1) begin : loop2_1
parameter param_k = LENGTH / (2*gen_i) + 1;
for(gen_j = 0; gen_j < LENGTH / (2*gen_i); gen_j = gen_j + 2) begin : loop2_2
Compare cmp2(.A(value_l1[param_k + gen_j])
,.B(value_l1[param_k + gen_j+1])
,.indexA(index_l1[param_k + gen_j])
,.indexB(index_l1[param_k + gen_j+1])
,.value(value_l1[(LENGTH/(2*gen_i))+(gen_j/2)])
,.index(value_l1[(LENGTH/(2*gen_i))+(gen_j/2)])
);
end
end
我试图在参数化数组中找到最大值,我正在查看这个 genvar
赋值问题。
reg [$clog2(LENGTH)-1:0] arr [0:LENGTH-1];
wire [$clog2(LENGTH)-1:0] value_l1[0:LENGTH-2];
wire [$clog2(LENGTH)-1:0] index_l1[0:LENGTH-2];
genvar gen_i, gen_j, gen_k;
generate
for(gen_i = 0; gen_i < LENGTH; gen_i = gen_i + 2) begin : loop1
Compare cmp1(.A(arr[i])
,.B(arr[i+1])
,.indexA(i)
,.indexB(i+1)
,.value(value_l1[i/2])
,.index(index_l1[i/2])
);
end
gen_k = 0;
for(gen_i = 1; gen_i < $clog2(LENGTH); gen_i = gen_i + 1) begin : loop2_1
for(gen_j = 0; gen_j < LENGTH / (2*gen_i); gen_j = gen_j + 2) begin : loop2_2
Compare cmp2(.A(value_l1[gen_k + gen_j])
,.B(value_l1[gen_k + gen_j+1])
,.indexA(index_l1[gen_k + gen_j])
,.indexB(index_l1[gen_k + gen_j+1])
,.value(value_l1[(LENGTH/(2*gen_i))+(gen_j/2)])
,.index(index_l1[(LENGTH/(2*gen_i))+(gen_j/2)])
);
end
//gen_k = gen_j; // <--------- problem here
end
endgenerate
我的方法是有一个被比较元素的列表,然后比较该列表并将结果写回同一个列表。例如:
original array : 0 1 2 3 4 5 6 7
结果会变成
compare array : 1 3 5 7 | 3 7 | 7
^ ^
| |
| largest element
|
gen_k + gen_j
然后输出 7
作为最大的元素,但我不能做 gen_k = gen_j
来保存索引(偏移到比较数组的第二部分)。甚至可以将 generate
与参数化数组一起使用吗?如果是这样,我该如何解决这个问题?
您可以使用中间参数执行此操作。
for(gen_i = 1; gen_i < $clog2(LENGTH); gen_i = gen_i + 1) begin : loop2_1
parameter param_k = LENGTH / (2*gen_i) + 1;
for(gen_j = 0; gen_j < LENGTH / (2*gen_i); gen_j = gen_j + 2) begin : loop2_2
Compare cmp2(.A(value_l1[param_k + gen_j])
,.B(value_l1[param_k + gen_j+1])
,.indexA(index_l1[param_k + gen_j])
,.indexB(index_l1[param_k + gen_j+1])
,.value(value_l1[(LENGTH/(2*gen_i))+(gen_j/2)])
,.index(value_l1[(LENGTH/(2*gen_i))+(gen_j/2)])
);
end
end