SV中的shadow copy和deep copy的区别

SV中shadow copy和deep copy的区别

1.1 shadow copy ,是一种简易复制,类似于原对象的影印本,只拷贝原对象的内容,不拷贝对象(用new操作符)

class Transaction;
        bit[31:0]addr,crc,data[8];
endclass

Transaction src,dst;
initial begin
        src=new;//创建第一个对象
        dst=new src//使用new操作符进行复制
        end

1.2如果类中包含一个指向另一个类的句柄,那么只有高一级的对象(变量和句柄)被new复制,下层的对象不会被复制(复制后,两个对象指向同一个低一级的对象!)

class Transaction;
      bit [31:0] addr,crc,data[8];
      statistics stats;
      static int count=0;
      int id;

      function new;
           stats=new();
           id=count++;
      endfunction
endclass      
      
Transaction src,dst;
     initial begin
     src=new();
     src.stats.startT=42;
     dst=new src;
     dst.stats.startT=96;
     display(src.stats.startT);

在使用new操作符进行拷贝之前,dst为空;使用new操作符进行复制之后,src中变量和句柄的值被复制(但是不会调用new函数,所以两个Transaction对象的id值相同,并且指向同一个statistics对象!)
SV中的shadow copy和deep copy的区别_第1张图片
使用new操作符进行复制之后的对象和句柄

2、 deep copy 可将拷贝对象中所包含的对象拷贝过来(自定义copy函数,copy调用了new函数)

class Transaction;
      bit [31:0] addr,crc,data[8];
      statistics stats;
      static int count=0;
      int id;

      function new;
           stats=new();
           id=count++;
      endfunction

      function Transaction copy;
          copy=new();
          copy.addr=addr;
          copy.data=data;
          copy.crc=crc;
          copy.stats=stats.copy();
          id=count++;
      endfunction
endclass 

Transaction src,dst;
   initial begin
     src=new();
     src.stats.startT=42;
     dst=src.copy();
     dst.stats.startT=96;
     $display(src.stats.startT);
   end

SV中的shadow copy和deep copy的区别_第2张图片
经过深拷贝后的对象和句柄

你可能感兴趣的:(SV)