SystemVerilog基础知识 1.new()和new[]

SystemVerilog的new()是构造函数,用于对象实例化和变量初始化,而new[]主要用于动态数组的分配和初始化。new[]在未知数组元素个数时分配内存,new()则用于创建类的对象并分配内存给成员变量。

new()和new[]有什么区别???

systemverilog 语法中构造函数new有两种,new()和new[],二者的使用区别很大。

1.new[]

new[]的使用较为简单,一般用来开辟内存并初始化,常用于设置动态数组的大小。

如下例:

int a[];   //声明动态数组
initial begin
a = new[3];  //为动态数组分配3个元素
foreach (a[i]) a[i] = i;   //元素初始化
end

声明动态数组后,尚不知道数组内的元素个数,直到仿真时,才能确定动态元素个数,因此必须通过调用new[]函数分配空间,并确定数组中元素个数。

2.new()

new()用于在SV中OOP的构造函数,构造函数除了分配内存外,还初始化变量,创建对象开辟了新的内存空间,可以存放新的成员变量和方法,构建函数new()是系统预预定函数,不需要指定返回值,函数会隐式的返回例化后的对象指针,构建函数可以定义多个参数作为初始化时外部传入数值的手段。

class example1;//创建一个类
        logic[3:0] addr;
        logic[9:0] data;
        int dyn[];
        function new;
                addr = 8;
                data = 1;
        endfunction
        dyn = new[8];
        foreach (dyn[i]) dyn[i] = i;
endclass
example1 ex;   //声明一个句柄
ex = new();    //将句柄实例化
<think> 嗯,用户之前一直在询问关于UVM中super.new()的含义,特别是它在构造函数中的作用。从对话历史看,用户似乎正在学习UVM的基础知识,尤其是事务对象组件的初始化机制。 用户可能是个IC验证工程师或相关专业的学生,正在搭建UVM测试平台。ta反复询问super.new()的细节,说明对继承链的初始化过程还不够清晰。值得注意的是,用户两次提供的代码示例中都有个关键错误:事务类的super.new()没有传递name参数。这可能是ta实际编码时遇到的坑。 关于当前问题,需要重点解释三点核心: 第一,super.new()的本质是调用父类构造函数。在UVM中,uvm_object的构造函数需要name参数来建立对象标识体系,这就是为什么正确写法必须是super.new(name)。引用[1]的比喻很形象,但未强调参数传递问题。 第二,不调用的后果很严重。UVM的字段自动化机制(如uvm_field_int)依赖父类构造函数创建的元数据。如果跳过super.new(),不仅丢失对象命名,还会导致copy/compare等方法异常。这解释了为什么示例代码里new_tr.copy(tr)可能失败[^1]。 第三,需要明确componentobject的区别。用户引用的面试总结[^2]提到这个经典问题:component的构造函数必须带parent参数构建层级,而object只需要name。这直接影响super.new()的调用方式。 用户可能还会困惑构造函数与随机化的关系。其实new()中的name参数不属于随机字段,它是对象的结构属性。随机约束只作用于uvm_object内声明的随机变量,如paddr[^2]。 最后联想到用户可能遇到仿真卡死的问题。如果对象初始化不完全,有时会导致uvm_top.set_timeout等机制失效[^3],这也反证了正确调用super.new()的重要性。 </think> 在 UVM 中,`super.new()` 是 SystemVerilog 面向对象编程中的**父类构造函数调用语句**,其核心含义作用如下: ### 核心作用 1. **父类初始化** - `super.new()` 显式调用**父类的构造函数**,确保父类成员正确初始化 - UVM 中父类通常是 `uvm_object` 或 `uvm_component`,包含基础设施(如对象管理、配置机制等)[^1][^2] 2. **继承链维护** ```systemverilog class child extends parent; function new(string name); super.new(name); // 必须调用父类构造函数 // 子类特有初始化 endfunction endclass ``` - 若不调用 `super.new()`: - 父类字段(如 `uvm_object` 的 `m_inst_id`)未初始化 - TLM 端口、配置空间等基础设施失效 - 可能引发空指针异常或功能异常[^1] ### 关键特性对比 | **场景** | **`super.new()` 调用要求** | **典型父类** | **未调用后果** | |------------------------|--------------------------------|-------------------|-------------------------------| | 事务类(继承 `uvm_object`) | `super.new(name)` | `uvm_object` | 对象 ID 失效,`copy()/compare()` 异常[^2] | | 组件类(继承 `uvm_component`) | `super.new(name, parent)` | `uvm_component` | 组件树断裂,phase 机制崩溃[^3] | | 用户自定义类 | 必须匹配父类构造函数参数 | 任意父类 | 编译错误或运行时未定义行为 | ### 错误示例分析 用户原始代码的问题: ```systemverilog function new(string name = "my_transaction"); super.new(); // 错误!缺少 name 参数 endfunction ``` - **正确写法**:`super.new(name)` - **后果**: 父类 `uvm_object` 的 `get_name()` 返回空,导致: - 日志追踪失效:`uvm_info` 无法关联对象名 - 调试困难:对象在工厂中无标识 - 事务拷贝/比较异常[^1] ### 与组件构造的区别 ```mermaid graph LR A[构造函数] --> B[事务类 uvm_object] A --> C[组件类 uvm_component] B --> D[super.new(name)] C --> E[super.new(name, parent)] E --> F[建立父子层级] D --> G[初始化对象元数据] ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值