1. 使用new操作符复制一个对象
1 class Header; 2 int id; 3 function new (int id); 4 this.id = id; 5 endfunction 6 7 function showId(); 8 $display ("id=0x%0d", id); 9 endfunction 10 endclass 11 12 class Packet; 13 int addr; 14 int data; 15 Header hdr; 16 17 function new (int addr, int data, int id); 18 hdr = new (id); 19 this.addr = addr; 20 this.data = data; 21 endfunction 22 23 function display (string name); 24 $display ("[%s] addr=0x%0h data=0x%0h id=%0d", name, addr, data, hdr.id); 25 endfunction 26 endclass 27 28 module tb; 29 Packet p1, p2; 30 initial begin 31 // Create a new pkt object called p1 32 p1 = new (32'hface_cafe, 32'h1234_5678, 26); 33 p1.display ("p1"); 34 35 // Shallow copy p1 into p2; p2 is a new object with contents in p1 36 p2 = new p1; 37 p2.display ("p2"); 38 39 // Now let's change the addr and id in p1 40 p1.addr = 32'habcd_ef12; 41 p1.data = 32'h5a5a_5a5a; 42 p1.hdr.id = 17; 43 p1.display ("p1"); 44 45 // Print p2 and see that hdr.id points to the hdr in p1, while 46 // addr and data remain unchanged. 47 p2.display ("p2"); 48 end 49 endmodule
这是一种简易复制(shallow copy),原对象的值被盲目copy到对象中,如果类A1中包含一个指向另一个子类B的句柄,那么复制类A2中只是复制了子类B的句柄,A1和A2中的B对象指向的是同一个对象。
2. 定义copy函数,实现深拷贝
1 class Header; 2 int id; 3 function new (int id); 4 this.id = id; 5 endfunction 6 7 function showId(); 8 $display ("id=0x%0d", id); 9 endfunction 10 endclass 11 12 class Packet; 13 int addr; 14 int data; 15 Header hdr; 16 17 function new (int addr, int data, int id); 18 hdr = new (id); 19 this.addr = addr; 20 this.data = data; 21 endfunction 22 23 function copy (Packet p); 24 this.addr = p.addr; 25 this.data = p.data; 26 this.hdr.id = p.hdr.id; 27 endfunction 28 29 function display (string name); 30 $display ("[%s] addr=0x%0h data=0x%0h id=%0d", name, addr, data, hdr.id); 31 endfunction 32 endclass 33 34 module tb; 35 Packet p1, p2; 36 initial begin 37 p1 = new (32'hface_cafe, 32'h1234_5678, 32'h1a); 38 p1.display ("p1"); 39 40 p2 = new (1,2,3); // give some values 41 p2.copy (p1); 42 p2.display ("p2"); 43 44 // Now let's change the addr and id in p1 45 p1.addr = 32'habcd_ef12; 46 p1.data = 32'h5a5a_5a5a; 47 p1.hdr.id = 32'h11; 48 p1.display ("p1"); 49 50 // Now let's print p2 - you'll see the changes made to hdr id 51 // but not addr 52 p2.display ("p2"); 53 end 54 endmodule
来源:https://www.cnblogs.com/littleMa/p/12345263.html