Ошибка компиляции Verilog: неожиданное '[', ожидание "IDENTIFIER" или "TYPE_IDENTIFIER" или "#" или "(" - PullRequest
0 голосов
/ 23 января 2012

Я хочу разработать простой множитель с генерацией конструкции и двумерной памятью.Но я не могу скомпилировать следующий код verilog.Может ли кто-нибудь дать намек, пожалуйста?

module classic_multiplier(
    a, b,
    a_by_b);
parameter M = 2;

input [M-1:0] a, b;
output reg [M-1:0] a_by_b [0:2*M-2];

//the first and
genvar i, k;
generate 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
end
endgenerate
endmodule      

Ответы [ 2 ]

1 голос
/ 23 января 2012

Кажется, проблема в том, что у вас есть 2D выходной порт (a_by_b).Я не совсем уверен, зачем вам это нужно для множителя, размер выходного порта должен быть 2*M, поэтому:

output reg [(2*M-1):0] a_by_b;

Кроме того, нет необходимости в begin после generate (и, следовательно, нет необходимости ни в совпадении end), но, ладно, здесь не проблема, вы можете добавить их, если хотите.

Далее, для циклов внутри блока generateнеобходимо назвать, например:

generate
  for(k = 0; k <= M-1; k=k+1) begin : for_outer
    for(i = 0; i <= k; i=i+1) begin : for_inner
      a_by_b[k][i] = a[i] & b[k-i];
    end
  end
endgenerate

Конечно, вам нужно будет изменить код внутри циклов for, если вы измените определение a_by_b.

0 голосов
/ 10 января 2013

Когда инструмент видит 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
...