uvm的callback必須是提供者有預見性的留一些方法在function先後,這樣在使用的時候,進行遍歷調度便可 函數
設計者,須要從uvm_callback定義一個基類,只定義function原型,定義一個uvm_callbacks,即pool類型;設計
在對象類中使用register_cb宏來註冊callbacks; 3d
使用者,須要從指定的uvm_callback擴展出一個實現類,並將該類的一個對象add到對應的pool中;對象
callbacks中有兩個參數,一個表示object,一個表示具體的callback,由於一個object可能有多個callback;blog
typed_callback,中只有一個參數,表示object;繼承
callbacks_base,則通用的定義了一個uvm_pool,m_pool,以object爲索引,返回uvm_queue類型的隊列;遞歸
callbacks_base,從uvm_object繼承而來,單實例化設計,其中定義了兩個static變量,因爲並非一個參數化的類;索引
因此m_b_inst和m_pool在系統中,只有一份;隊列
uvm_typed_callbacks從uvm_callbacks_base繼承而來,參數化的類,以callback對應的object爲參數;get
其中定義了兩個參數化的變量;變量m_t_inst,隊列m_tw_cb_q;
因此兩個static變量根據paramter的不一樣會有不少份;
uvm_callbacks從uvm_typed_callbacks,繼承而來,有兩個參數,object和callback,
其中定義了兩個主要的static變量,m_inst,m_base_inst,m_base_inst只與object類型有關;
因此不一樣的object和callback,m_inst都還有多份;
uvm_register_cb(T,CB)的define;
調用了一個uvm_callbacks的function, m_register_pair,而且新定義了一個變量來接收返回值;
1)首先必須在uvm_callback擴展的時候,定義一個uvm_callbacks的class;
m_register_pair一個static的函數,調用get函數,以後遞歸調用initial function,實現全部static變量的定義;
2)uvm_typeid獲得static的實例化typeid_base的class;
3)註冊m_typeid和m_cb_typeid的值到uvm_typeid_base的static變量中;一個object的參數化類,一個callback的參數化類;
m_base_inst中push back全部的m_inst,即callbacks的種類;
add function,static類型,將object和相應的callback加到對應的callbacks中;
首先調用get函數,此時各個inst都不是null,不會執行代碼;若是callback爲null,報錯;
從m_pool中拿到指定object的callback queue;若是爲null,新建一個;
若是對應的callback已經加到對應的object的queue中,報warning;不然根據order的類型,進行push操做;
不一樣的order順序,決定了定義同一object的callback的執行順序;
若是add的時候,object的值爲null,則將callback加到本身類型的queue中;
add_by_name,static function只是在uvm_root中進行find函數調用,查找指定name的comp,在調用add函數;
找到的comp隊列都加入callback;
delete函數,static類型,拿到m_pool中的隊列,刪除相應的callback,找不到相應的callback,報warning;
若是delete的時候,傳入的object的值爲null,則刪除該類型中的queue中的callback;
delete_by_name相似。
提供給其餘class的static函數 實現;
get_first;先拿到該comp類型的對象(null),或者某個對象的callback隊列;
若是沒有add進m_pool中,則也進行add操做;
get_last,get_prev,get_next,相似,可是須要顯示指定itr的值;
使用時也能夠調用宏ucm_do_obj_callbacks進行遍歷調用;