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 参数化宏用法的主要内容,如果未能解决你的问题,请参考以下文章