[UVM]コピー対象

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函数

 

公開された89元の記事 ウォン称賛17 ビュー40000 +

おすすめ

転載: blog.csdn.net/lbt_dvshare/article/details/88734811