【问题标题】:System Verilog Variable Module Name系统 Verilog 变量模块名称
【发布时间】:2020-05-06 23:03:24
【问题描述】:

是否可以有变量模块名称,然后可以通过某些参数选择?我正在寻找宏定义中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】:

作为您的数百个端口问题的可能解决方案,假设所有实例具有相同的端口集,您可以通过定义实例宏以不同方式解决此问题:

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

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

【讨论】:

  • 是的,在给定的语言限制内,这将是一个很好的解决方案。谢谢!
【解决方案2】:

您不能使用宏来执行特定于实例的映射。在解析生成块之前,宏在预处理步骤中得到扩展。

唯一接近这一点的是config 块,它允许您从不同库中为特定实例选择同名模块。但是没有条件运算符。

【讨论】:

  • 好的,感谢您解释差异。我相信 Serge 在下面的答案很接近,是实现我所寻找的好方法。
猜你喜欢
  • 2021-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多