callback源碼分析——callbacks

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進行遍歷調用;

      

相關文章
相關標籤/搜索