System Verilog 变量模块名称
System Verilog Variable Module Name
是否可以有可变的模块名称,然后可以通过一些参数来选择?我在宏定义中寻找 if...else
的语法。
module test;
`define NAME(x) if (x == 0) mod_e else mod_w
generate
for (genvar i = 0; i < 2; i++) begin
`NAME(i) inst_name (.a(a),.b(b),...);
end
endgenerate
endmodule
一种方法是像下面这样,但是需要连接所有端口2次,这对于数百个模块来说很不方便IOs并且容易出错。
module test;
generate
if (SOME_PARAM == 0) begin
mod_e inst_name (.a(a),.b(b),...);
end else begin
mod_w inst_name (.a(a),.b(b),...);
end
endgenerate
endmodule
您不能使用宏来进行特定于实例的映射。在解析生成块之前,宏在预处理步骤中得到扩展。
唯一接近此的是 config
块,它允许您从不同的库中为特定实例选择同名模块。但是没有条件运算符。
作为 数百个端口 问题的可能解决方案,假设所有实例都具有相同的端口集,您可以通过定义实例宏以不同方式解决此问题:
`define INST(mod_name) mod_name inst_name(.a(a), .b(b), ...);
if(SOME_PARAM == 0)
`INST(mod_e)
else
`INST(mod_w)
是否可以有可变的模块名称,然后可以通过一些参数来选择?我在宏定义中寻找 if...else
的语法。
module test;
`define NAME(x) if (x == 0) mod_e else mod_w
generate
for (genvar i = 0; i < 2; i++) begin
`NAME(i) inst_name (.a(a),.b(b),...);
end
endgenerate
endmodule
一种方法是像下面这样,但是需要连接所有端口2次,这对于数百个模块来说很不方便IOs并且容易出错。
module test;
generate
if (SOME_PARAM == 0) begin
mod_e inst_name (.a(a),.b(b),...);
end else begin
mod_w inst_name (.a(a),.b(b),...);
end
endgenerate
endmodule
您不能使用宏来进行特定于实例的映射。在解析生成块之前,宏在预处理步骤中得到扩展。
唯一接近此的是 config
块,它允许您从不同的库中为特定实例选择同名模块。但是没有条件运算符。
作为 数百个端口 问题的可能解决方案,假设所有实例都具有相同的端口集,您可以通过定义实例宏以不同方式解决此问题:
`define INST(mod_name) mod_name inst_name(.a(a), .b(b), ...);
if(SOME_PARAM == 0)
`INST(mod_e)
else
`INST(mod_w)