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 方法的调用总是与对象的动态内存分配紧密相关,且在实例化时自动触发。

相关推荐
小眼睛FPGA3 小时前
【紫光HiYou开源入门轻量级PCIE开发板PG2L25G】实验例程1-基于紫光FPGA 的LED 流水灯
fpga开发
不会武功的火柴3 小时前
SystemVerilog语法(8)-有限状态机(FSM)
嵌入式硬件·fpga开发·自动化·ic验证·rtl·uvm方法学
Kent Gu5 小时前
Lattice FPGA选型
fpga开发
Terasic友晶科技9 小时前
答疑解惑|为DE25-Nano开发板配置Linux kernel时.config文件没有起作用是什么原因?
linux·服务器·fpga开发·linux kernel·de25-nano
8K超高清11 小时前
CCBN展会多图回顾
人工智能·算法·fpga开发·接口隔离原则·智能硬件
小眼睛FPGA11 小时前
【紫光HiYou开源入门轻量级PCIE开发板PG2L25G】实验例程5-DDR3 读写实验例程
fpga开发
unicrom_深圳市由你创科技12 小时前
如何做FPGA的功耗优化?动态功耗管理怎么实现?
fpga开发
不会武功的火柴12 小时前
SystemVerilog语法(9)-验证基础与简单Testbench
嵌入式硬件·fpga开发·fpga·systemverilog·硬件描述语言·rtl·uvm验证
kaizq12 小时前
MuleRun助力MakerChip-FPGA在线编程模拟仿真操练
fpga开发·verilog·龙虾机器人·mulerun·makerchip·在线模拟仿真
c-u-r-ry3012 小时前
vivado处理硬件设计差分对布线极性翻转的问题
经验分享·fpga开发