我正在尝试在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宏值具有两个不同的AND门。
我的尝试在编译RTL时出现语法错误,如下所示:
错误:模块项无效。
有人可以帮我解决这个问题吗?
答案 0 :(得分:1)
``
SysemVerilog功能。在任何Verilog LRM中都没有描述(我检查过IEEE Std 1364-2001和IEEE Std 1364-2005),因此Verilog Simulator不需要支持它。
Modern Verolog模拟器确实支持SystemVerilog。只需将文件扩展名从.v
更改为.sv
,即可启用SystemVerilog对该文件的支持。许多模拟器也有一个-sv
编译器选项,但要注意这会使所有Verilog文件都被视为SystemVerilog(如果有变量名称现在是SV关键字,则只会出现问题)。
IEEE Std 1800-2012作为在第22.5.1节中使用``
的好例子`define