SystemVerilog学习——构造函数new

一、概述

在 SystemVerilog 中,new 是一个构造函数,用于创建类的实例(即对象)。它在面向对象编程(OOP)中起着重要作用,负责实例化一个对象并进行初始化。与传统编程语言(如 C++ 或 Java)中的构造函数类似,new 用来初始化对象的成员变量或执行必要的准备工作。

SystemVerilog 类的 new 构造函数通常用于创建一个类的对象实例。它有以下特点:

  • 语法: class_name new();class_name new(input_args);

  • 作用: 在创建类的对象时,new 方法用来执行对象的初始化操作。

  • 初始化: new 可以在类实例化时对类的成员变量进行初始化。

二、基本结构

构造函数与普通的方法不同,它通常没有返回值(并且不需要显式地写出 return)。new 作为一个方法,通常会接受一些参数来初始化类的成员变量。

复制代码
class MyClass;
    // 成员变量
    int a;
    string name;

    // 构造函数
    function new(int a_value, string name_value);
        a = a_value;
        name = name_value;
    endfunction
endclass

三、使用

在 SystemVerilog 中,类的实例化(即对象创建)并不会自动调用 new 构造函数;需要显式地调用 new 来创建对象并初始化它们。

3.1 对象的显式创建

类的对象(即类的实例)需要显式调用 new 构造函数进行初始化。这和许多面向对象编程语言(如 C++、Java)相似。

复制代码
class MyClass;
    int a;
    string name;

    function new(int a_value, string name_value);
        a = a_value;
        name = name_value;
    endfunction
endclass

MyClass obj;  // 声明对象
obj = new(10, "Test");  // 显式调用构造函数

3.1.1 为什么需要显式调用 new

SystemVerilog 的类是动态分配的 ,它们并不像传统的C语言或者 Verilog 中的 structmodule 那样具有静态大小。因此,为了确保类的对象正确地创建和初始化,必须显式调用 new 来分配内存,并进行初始化。

3.1.2 new 的作用

  1. 内存分配new 构造函数会为类的对象分配内存空间。这是因为类的对象是动态创建的,并不直接存储在栈上,而是存储在堆中。

  2. 初始化成员变量new 方法通常用于初始化类的成员变量。你可以在 new 构造函数中设置初始值,确保对象创建时处于有效的状态。

  3. 继承时的构造函数调用 :如果类是从其他类继承而来,子类的 new 方法通常会显式调用父类的 new 方法,以确保父类成员得到正确初始化。

3.2 自动调用的情况

3.2.1 默认构造函数

如果类没有显式定义 new 构造函数,那么 SystemVerilog 会自动提供一个默认构造函数,这个默认构造函数会将类的所有成员变量初始化为默认值(如数字类型初始化为 0,字符串类型初始化为空字符串等)。但即便如此,您仍然需要显式地实例化类的对象。

例如,如果没有显式定义 new,SystemVerilog 会自动创建一个默认构造函数:

复制代码
class MyClass;
    int a;    // 默认为 0
    string name;  // 默认为 ""
endclass

MyClass obj;  // 使用默认构造函数

在这种情况下,obj 会被创建,并且其成员 a 会被初始化为 0name 会被初始化为空字符串 ""

3.2.2 动态创建对象

对象的动态创建是通过显式调用 new 来完成的。SystemVerilog 允许通过 new 来动态分配内存并初始化对象。没有 new 的话,类的对象会是一个句柄(或者空指针 null),并且无法使用。

复制代码
MyClass obj;  // 仅声明对象,但未创建
obj = new();  // 通过 new 创建对象

3.3 继承与 new

复制代码
class ParentClass;
    int a;
    function new(int a_value);
        a = a_value;
    endfunction
endclass

class ChildClass extends ParentClass;
    string name;

    function new(int a_value, string name_value);
        super.new(a_value);  // 显式调用父类的构造函数
        name = name_value;
    endfunction
endclass

// 实例化时显式调用 new
ChildClass obj = new(10, "ChildTest");

在这个例子中,ChildClassnew 构造函数会显式调用父类 ParentClassnew 构造函数,并在初始化过程中设置 name 成员。

四、总结

SystemVerilog 中,new 是类的构造函数,用于显式创建对象并初始化其成员变量。对象的创建必须通过调用 new(),并且可以使用带参数的 new 来传递初始化值。new() 会在堆上分配内存并执行初始化操作,确保对象的成员变量得到正确的初始值。尽管类可以定义多个构造函数,new 方法的调用总是与对象的动态内存分配紧密相关,且在实例化时自动触发。

相关推荐
西安景驰电子19 小时前
PCIe 授时卡原理及应用
运维·服务器·windows·单片机·嵌入式硬件·fpga开发
落chen20 小时前
基于Vivado的FIFO-IP核-强化篇
fpga开发
公众号:fuwuqiBMC1 天前
(转自“服务器BMC”)服务器BMC芯片——AST1840
运维·服务器·fpga开发
国科安芯1 天前
还是4位?ASC8T245S 与 ASC4T245S 的双向电平转换选型实战
单片机·嵌入式硬件·物联网·fpga开发·机器人·云计算
Rambo.xia2 天前
接口协议避坑 · 第5篇:多器件级联时序踩坑实录
fpga开发
Eloudy2 天前
RFSoC-PYNQ → RK-XCKU5P-F 移植记录
fpga
紫霄芯语2 天前
观察者模式在FPGA中断系统的实战重构
观察者模式·fpga开发·重构
ARM+FPGA+AI工业主板定制专家3 天前
国产化RK3576+FPGA架构|晶圆传输机器人高速定位+AI瑕疵检测一体化方案
fpga开发·架构·机器人·嵌入式·fpga·工控·机器人运控
Eloudy4 天前
FPGA (QSFP28 + CMAC US+ RoCEv2) 与 Ubuntu22 + Mellanox 网卡直连分析
fpga开发
szxinmai主板定制专家4 天前
RK3568+FPGA高速并行采集|半导体探针测试设备多通道同步数据采集系统设计
人工智能·嵌入式硬件·计算机视觉·fpga开发