Как динамически генерировать имена экземпляров модулей в System Verilog? - PullRequest
0 голосов
/ 10 мая 2019

У меня есть несколько параметризованных Verilog, и мне нужно динамически генерировать имена модулей экземпляров, но я не знаю, как, в пределах самого Verilog (т.е. без создания сценария или аналогичного для создания плоского Verilog).

Немного фона, у меня есть большое количество модулей памяти в библиотеке памяти.Все они названы, примерно, MemModuleDepth_Width в широком диапазоне глубины и ширины.У меня есть параметризованный модуль, который хотел бы использовать воспоминания из этой библиотеки.Однако, чтобы сделать это, мне нужно динамически генерировать имена модулей, как показано ниже.

module fifo(in, out)
parameter width;
parameter depth;
...fifo stuff...
MemModule"depth"_"width" (read_address, read_data, etc.) <== where depth and width sweep in values
endmodule

Это не типичное использование чего-то вроде оператора generate, и, как я уже пробовал, также внеобласть определения макросов, поскольку макросы раскрываются до синтаксического анализа тела кода.Это не работает:

`define DATAMEM(depth, width) MemModule``depth``_``width``
...
generate
    genvar i;
    for(i = 1; i <= depth; i = i++) begin : depth
        genvar j;
        for(j = 1; j <= width 0; j = j++) begin : width
            `DATAMEM(i, j) dpRam
        end
    end
endgenerate

Этот код просто пытается создать экземпляр "MemModulei_j" вместо того, чтобы подставлять фактические числовые значения для i и j.

Любые подсказки относительно того, как можно сделатьэто?

1 Ответ

1 голос
/ 10 мая 2019

Вы не можете создать имя идентификатора, кроме как с помощью макросов.Как вы указали, это не будет работать для значений параметров.

Если у вас было управляемое количество фактических depth/width комбинаций, которые вы ожидаете использовать, вы можете создать дерево генерирования case / if

module MemModuleGeneric #(int depth, width) (...);
case (width)
  16: case (depth)
        16: MemModule16_16 M(read_address, read_data, etc.);
        24: MemModule16_24 M(read_address, read_data, etc.);
      endcase
  32: case (depth)
        16: MemModule32_16 M(read_address, read_data, etc.);
        24: MemModule32_24 M(read_address, read_data, etc.);
      endcase
endcase
endmodule
...