UVM factory機制相關的原始碼解析
阿新 • • 發佈:2022-04-01
虛擬碼框架可以參考:https://www.processon.com/view/link/6246bd177d9c080724722a9e
其實UVM factory機制的基本原理非常簡單,可以參考之前的一個高階精簡的例子來做說明:https://www.cnblogs.com/xuqing125/p/16087807.html
我們以object為例子,進行分析,component其實是完全相似的。
uvm_object_utils(T)對應的巨集定義,這其實是我們使用者能看到的介面。
- 在從uvm_object型別的class裡面擴充套件一個類(比如說是A)的時候,我們通常會呼叫uvm_object_utils(T)這個巨集。
- 重要的就是uvm_object_registry_internal(T)的實現。
- type_id其實相當於在class A裡面又聲明瞭一個class type_id,所以呼叫uvm_object_registry中的static函式create的時候要用A::type_id::create
- A::get_type()實際上是呼叫的A::type_id::get()的函式。
class uvm_object_registry
- 兩個引數的型別,一個是class的型別,一個是string name;
- local static this_type me=get(),static修飾的變數會在initial之前進行準備好,也就是說只要呼叫了uvm_object_utils(T)這個巨集,uvm_object_registry(T,"T")就會呼叫get然後register到factory中去。
- 通常my_agent::type_id::creat("i_agent",this),從使用者角度來看的話,create函式就是呼叫的這裡的函式。
- 重點的例項化都是在factory裡面。
uvm_factory.svh
- 所謂的register到factory中,其實就是對兩個關聯資料進行賦值。
- 然後後續的create_object_by_type/create_object_by_name都是依據這個關聯陣列進行查詢建立例項的。
- find_override_by_type()是實現override的操作
- create_object(name)其實就是對應例項化的操作。
- m_type_overrides[]這個關聯陣列至關重要,它儲存了override的資料型別。
- find_override_by_type會進行依次迭代尋找。
- set_type_override_by_type()將會對m_type_overrides這個關聯陣列進行賦值。
- 引數replace的作用是用在對同一個class多次(兩次以上)操作的時候,是用下一次的覆蓋掉還是不覆蓋