Class Types
当你声明一个class时,你正在声明一组成员和一组对这些成员操作的方法。
class MyClass;
bit [7:0] member1;
bit member2;
function void method;
$display("members are %h %b", member1, member2);
endfunction
endclass
我们正在声明一个class的形式和行为,但没有分配任何内容来存储这种类的值。
类对象是类的特定实例。创建对象的唯一方法是使用类的内置new()方法调用类构造函数。
每次调用new()方法时,它都会构造一个新的类对象,该方法会返回类对象的类句柄。句柄是对类对象的间接引用,就像指向内存中地址的指针一样。
类变量是存储引用特定class类型的特定类对象的类句柄的地方。
有点拗口~
声明类变量不会创建类对象,只会创建保存类句柄的空间。这与其他数据类型形成鲜明对比,在其他数据类型中,变量的声明会创建该类型的对象,并为你提供一个符号名称来引用这些对象。例如:
typesef struct {bit [7:0] member1; bit member2;} MyStruct;
MyStruct StructVar1,StrucVar2
这为两个MyStruct类型对象创建和分配空间,可以使用StructVar1.member1访问其成员之一。
另一方面:
MyClass ClassVar1,ClassVar2;
这为两个MyClass变量创建和分配空间,但只分配空间来保存MyClass对象的句柄,而不是对象本身。如果你现在尝试访问ClassVar1.member1,你将收到一个空句柄引用错误,因为类变量的初始值是特殊值null。
关于句柄而不是指针的好处之一是,它们消除了访问未初始化的对象引用的可能性。
一旦你有了类变量,就可以调用new()方法来构建类对象
ClassVar1 = new();
这调用MyClass类型的构造函数,该构造函数将该句柄存储在MyClass变量ClassVar1中。你现在可以访问ClassVar1.member1,因为ClassVar1引用了一个实际的对象。如果你那么做:
ClassVar2 = ClassVar1;
两个类变量现在都引用了同一个类对象——但MyClass仍然只有一个对象。ClassVar1.member1和ClassVar2.member1指的是同一个类成员。