systemverilog对象的复制和拷贝

在 SystemVerilog 中,对象的复制分为浅复制(shallow copy)和深复制(deep copy)。

浅复制会将原始对象中的所有属性拷贝到新对象中,包括整数、字符串、句柄等。但是,对于句柄属性,浅复制只是复制句柄本身,而不复制句柄指向的对象。也就是说,原始对象和新对象中的句柄会指向同一个对象,这可能导致新对象中的句柄指向的内容发生变化时,原始对象中的对应内容也会发生变化。

例如,如果原始对象中有一个指向其他类对象的句柄成员,浅复制后,新对象中的该句柄将指向与原始对象相同的对象。如果通过新对象修改了这个被指向对象的内容,那么原始对象中对应的内容也会被修改。

深复制则是创建一个新的和原始句柄指向的内容完全相同的对象,新对象和原始对象的句柄指向不同的存储空间,但内容是相同的。这样,新对象中句柄指向的内容发生改变时,不会影响原始对象中句柄指向的内容。

要实现深复制,通常需要为类定义一个copy函数,用于逐个成员地进行复制,包括嵌套对象的复制。在copy函数中,需要创建新的嵌套对象,并将原始对象中的成员值复制到新对象的相应成员中。

program class_t;class a;integer j;endclassclass b;integer i;a a_inst = new;  // 类 b 中包含类 a 的实例// 深复制函数function copy(b in);this.i = in.i;this.a_inst.j = in.a_inst.j;  // 这里需要复制嵌套对象 a 的成员endfunctionendclassinitial beginb b1 = new;b b2 = new;// 初始化 b1 的成员b1.i = 10;b1.a_inst.j = 20;// 浅复制b2 = new b1; b2.a_inst.j = 50;  // 修改 b2 中嵌套对象 a 的成员$display("浅复制: b2.a.j=%d, b1.a.j=%d", b2.a_inst.j, b1.a_inst.j); // 深复制b2.copy(b1); b2.a_inst.j = 50;  // 修改 b2 中嵌套对象 a 的成员$display("深复制: b2.a.j=%d, b1.a.j=%d", b2.a_inst.j, b1.a_inst.j); end
endprogram

在上述示例中,类b中包含了类a的实例a_inst。浅复制后,修改b2a_inst的成员jb1中的a_inst.j也会随之改变。而深复制后,修改b2a_inst的成员j,不会影响b1中的a_inst.j

需注意,在实际使用中,根据具体需求选择合适的复制方式。如果对象结构比较简单,没有嵌套其他复杂对象,浅复制可能就足够了。但如果对象包含嵌套对象,且需要确保复制后的对象完全独立,不影响原始对象,就需要使用深复制。此外,UVM(Universal Verification Methodology)中已经集成了copyclone操作,使用时无需单独编写copy函数,直接调用即可。其中,clone方法相当于先创建(create)一个新对象,然后对其进行copy操作。而copy方法默认进行深拷贝,但也可能存在一些特殊情况使用了句柄拷贝,具体需参考 UVM 的相关实现和文档。

在 UVM(Universal Verification Methodology)中,clonecopy都是用于对象复制的方法,但它们之间有一些区别:

clone方法等效于new(创建新对象)和copy(复制成员变量)的组合。也就是说,clone会先分配一块新的内存空间来创建一个新对象,然后将原对象的成员变量复制到这个新对象中。使用clone方法时,返回的是一个新创建并复制了原对象属性的uvm_object,需要配合$cast使用。例如:

uvm_object new_obj;
new_obj = original_obj.clone(); 
// 可能需要进行类型转换,如:$cast(new_obj, original_obj.clone());

copy方法则不会创建新的对象,它只是将现有对象的成员变量复制到另一个已经存在且已分配好内存的对象中。在使用copy方法前,目标对象必须已经使用new函数分配好了内存空间。例如:

destination_obj.copy(source_obj); 

clone用于创建并复制对象,返回新对象;copy用于在已存在的对象间复制成员变量

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/46060.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

汇编程序调用 C 程序详解

文章目录 1. ATPCS 规则 2. 汇编和C程序传递参数 汇编程序向 C 程序的函数传递参数 C 程序返回结果给汇编程序 代码示例 3. C 函数使用栈 4. C 语言中读写寄存器 在嵌入式开发中,经常需要在 C 程序和 ARM 汇编程序之间进行相互调用。为了保证这些调用的正确性…

SpringBoot整合Java Mail实现发送邮件

SpringBoot整合Java Mail实现发送邮件 实现 引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mail</artifactId></dependency>发送邮件配置 这里使用qq邮箱发送邮件&#xff0c;需要…

Leetcode3200. 三角形的最大高度

Every day a Leetcode 题目来源&#xff1a;3200. 三角形的最大高度 解法1&#xff1a;模拟 枚举第一行是红色还是蓝色&#xff0c;再按题意模拟即可。 代码&#xff1a; /** lc appleetcode.cn id3200 langcpp** [3200] 三角形的最大高度*/// lc codestart class Solutio…

java.sql.SQLException: Before start of result set

情况描述&#xff0c;在通过JDBC连接数据库时&#xff0c;想直接判断获取的值是否存在&#xff0c;运行时报错。 翻译&#xff1a; 在开始结果集之前 报错截图 解决问题的方法&#xff1a;对结果集ResultSet进行操作之前&#xff0c;一定要先用ResultSet.next()将指针移动至…

RAG 效果提升的最后一步—— 微调LLM

如果说&#xff0c;rerank能够让RAG的效果实现百尺竿头更进一步&#xff0c;那么LLM微调应该是RAG效果提升的最后一步。 把召回的数据&#xff0c;经过粗排&#xff0c;重排序后&#xff0c;送给模型&#xff0c;由模型最后总结答案。LLM的确已经是RAG的最后一步了。 这里还是会…

C#可空类型与数组

文章目录 可空类型NULL合并运算符&#xff08;??&#xff09;数组数组声明数组初始化数组赋值数组访问多维数组交错数组数组类数组类的常用属性数组类的常用方法 可空类型 C#提供了一种特殊的数据类型&#xff0c;nullable类型&#xff08;可空类型&#xff09;&#xff0c;可…

<数据集>夜间车辆识别数据集<目标检测>

数据集格式&#xff1a;VOCYOLO格式 图片数量&#xff1a;5000张 标注数量(xml文件个数)&#xff1a;5000 标注数量(txt文件个数)&#xff1a;5000 标注类别数&#xff1a;8 标注类别名称&#xff1a;[car, pedestrian, traffic light, traffic sign, bicycle, bus, truck…

vue学习day08-v-model详解、sync修饰符、ref和$refs获取dom组件、Vue异步更新和$nextTick

25、v-model详解 &#xff08;1&#xff09;v-model原理 1&#xff09;原理: v-model本质上是一个语法糖&#xff0c;比如&#xff1a;在应用于输入框时&#xff0c;就是value属性与input事件的合写。 2&#xff09;作用 ①数据变&#xff0c;视图变 ②视图变&#xff0c…

wordpress制作主题步骤

WordPress主题的制作是一个涉及多个步骤的过程&#xff0c;旨在控制网站的外观、布局和功能。以下是一个详细的WordPress主题制作指南&#xff1a; 一、准备工作 安装WordPress&#xff1a;首先&#xff0c;确保你已经在你的服务器上安装了WordPress。WordPress可以从其官方网…

短链接服务Octopus-搭建实战

[WARNING] The POM for cn.throwx:octopus-contract:jar:1.0-SNAPSHOT is missing, no dependency information available 解决方案&#xff1a; cd octopus-contract/ mvn install -------------- ➜ octopus-server git:(master) ✗ mkdir -p /data/log-center/octopus/s…

DockerCompose介绍,安装,使用

DockerCompose 1、Compose介绍 将单机服务-通过Dockerfile 构建为镜像 -docker run 成为一个服务 user 8080 net 7000 pay 8181 admin 5000 监控 .... docker run 单机版、一个个容器启动和停止问题&#xff1a; 前面我们使用Docker的时候&#xff0c;定义 Dockerfil…

Lottery 分布式抽奖(个人向记录总结)

1.搭建&#xff08;DDDRPC&#xff09;架构 DDD——微服务架构&#xff08;微服务是对系统拆分的方式&#xff09; &#xff08;Domain-Driven Design 领域驱动设计&#xff09; DDD与MVC同属微服务架构 是由Eric Evans最先提出&#xff0c;目的是对软件所涉及到的领域进行建…

mysql笔记(表导出文件,文件导入表)

遇见权限问题1: cat /etc/my.cnf加入[mysqld] secure_file_priv ""遇见目录错误2:因为 MySQL 服务器没有权限在根目录下创建文件。你可以尝试将文件导出到一个 MySQL 服务器有权限写入的目录下&#xff0c;例如 MySQL 数据目录或 /tmp目录。sudo chmod 755 /path/to…

开源科学工程技术软件

目录 0 参考链接 1 Silx 2 Klampt 3 参数化三维3D软件Dune 3D 4 GPS日志文件查看器GPXSee 5 三维3D软件Chili3D 6 集成电路设计软件XicTools 7 天文学软件Cosmonium 8 计算流体力学软件FluidX3D 9 点云处理软件CloudCompare 10 野外火灾建模软件WindNinja 11 电子设…

.NET MAUI开源架构_2.什么是 .NET MAUI?

1.什么是.NET MAUI&#xff1f; .NET 多平台应用 UI (.NET MAUI) 是一个跨平台框架&#xff0c;用于使用 C# 和 XAML 创建本机移动和桌面应用。使用 .NET MAUI&#xff0c;可从单个共享代码库开发可在 Android、iOS、macOS 和 Windows 上运行的应用。 .NET MAUI 是一款…

使机器人在执行任务时更加稳定

为了使机器人在执行任务时更加稳定&#xff0c;调整参数时需要考虑多个因素&#xff0c;如步态、速度、角度等。这些参数的调整需要基于实际环境、任务需求和机器人自身的物理特性。以下是一些具体的调整建议&#xff1a; 1. 调整步态和步高 gait_type3; step_height0.03;步态…

iOS热门面试题(四)

问题一&#xff1a;请详细解释iOS中的Core Data框架&#xff0c;包括它的工作原理、优势、以及在实际项目中的应用场景。 Core Data框架概述&#xff1a; Core Data是iOS和macOS开发中一个强大的数据持久化框架&#xff0c;它允许开发者以面向对象的方式管理应用数据。Core D…

pytorch中一些最基本函数和类

1.Tensor操作 Tensor是PyTorch中最基本的数据结构&#xff0c;类似于NumPy的数组&#xff0c;但可以在GPU上运行加速计算。 示例&#xff1a;创建和操作Tensor import torch# 创建一个零填充的Tensor x torch.zeros(3, 3) print(x)# 加法操作 y torch.ones(3, 3) z x y pr…

【学习笔记】无人机(UAV)在3GPP系统中的增强支持(三)-机上无线电接入节点无人机

引言 本文是3GPP TR 22.829 V17.1.0技术报告&#xff0c;专注于无人机&#xff08;UAV&#xff09;在3GPP系统中的增强支持。文章提出了多个无人机应用场景&#xff0c;分析了相应的能力要求&#xff0c;并建议了新的服务级别要求和关键性能指标&#xff08;KPIs&#xff09;。…

BGP笔记的基本概要

技术背景&#xff1a; 在只有IGP&#xff08;诸如OSPF、IS-IS、RIP等协议&#xff0c;因为最初是被设计在一个单域中进行一个路由操纵&#xff0c;因此被统一称为Interior Gateway Protocol&#xff0c;内部网关协议&#xff09;的时代&#xff0c;域间路由无法实现一个全局路由…