Verilog参数化宏用法

时间:2015-06-04 18:27:45

标签: verilog register-transfer-level

我正在尝试在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时出现语法错误,如下所示:

  

错误:模块项无效。

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

1 个答案:

答案 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