You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SystemVerilog中构造类对象时为何调用类内new()函数?

关于SystemVerilog中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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 17:42:41