SystemVerilog中构造类对象时为何调用类内new()函数?
f1=new()操作的疑问解答 示例代码
class BusTran; int data=32; endclass : BusTran class Driver; BusTran bt; function new(); // Driver’s new function bt = new(); // Call the BusTran new function endfunction endclass : Driver module tb; Driver f1; initial begin f1=new(); end endmodule
疑问解答
问题1:为何仅通过
new()就能访问对应类?
在SystemVerilog中,f1是Driver类的句柄,本质是一个指针变量,它的类型已经明确指向Driver类。当执行f1=new()时,编译器会根据句柄的类型自动关联到对应的Driver类,调用该类的构造函数完成对象实例化,并将新对象的内存地址赋值给f1。句柄的类型信息已经足够让编译器确定要实例化的类,因此无需额外指定类名。问题2:为何类中的
function new()会被执行?function new()是SystemVerilog类的构造函数,语言规定它的作用就是完成类对象的初始化工作,包括分配内存、初始化成员变量、调用其他依赖类的构造函数等。只要通过new()关键字实例化类对象,对应的构造函数就会被自动触发执行,这是语言内置的行为规则。问题3:是
new()主动调用该函数,还是指向Driver类时自动调用?
是new()操作主动触发了Driver类的function new()构造函数。执行f1=new()时会依次完成三个动作:1. 为Driver类对象分配内存空间;2. 调用Driver类的构造函数执行初始化逻辑;3. 将新对象的内存地址赋值给f1句柄。new()关键字就是用来触发构造函数执行的核心操作。问题4:为何
function new()中没有return语句?
SystemVerilog的构造函数new()不需要显式编写return语句,因为语言规则强制它自动返回刚创建的类对象的内存地址,这个返回值会直接赋值给左边的句柄(比如这里的f1)。如果手动添加return语句反而会违反语法规则导致编译错误,这是构造函数的特殊设计。
内容的提问来源于stack exchange,提问作者Ilan Mermelstein

