Verilog 使用define宏实例化模块名称

Verilog 使用define宏实例化模块名称,verilog,system-verilog,Verilog,System Verilog,我试图用不同的实例名多次实例化一个verilog模块,以便它依赖于宏定义。是这样的 `define CHAN_NO 0 mymodule #(.chan_no(`CHAN_NO)) inst<CHAN_NO> ( .Addr (ADDR_A ) ,.Data (DATA_A ) ,.Clk (CLK ) ); `define CHAN\u NO 0 我的模块('chan#u no(`chan#u no))inst( .

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

`define CHAN_NO 0
mymodule #(.chan_no(`CHAN_NO)) inst<CHAN_NO> (
    .Addr     (ADDR_A  )
   ,.Data     (DATA_A  )
   ,.Clk      (CLK     )
   );
`define CHAN\u NO 0
我的模块('chan#u no(`chan#u no))inst(
.Addr(Addr_A)
,.数据(数据_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
编辑: 如果您想拥有一个依赖于宏的实例名,则可以这样做:

`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     )
    );
`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     )
    );