【sv中浅拷贝与深拷贝】

news/2024/5/19 19:20:34 标签: systemverilog

文章目录

    • 前言
    • 浅拷贝(shallow copy)
    • 深复制 (deep_copy)
    • UVM中实现深复制的方法

前言

本文通过实际代码编译介绍了sv中浅复制和深复制的区别

浅拷贝(shallow copy)

先给出实际代码

module shallow_copy();
  class A;
     integer j = 5;
  endclass
  
  class B;
      integer i =1;
	
	 A a;
	 function new();
	   this.a=new();
	   endfunction
   endclass
   B b1,b2;
  initial begin 
  integer test;
     b1=new();//创建一个B的对象
	 b2=new b1;//复制b1对象
	 b2.i=10;//改变b2中i的值
	 b2.a.j=50;//改变b2中a.j的值
	 test=b1.i;
	 $display( "test is %d",test);
	 test=b2.i;
	 $display("test is %d", test);
     test=b1.a.j;
	 $display( "test is %d",test);
	end
	endmodule

由代码可以看出,我们首先创建了三个类A,B,C,其中,B声明了两个变量,且通过new函数的二次执行,创建了一个新对象b2,它内部的属性均复制自b1中的内容,这种复制方式即浅复制。然后在类B中,又声明了类A的一个变量a,并为其创建对象。
编译仿真结果如下:
在这里插入图片描述
可以看到,从b2中改变i的值,并不会影响b1所指的对象空间,相当于复制以后,b2所指的是一个新的对象。但是,当b1中含有对象时,即文中的a,此时通过浅复制并不会复制一个新的对象a出来,因此在b2中改变a.j的值,也会影响b1中a.j的值,所以j变为了50。
示意图如下:
在这里插入图片描述

深复制 (deep_copy)

为了实现深度复制,其中每一个数据成员 (包括嵌套的对象)都要被复制,一般情况下需要自定义copy函数。
为前文例子实现深复制的代码如下:

module deep_copy();
  class A;
     integer j = 5;
  endclass
  
  class B;
      integer i =1;
	
	 A a;
	 function new();
	   this.a=new();
	   endfunction
	 
	 function B deep_copy();
	   B b=new();
	   b.i=this.i;
	   b.a.j=this.a.j;
	   return b;
	 endfunction
   endclass
   
   B b1,b2;
  initial begin 
  integer test;
     b1=new();
	 b2=b1.deep_copy;
	 b2.i=10;
	 b2.a.j=50;
	 test=b1.i;
	 $display( "test is %d",test);
	 test=b2.i;
	 $display("test is %d", test);
     test=b1.a.j;
	 $display( "test is %d",test);
	 test=b2.a.j;
	 $display( "test is %d",test);
	end
	endmodule

如上可见,我们自定义了一个deep_copy函数,通过自定义函数,可以实现为类中其他类传递进来的变量创建空间。
仿真结果如下:
在这里插入图片描述
可以看到,通过自定义函数deep_copy,b2同意创建了一个对象,b2中改变j的值,不会影响b1中的值,所以b1.a.j和b2.a.j分别为5和50

UVM中实现深复制的方法

通过调用do_copy实现,do_copy方法是由copy方法调用的用户定义钩子函数。派生类应重写此方法以在复制操作中包含其字段。实现必须调用super.do_copy,并且在复制之前必须将rhs参数强制转换为 rhs_ 类型。
do_copy函数的uvm源码如下,使用时需要按照图中方式定义。

在这里插入图片描述


http://www.niftyadmin.cn/n/1788019.html

相关文章

APB协议入门

文章目录APB概述APB总线与整体SOC框架APB2.0接口示意图如下:APB总线的读写时序读时序写时序APB概述 APB协议全称:先进外围总线(Advanced Peripheral Bus) ,属于AMBA总线协议的一种。特点:低速总线,低功耗,…

SqlSessionTemplate源码解析

简介 SqlSessionTemplate是mybatis-spring中最核心的一个类,我们知道MyBatis暴露出的最外层接口是SqlSession,所有的操作都是借助SqlSession接口的方法来完成的。MyBatis本身有一个默认实现类,也是我们在单独使用MyBatis时最常见的一个实现类…

IC笔试错题总结

本文汇总了一些平时自己刷题时易错及不会做的题,以便自己随时复习回顾。 reg signed [0:4] b, b8h8f,赋值后b等于? 答案: 5‘h0F 对于长位宽赋值给短位宽的情况,无论左或右操作数是有符号或者无符号数,都是…

找“水王”

找“水王”题目要求:已知在一篇帖子中有一名“水王”,其发表帖子数目占全部的帖子数目的一半以上,现有一张表,找出该表中的“水王”。 表中具有id,id数目出现最多的就是水王。 代码如下:package Week14; import java.s…

【$fopen函数的用法】

文章目录语法介绍uvm中的用法语法介绍 $fopen函数的功能是使用给定的模式 mode 打开 filename 所指向的文件。文件顺利打开后&#xff0c;指向该流的文件句柄就会被返回。如果文件打开失败则返回 0。 $fopen函数格式如下&#xff1a; <file_desc> $fopen("", …

LeetCode 709. To Lower Case

709. To Lower Case&#xff08;转换为小写字母&#xff09; 题目&#xff1a; 实现函数 ToLowerCase()&#xff0c;该函数接收一个字符串参数 str&#xff0c;并将该字符串中的大写字母转换成小写字母&#xff0c;之后返回新的字符串。 示例 1&#xff1a; 输入: "Hello&…

uvm_analysis通信端口学习

文章目录前言与blocking_port 和blocking_export区别使用实例uvm_analysis_imp_decl宏的用法利用fifo通信前言 UVM实现通信的TLM机制中通常有put&#xff0c;get等术语&#xff0c;put操作是指通信的发起者A把一个transaction发送给B&#xff0c;而get操作指A向B索取一个trans…

学习排序算法,结合这个方法太容易理解了

排序是一个经典的问题&#xff0c;它以一定的顺序对一个数组或列表中的元素进行重新排序。而排序算法也是各有千秋&#xff0c;每个都有自身的优点和局限性。虽然这些算法平常根本就不用自己去编写&#xff0c;但作为一个有追求的程序员&#xff0c;还是要了解它们从不同角度解…