如何在System Verilog中动态生成模块实例名称?

时间:2019-05-09 21:51:45

标签: module macros instantiation system-verilog

我有一些参数化的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 个答案:

答案 0 :(得分:1)

除非使用宏,否则无法构建标识符名称。正如您指出的那样,这不适用于参数值。

如果您希望使用数量可控制的实际depth/width组合,则可以创建一个generate-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