Увеличение нескольких Genvars в Verilog генерировать заявление - PullRequest
10 голосов
/ 05 марта 2012

Я пытаюсь создать многоступенчатый компаратор в verilog, и я не могу понять, как увеличить несколько genvars в одном цикле генерации.Я пытаюсь следующее:

genvar i,j;
//Level 1
generate
  j=0;
  for (i=0;i<128;i=i+1)
  begin: level1Comp
    assign ci1[i] = minw(tc[j],tc[j+1]);
    j = j+2;
  end
endgenerate

И получаю следующую ошибку:

Error-[SE] Syntax error
  Following verilog source has syntax error :
  "encoder.v", 322: token is '='
    j=0;

Кто-нибудь знает, как увеличить несколько genvars в одном выражении выражения?Или хотя бы получить эквивалентную функциональность?

Ответы [ 2 ]

12 голосов
/ 06 марта 2012

Кто-нибудь знает, как увеличить несколько genvars в одном генерации утверждение?

Это недопустимо, поскольку цикл create for создает неявный оператор localparam для переменной цикла и разрабатывает элементы цикла на основе только этого localparam. Это означает, что любые элементы внутри цикла должны быть действительными вне цикла, если genvar был объявлен как localparam.

genvar i,j;
//Level 1
generate
  j=0;
  for (i=0;i<128;i=i+1)
  begin: level1Comp
    assign ci1[i] = minw(tc[j],tc[j+1]);
    j = j+2;
  end
endgenerate

становится

//Done for each value of i
genvar j;
localparam integer i = i_for_each_iteration;

j=0; //Not valid outside a procedural context so modelsim complains
assign ci1[i] = minw(tc[j],tc[j+1]);
j = j+2; //Also not valid outside a procedural context

В этом случае вы можете создать «постоянное» значение, зависящее от genvar, используя явный параметр внутри цикла.

genvar i;
//Level 1
generate
  for (i=0;i<128;i=i+1)
  begin: level1Comp
    localparam integer j = i*2;
    assign ci1[i] = minw(tc[j],tc[j+1]);
  end
endgenerate
5 голосов
/ 05 марта 2012

Предполагая, что ci1 имеет половину глубины tc, и вы хотите, скажем, ci1[0] = min(tc[0], tc[1]), ci[1] = min(tc[2], tc[3]) и т. Д., Должно работать следующее:

module st_genvar();

  int ci1 [0:127];
  int tc [0:255];

  function int minw(int i1, int i2);
      if(i1 < i2 )
        minw = i1;
      else
        minw = i2;
  endfunction

  genvar i;
  //Level 1
  generate
      for (i=0;i<128;i=i+1)
        begin: level1Comp
            assign ci1[i] = minw(tc[i*2],tc[i*2+1]);
        end
  endgenerate

endmodule
...