class Based #(type T=int unsigned); T val; function new (T v=0); val = v; // assign new val endfunction : new virtual function void deep_copy(Based b); assert(b!=null); b.val = val; // b.val = this.val endfunction : deep_copy virtual function void shadow_copy(Based b); assert(b!=null); b.val = val; // b.val = this.val endfunction : shadow_copy virtual function bool eq(Based b); return b.val == val; endfunction : eq endclass : Based class A #(type T=int unsigned) extens Based; T val_a function new (T v=0); super.new(); val_a = v; // assign val_a endfunction : new virtual function void deep_copy(A a); assert(a!=null); Based b; a.val_a = val_a; $cast(b,a); super.deep_copy(b); // or // a.val_a = val_a // a.val = super.val endfunction : deep_copy // operator overwrite ... eq, lt, lt, ... virtual function bool eq(A a0); assert(a0!=null); Based b0; $cast(b0,a0); return val_a == a0.val_a & super.eq(b0); endfunction : eq endclass : A A a0 = new(1); A a1 = new(2); a0.val_a = 3; a0.val = 2; a0.deep_copy(a1); // check a0, a1 contains are eq a0 = a1 assert(a0.eq(a1));
2013年5月21日 星期二
deep copy or shadow copy in your systemverilog object
as the same methodology as c/c++ or any languages. we usually used copy function to copy trx to avoid the overwrite trx when the trx had new ptr triggered. this is an sample example about what's the difference between deep copy and shadow copy, in short word. deep copy is top down copy, copy from this(current) level info to it's parents info. shadow copy is template current level copy, only for this level info.
訂閱:
張貼留言 (Atom)
沒有留言:
張貼留言