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)
沒有留言:
張貼留言