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

Module 如何在系统Verilog中动态生成模块实例名称?,module,macros,instantiation,system-verilog,Module,Macros,Instantiation,System Verilog,我有一些参数化的Verilog,我需要动态生成实例模块名,但我不知道如何在Verilog本身的范围内(即不创建脚本或类似的脚本来生成平面Verilog) 有一点背景知识,我在内存库中有大量内存模块。这些都被命名为大致的MemModuleDepth_Width,深度和宽度范围很广。我已经参数化了想要使用这个库中的内存的模块。然而,要做到这一点,我需要动态生成模块名,如下所示 module fifo(in, out) parameter width; parameter depth; ...fifo

我有一些参数化的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
模块fifo(输入、输出)
参数宽度;
参数深度;
…先进先出的东西。。。

MemModule“depth”和“width”(读取地址、读取数据等)除非使用宏,否则无法生成标识符名称。正如您所指出的,这对参数值不起作用

如果您有一个可管理数量的实际
深度/宽度
组合,您可以创建一个生成案例/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

除非通过使用宏,否则无法生成标识符名称。正如您所指出的,这对参数值不起作用

如果您有一个可管理数量的实际
深度/宽度
组合,您可以创建一个生成案例/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

实际上,它应该生成如下模块名称:
深度[0]。宽度[0]。MemModuleI_j
深度[0]。宽度[1]…
。看看这是否足够。实际上,它应该生成如下模块名称:
深度[0]。宽度[0]。MemModuleI_j
深度[0]。宽度[1]…
。看看这对您是否足够。您可以轻松地使用另一种脚本语言生成这些组合,并将其放入此处包含的文件中。这样,如果您需要添加新的内存模块,只需更新脚本(或脚本将使用的配置文件)。OP不需要脚本,因此他们可以利用Parameterization我的意思是生成您提供的case语句。它们仍然可以参数化包装器模块。您可以轻松地使用另一种脚本语言生成这些组合,并将其放入此处包含的文件中。这样,如果您需要添加新的内存模块,只需更新脚本(或脚本将使用的配置文件)。OP不需要脚本,因此他们可以利用Parameterization我的意思是生成您提供的case语句。它们仍然可以参数化包装器模块。