使用定义宏实例化模块名称

Instantiating module name with define macro

我正在尝试使用不同的实例名称多次实例化一个 verilog 模块,以便它依赖于宏定义。是这样的

`define CHAN_NO 0
mymodule #(.chan_no(`CHAN_NO)) inst<CHAN_NO> (
    .Addr     (ADDR_A  )
   ,.Data     (DATA_A  )
   ,.Clk      (CLK     )
   );

当然这是一个简化的例子,因为实例化和宏来自不同的文件。
这可能吗,如果是的话,进行这种实例化的正确方法是什么。

当然可以。你应该使用生成块:

genvar i;
generate
    for (i = 0; i < `CHAN_NO; i=i+1) 
    begin : mymodule_instance
        mymodule #(.chan_no(i)) mymodule_inst (
            .Addr     (ADDR_A  )
           ,.Data     (DATA_A  )
           ,.Clk      (CLK     )
       );
    end
endgenerate

精化后树应该如下所示(例如 CHAN_NO = 3):

mymodule_instance[0]
   mymodule_inst
mymodule_instance[1]
   mymodule_inst
mymodule_instance[2]
   mymodule_inst

编辑: 如果你想要一个依赖于宏的实例名,那么你可以这样做:

`define INSTANCE_NUM 0       
`define INSTANCE_NAME(x) instance_name``x``
    mymodule #(.chan_no(`INSTANCE_NUM)) `INSTANCE_NAME(`INSTANCE_NUM) (
      .Addr     (ADDR_A  )
     ,.Data     (DATA_A  )
     ,.Clk      (CLK     )
    );