Verilog 参数化宏用法

Posted

技术标签:

【中文标题】Verilog 参数化宏用法【英文标题】:Verilog Parameterized macro usage 【发布时间】:2015-06-04 18:27:45 【问题描述】:

我正在尝试使用 Verilog 中的参数化宏通过宏名称动态更改实例的主模块,如下所示。

`define AND_CELL(tech) ``tech``_2oi1_1x 

`define TECH_1 tech1
`define TECH_2 tech2

module top(in1, in2, in3, in4, out_x);
  input in1, in2, in3, in4;
  output out_x;
  wire t1_c, t2_c;

  `AND_CELL(`TECH_1) u1(.a(in1), .b(in2), .x(t1_c));
  `AND_CELL(`TECH_2) u2(.a(in3), .b(in4), .x(t2_c));

  assign out_x = t1_c | t2_c ;
endmodule

module tech1_2oi1_1x(a, b, x);
  input a, b;
  output x;
  assign x = a & b;
endmodule

module tech2_2oi1_1x(a, b, x);
  input a, b;
  output x;
  assign x = a & b;
endmodule

这里的目的是让顶层模块根据 TECH_1 和 TECH_2 宏值具有两个不同的与门。

我的尝试在编译 RTL 时出现语法错误,如下所示:

错误:无效的模块项。

有人可以帮我解决这个问题吗?

【问题讨论】:

我更正了示例代码,使其具有输入/输出定义。我仍然在实例化行遇到编译错误。 @toolic:这取决于正在使用的软件,例如iverilog 将_2oi1_1x 视为宏,假定为空。 @Qiu:那么它不是由 Verilog 2001 LRM 驱动的吗? @Qui:在EDA综合工具中编译吗? 更多关于这个问题的讨论在这里问:verificationacademy.com/forums/systemverilog/… 【参考方案1】:

`` SysemVerilog 功能。没有在任何 Verilog LRM 中描述(我检查了 IEEE Std 1364-2001 和 IEEE Std 1364-2005),因此 Verilog 模拟器不需要支持它。

现代 Verolog 模拟器确实支持 SystemVerilog。只需将文件扩展名从.v 更改为.sv 即可启用对该文件的SystemVerilog 支持。许多模拟器也有一个-sv 编译器选项,但请注意,这会使所有 Verilog 文件都被视为 SystemVerilog(只有当变量名现在是 SV 关键字时才会出现问题)。

IEEE Std 1800-2012 作为在 § 22.5.1 中使用 `` 的好例子 `define

【讨论】:

我怎样才能让它以纯 Verilog 2001 格式工作?启用此功能的任何其他替代方法?我不能使用 -sv 开关将此 RTL 视为 .sv。 您可以使用我在回答类似问题时提到的嵌入式 Perl/Ruby/Python:请参阅 here、here 和 here。这将需要运行 Perl/Ruby/Python 脚本以在使用模拟器进行编译之前生成 .v 文件。

以上是关于Verilog 参数化宏用法的主要内容,如果未能解决你的问题,请参考以下文章

Verilog实例化时的参数传递

Verilog中使用'include实现参数化设计

verilog简单例化问题

c_cpp CPP的字符串化宏示例

verilog例化顶层双向io口如何连接

为啥没有在 Verilog 中正确传递参数?