Можно ли условно сгенерировать для l oop в System Verilog? - PullRequest
0 голосов
/ 24 февраля 2020

В настоящее время, когда я пытаюсь условно сгенерировать a для l oop, я получаю ошибку компиляции, утверждающую, что я "Не могу вложить генерацию областей".

Пример того, что я пытаюсь сделать:

generate 
   if (x == 0) begin
      for (genvar i = 0; i < 16; i++) begin
          *some code here*
      end
   end
   else begin
      for (genvar k = 0; k < 16; k++) begin
          *some code here*
   end
endgenerate

Редактировать: Спасибо всем за ответы и помощь, но я обнаружил проблему. Спасибо, Грег, за то, что вы напомнили мне о невозможности использовать генерирование в другом генерировании.

Вот пример минимальной воспроизводимости, который вызывал у меня проблемы.

module test ();
  parameter x = 1;
  parameter y = 1;
  if (y == 1) begin
    generate 
     if (x == 1) begin
        for (genvar i = 0; i < 16; i++) begin
            test_inner test_inner1();
        end
     end
     else begin
        for (genvar k = 0; k < 16; k++) begin
            test_inner test_inner2();
        end
     end
    endgenerate
  end

endmodule

Как вы видите, у меня был условный оператор вложен в другой условный оператор. Поскольку я не использовал ключевое слово generate во внешнем условном выражении, я не осознавал, что оно считается генерацией в другом генераторе.

Чтобы решить эту проблему, я переместил генерацию во внешнее условное выражение, как таковое:

module test ();
  parameter x = 1;
  parameter y = 1;
  generate 
  if (y == 1) begin
     if (x == 1) begin
        for (genvar i = 0; i < 16; i++) begin
            test_inner test_inner1();
        end
     end
     else begin
        for (genvar k = 0; k < 16; k++) begin
            test_inner test_inner2();
        end
     end
  end
  endgenerate

endmodule

1 Ответ

1 голос
/ 25 февраля 2020

ключевое слово generate необязательно в системном verilog. Если используется, запускается новый блок генерации. Такие генерирующие блоки не могут быть вложенными.

Однако, если вы используете операторы generate if или for без ключевого слова generate, компилятор позаботится о правильных границах блока генерации для вас.

В вашем случае № 1 вам не хватает ключевого слова end, оно не может быть скомпилировано.

В вашем случае № 2 вы используете if (y == 1) begin, который запускает блок генерации. Затем вы используете ключевое слово generate внутри уже запущенного блока. Это делает их вложенными.

Случай № 3 - правильное использование блока генерации.

У вас нет случая # 4, но если вы просто избавитесь или оба generate и endgenerate, он должен работать так же, как # 3.

Это всегда хорошая идея назвать ваши сгенерированные блоки, чтобы управлять сгенерированными именами экземпляров. Как это:

module test ();
  parameter x = 1;
  parameter y = 1;
  if (y == 1) begin: y1
     if (x == 1) begin: x1
        for (genvar i = 0; i < 16; i++) begin: x1_loop
            test_inner test_inner1();
        end
     end
     else begin
        for (genvar k = 0; k < 16; k++) begin: x2_loop
            test_inner test_inner2();
        end
     end
  end 
endmodule
...