Имя модуля переменной системы Verilog - PullRequest
0 голосов
/ 07 мая 2020

Возможно ли иметь переменное имя модуля, которое затем могло быть выбрано каким-либо параметром? Я ищу синтаксис для if...else внутри определения макроса.

module test;

  `define NAME(x) if (x == 0) mod_e else mod_w
  generate
    for (genvar i = 0; i < 2; i++) begin
      `NAME(i) inst_name (.a(a),.b(b),...);
    end
  endgenerate

endmodule

Один из способов - сделать это, как показано ниже, но он требует подключения всех портов 2 раза, что неудобно для модулей с сотнями IOs и подвержены ошибкам.

module test;

  generate
    if (SOME_PARAM == 0) begin
      mod_e inst_name (.a(a),.b(b),...);
    end else begin
      mod_w inst_name (.a(a),.b(b),...);
    end
  endgenerate

endmodule

Ответы [ 2 ]

1 голос
/ 07 мая 2020

В качестве возможного решения ваших сотен портов проблем, предполагая, что все экземпляры имеют одинаковый набор портов, вы можете подойти к этой проблеме по-разному, определив макрос экземпляра:

`define INST(mod_name) mod_name inst_name(.a(a), .b(b), ...);

if(SOME_PARAM == 0)
   `INST(mod_e)
else
   `INST(mod_w)

0 голосов
/ 07 мая 2020

Вы не можете использовать макросы для отображения c экземпляра. Макросы раскрываются на этапе предварительной обработки перед синтаксическим анализом блока генерации.

Единственное, что приближается к этому, - это блок config, который позволяет вам выбрать модуль с тем же именем из другой библиотеки для конкретного экземпляра c. Но нет условных операторов.

...