UVMは、フィールドの自動化メカニズムを提供している、UVMは、コピー機能と私の問題について話をするなど、印刷、複製、コピー......、今日のように組み込み関数を使用することができます。
class cfg1 extends uvm_object;
int id;
....
endclass
===============================================================
class cfg2 extends uvm_object;
int id;
cfg1 sub_cfg;
function new(string name = "cfg");
super.new(name);
sub_cfg = cfg1::type_id::create("sub_cfg");
endfunction
endclass
===============================================================
class ref extends uvm_component;
...
cfg2 o_cfg;
cfg1 s_cfg;
virtual function void build_phase(uvm_phase phase)
super.build_phase(phase);
if(!uvm_config_db#(cfg2)::get(this,$sformatf("o_cfg2"),"cfg",o_cfg))
`uvm_fatal(...)
s_cfg = o_cfg.sub_cfg;//保存了sub_cfg的handle
endfunction
endclass
クラスCFG2の実施例は、変数int型とCFG1オブジェクトを含む更新CFG2 run_phaseコピー関数呼び出しの場合:
o_cfg_ary = cfg2::type_id::create("o_cfg_ary");
o_cfg_ary.sub_cfg.id = 2;
o_cfg.copy(o_cfg_ary);
o_cfg更新した後、REFまだ元の値を取得します!!!!
根本的な原因:
コピー機能は、ある深いコピー、コピー中のオブジェクトCFG2のでsub_cfg REALLOCATEメモリ空間、すなわち、ハンドルアドレス変更。
PS:コピー機能のコピーが唯一のフィールドの自動登録変数やオブジェクトを使用します。
一般的にはbuild_phase 使用Config_dbの転送ハンドルを中央の場合は、一度、渡さハンドル上の例の変化は、使用したいコピー機能変更ID (保証ハンドルアドレスの変更、のみ更新内容)が、o_cfg .sub_cfg ハンドルアドレス生成変更、およびrefはアドレスsub_cfgハンドルを保持しているハンドル得る必要が生じのクラスのgetをにハンドルがまだ元のメモリ空間を指しています。
refはsub_cfg o_cfg.sub_cfg.idで採用されている場合は1、コピー機能は、(さえ影響しないo_cfg.sub_cfg ハンドルアドレスの変更には影響しません)。
で参照した場合2. 「s_cfg = o_cfg.sub_cfg」保存sub_cfgハンドルアドレスが、しかしハンドルアドレス変更o_cfg.sub_cfg、sub_cfgが新たに割り当てられたスペースを指すことはできません、更新後の値を取得することはありません。
解決:
o_cfg_ary = cfg2::type_id::create("o_cfg_ary");
o_cfg_ary.sub_cfg.id = 2;
o_cfg.copy(o_cfg_ary);
o_cfg.sub_cfg.copy(o_cfg_ary.sub_cfg);//递归调用copy函数