返回介绍

11.7 构造器

发布于 2020-09-09 22:55:49 字数 1039 浏览 891 评论 0 收藏 0

SystemVerilog没有要求C++那样的复杂的内存分配和释放。一个对象的构造是直接的,并且碎片收集象Java中那样是隐含的并且是自动的。它没有内存泄漏或其它微妙的行为,而这些往往成为C++程序员的噩梦。

SystemVerilog提供了一种机制在产生对象的时候初始化一个实例。当对象被产生的时候,例如:

Packet p = new;

系统执行与这个类关联的new函数:

class Packet;
    integer command;

    function new();
      command = IDLE;
    endfunction
endclass

注意:new现在被用在两个具有不同语义的完全不同的关联文中。变量声明产生了Packet类的一个对象。在产生这个实例的过程中,new函数被调用,在这个过程中,任何要求的特殊初始化都会完成。new函数也被称作是类构造器。

new操作被定义成一个没有返回类型的函数,象任何其它函数一样,它必须是无阻塞的。尽管new没有指定一个返回类型,但赋值语句左侧的部分会决定它的返回类型。

在声明中包括了一个初始化器的类属性在用户定义的类构造器被执行之前完成初始化。因此,初始化器的值可以被类构造器过载。

每一个类都有一个缺省(内建)的new方法。缺省构造器首先调用它的父类构造器(super.new(),在11.14节中描述),然后继续将当前对象的每一个成员初始化成它的初始值(或未初始化的值)。

向构造器传递参数也是可能的,这就允许一个对象的运行时定制:

Packet p = new(STARTUP, $random, $time);

其中Packet中的new初始化任务可能具有如下的形式:

function new(int cmd=IDLE, bit[12:0] adrs=0, int cmd_time);
    command = cmd;
    address = adrs;
    time_requested = cmd_time;
endfunction

对其中自变量的规定与任何其它过程子例程相同,例如缺省参数的使用。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文