SystemVerilog Typedef Class

有时,由于在类本身的声明之前使用了类变量,编译器会出错。 例如,如果两个类需要相互处理,则首先出现关于鸡还是鸡蛋的经典难题。 这是因为编译器在处理第一个类时会在其中找到对第二个类的引用,而该引用尚未声明。

class ABC;
  DEF   def;   // 错误:尚未声明DEF
endclass
 
class DEF;
  ABC   abc;
endclass

Compilation Error

file: typdef-class.sv
   DEF def;
     |
ncvlog: *E,NOIPRT (typedef-class.sv,2|5): Unrecognized declaration 'DEF' could be an unsupported keyword, a spelling mistake or missing instance port list '()' [SystemVerilog].

在这种情况下,您必须使用typedef关键字为第二个类提供前向声明。 当编译器看到typedef类时,它将知道稍后将在同一文件中找到该类的定义。

用法

typedef class DEF;  // 通知编译器在类DEF定义之前,可以先使用类DEF
 
class ABC;
  DEF   def;      // 编译器知道类DEF声明将在以后出现
endclass
 
class DEF;
  ABC   abc;
endclass

通过使用typedef,DEF被声明为class类,后来被证明是相同的。不必在typedef语句中指定DEF是class类型。

typedef DEF;     // 合法
 
class ABC;
  DEF def;
endclass

将typedef与参数化类一起使用

typedef也可以用于具有参数化端​​口列表的类,如下所示。

typedef XYZ;
 
module top;
  XYZ #(8'h3f, real)              xyz0;   // positional parameter override
  XYZ #(.ADDR(8'h60), .T(real))   xyz1;    // named parameter override
endmodule
 
class XYZ #(parameter ADDR = 8'h00, type T = int);
endclass

参考文献:
【1】https://www.chipverify.com/systemverilog/systemverilog-typedef-class

发布了124 篇原创文章 · 获赞 8 · 访问量 6702

猜你喜欢

转载自blog.csdn.net/qq_43042339/article/details/104490975