我有一些参数化的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的实际数值代替。
有人暗示怎么做吗?
答案 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