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