Когда инструмент видит a_by_b[k][i] = a[i] & b[k-i];
, он гарантирует, что a_bay_b является модулем. Добавьте к строке assign
или always @*
, и инструмент примет код подтверждения.
Генерирующие блоки расширяют код во время компиляции. С данным кодом:
genvar i, k;
generate
for(k = 0; k <= M-1; k=k+1) begin
for(i = 0; i <= k; i=i+1) begin
a_by_b[k][i] = a[i] & b[k-i]; // Error will happen here
end
end
endgenerate
Расширится до:
a_by_b[0][0] = a[0] & b[0-0]; // * Compile Error *
a_by_b[1][0] = a[0] & b[1-0]; // ** Assignment without assign, always @*
a_by_b[1][1] = a[1] & b[1-1]; // ** block statement (e.g. always,initial)
Правильный код с assign
:
genvar i, k;
generate
for(k = 0; k <= M-1; k=k+1) begin
for(i = 0; i <= k; i=i+1) begin
assign a_by_b[k][i] = a[i] & b[k-i];
end
end
endgenerate
Оценит:
assign a_by_b[0][0] = a[0] & b[0-0];
assign a_by_b[1][0] = a[0] & b[1-0];
assign a_by_b[1][1] = a[1] & b[1-1];
Или с always @*
:
genvar i, k;
generate
for(k = 0; k <= M-1; k=k+1) begin
for(i = 0; i <= k; i=i+1) begin
always @* a_by_b[k][i] = a[i] & b[k-i];
end
end
endgenerate
Будет оцениваться до:
always @* a_by_b[0][0] = a[0] & b[0-0];
always @* a_by_b[1][0] = a[0] & b[1-0];
always @* a_by_b[1][1] = a[1] & b[1-1];
В качестве альтернативы можно использовать один блок всегда без блока генерации:
integer i,k;
always @* begin
for(k = 0; k <= M-1; k=k+1) begin
for(i = 0; i <= k; i=i+1) begin
a_by_b[k][i] = a[i] & b[k-i];
end
end