系统Verilog变量模块名称

问题描述 投票:0回答:1

是否可以用变量模块的名称,然后通过一些参数来选择?我正在寻找 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次,这对于有几百个IO的模块来说很不方便,而且容易出错。

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
if-statement macros verilog system-verilog substitution
1个回答
1
投票

作为一个可能的解决方案,你的 数百个港口 问题, 假设所有实例都有相同的端口集, 您可以通过定义一个实例宏来解决这个问题。

`define INST(mod_name) mod_name inst_name(.a(a), .b(b), ...);

if(SOME_PARAM == 0)
   `INST(mod_e)
else
   `INST(mod_w)


0
投票

你不能用宏来做特定的实例映射。宏会在生成块被解析之前的预处理步骤中被展开。

唯一与此接近的是 config 块,可以让你从不同的库中为特定的实例选择一个同名的模块。但是没有条件操作符。

© www.soinside.com 2019 - 2024. All rights reserved.