Не зная, что сказал вам Вивадо, я предполагаю, что ошибка может быть здесь:
[(i + cnt1)*5 +: 5]
cnt1 - это регистр, значение которого известно только во время выполнения, поэтому Vivado не может знать, какое значение использовать для разбиения вектора pi_values.
Вам понадобится что-то вроде этого:
localparam [0:24] pi_values = {5'h4, 5'h5, 5'h6, 5'h7, 5'h8};
reg [1:0] cnt1;//count CC times of GG coeffcient
always@(posedge clk or negedge rst) begin
if(rst == 0)
cnt1 <= 0;
else if(ena == 0)
cnt1 <= 0;
else
cnt1 <= cnt1 + 1;
end
reg [0:24] pi_values_rotated;
always @* begin
case (cnt1)
0: pi_values_rotated = pi_values;
1: pi_values_rotated = {pi_values[5:24], pi_values[0:4]};
2: pi_values_rotated = {pi_values[10:24], pi_values[0:9]};
3: pi_values_rotated = {pi_values[15:24], pi_values[0:14]};
default: pi_values_rotated = pi_values;
endcase
end
genvar i;
generate
for (i=0; i<2; i=i+1)
begin: mod1
module1 mod1(.clk(clk),
.rst(rst),
.multiplier(in[i]),
.multiplicand(pi_values_rotated[i*5 +: 5]),
.result(out[i]));
end
endgenerate
pi_values_rotated
будет вектором pi_values
, как видно после того, как текущее значение cnt1
будет применяется. Затем вы можете использовать i
в качестве единственного значения для генерации ваших экземпляров, которые должны быть приняты сейчас.