【UVM原始碼學習】uvm_registry

MangoPapa發表於2020-12-14


  如果對每個factory註冊的component/object都建立其例項,記憶體、模擬/編譯的開銷會很大。為了減小這種開銷,可以採用uvm_registry對factory註冊的componnet/object類建立一個輕量級的代理(僅含有get/get_type/get_type_name等方法),只有使用到該component/object時才手動建立其例項(type_name::type_id::create(name,parent),只有使用uvm_component_utils這類巨集註冊的才能使用type_name:;type_id::create,type_def直接定義的沒有type_id)。

  uvm_registry.svh 中主要實現了兩個類,uvm_component_registry及uvm_object_registry,分別為component及object的代理類。兩個類均直接派生自uvm_object_wrapper。類中實現的主要方法有:

序號方法描述
1create_component建立component
2create_object建立object
3get_type_name返回type_name
4get呼叫uvm_object的get,若get()為null,factory.register()並返回
5create呼叫factory的create_component_by_type來例項化類。只有使用uvm factory機制註冊的類才能使用type_name::type_id::create的方式進行例項化
6set_type_override呼叫了factory的set_type_override_by_type
7set_inst_override呼叫了factory的set_inst_override_by_type


  可以採用以下方法來註冊component代理:

type_def uvm_component_registry #(mycomp, “mycomp”) type_id;

  不同模擬器實現方法或存在不同,常用方法是採用以下巨集:

`uvm_component_utils(mycomp)  //非引數化的類
`uvm_component_param_utils(mycomp, #(T)) // 引數化的類:


  對於引數化的類,由於傳進來的type_name不固定,因而採用uvm_component_param_utils及uvm_object_param_utils巨集註冊引數化類的時候,沒有實現get_type_name的方法,即採用以上兩個巨集註冊的引數化的類不能使用get_type_name。引數化的類本意是通過傳入引數消除多個type_name相同的類之間的干擾,因而不建議通過type_name在uvm_factory中查詢相關類。

相關文章