1. 程式人生 > >tlm源碼分析——interface class和port_base

tlm源碼分析——interface class和port_base

關系 virt ext 繼承類 純粹 try 表示 connect cast

uvm官方提供的兩種interface有:uvm_sqr_ifs和uvm_tlm_ifs;

兩種interface都是定義了各個TLM API function的原型;都是單獨的class,並沒有進行extend;

uvm_tlm_if,包含兩個參數化的type定義;

      put類函數,一個task,兩個function:

       can_put只是返回值,並不會將trans寫出去;

       技術分享

       get類函數,一個task,兩個function;

       技術分享

       peek類函數,一個task,兩個function;

       技術分享

       transport類函數,有兩個參數,一個input,一個output;

       transport 是一個block的task,nb_transport是一個non block的function;

       技術分享

       write類函數,進行broadcast;

       技術分享

uvm_sqr_if,包含兩個參數化的type定義;主要定義在driver和sequencer之間;進行item和resp的傳遞;

      get_next_item。block的peek函數,只有在item_done返回之後,才重新get出fifo中的值;

       技術分享

      try_next_item,只是try_peek函數,沒有available的情況下,返回null;

       技術分享

      item_done,sequencer收到之後,刪除其中fifo中的值;

       技術分享

      sequencer中的兩個function;等待sequence item ready;

       技術分享

      純粹tlm的function,不涉及sequencer以及driver之間的item溝通,

       技術分享

      兩個item_recording的function;

       技術分享

virtual class uvm_port_component_base,定義function原型,從component繼承過來;

       技術分享

繼承類;參數化的類,uvm_port_component,其中的參數化type,為uvm_port_base類型;

      主要是為了包含一個該type類型的變量;執行變量中的其他操作;

uvm_port_base,參數化的類,type指tlm_ifs,sqr_ifs;

      內部包含一個uvm_port_component #(this_type) m_comp的變量,從而實現comp和port_base的綁定;

    內部變量,有一個m_if,主要為了實現具體的ifs的操作,

          m_imp_list,保存該port或export連接到的m_imp_list,

          m_port_type,表示該port的類型,為extend class使用, 

其中最重要的一個function;connect函數

      首先connect這個函數不能再elabration的phase執行;必須在build或者connect phase執行,由於build中執行先後順序的問題

      一般放在connect phase;參數名為provider,也就是只有主動的一方才能調用;

      技術分享

      技術分享

      provider為null或this時,也會報error,接著檢查m_If_mask的值是否相同,不同的port在new時,mask都是不同的;

      技術分享

      如果調用該方法的對象是imp,直接報錯;imp不允許使用connect;

      技術分享

      檢查relationship的級聯關系,在將兩個對象中的m_provided_by以及m_provided_to進行初始化;

        主要功能只是實現內部provider和provided的賦值;

      技術分享

check_relationship的函數,主要檢查port與port的連接,且最開始是一個port;且時child的port連接parent的port;否則報warning;

      技術分享

        port連接到export和imp,必須是同一env下的不同comp之間;

      技術分享

        export連接到export或者imp,必須是parent到child的;

      技術分享

resolve_bindings函數,在end_of_elabration的phase進行自動的遞歸調用,實現imp和port的組裝;

      uvm_root從uvm_component繼承而來;重載了phase_started的function,在end_of_elaboration,自動調用

      do_resolve_bindings;

      技術分享

      uvm_component中,對child進行遍歷;

      技術分享

      port_base中的實現,更新class中的imp_list哈希,如果本身是imp,裏邊只有自己;

        否則根據connect函數,賦值的provided_by哈希,在imp_list中添加對象;

        m_resolved,防止一個port被反復添加imp;

      技術分享

        接著判斷imp的個數問題,之後更新內部的m_imp,指向第一個imp_list中的第一個;

      技術分享

m_add_list function,在provider中拿到他的imp_if;所以port,port,export之間可以級聯;指向的imp都是同一個imp;

      技術分享

tlm源碼分析——interface class和port_base