使用定义宏实例化模块名称
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 )
);
我正在尝试使用不同的实例名称多次实例化一个 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 )
);