1. 程式人生 > 其它 >UVM factory機制相關的原始碼解析

UVM factory機制相關的原始碼解析

虛擬碼框架可以參考: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多次(兩次以上)操作的時候,是用下一次的覆蓋掉還是不覆蓋