UVM學習筆記--TLM通信

Table of Contents

1.TLM簡介

2.UVM TLM基本概念

2.1 TLM 通信常用的的三種傳輸:Put/Get/Transport

 2.2 TLM 通信中的三種端口:Port,Export,IMP

2.3  Put/Get/Transport等動作的實現

2.4 跨層次連接

3. 所有常用的一對一Port類型的總結 

4. Analysis端口(一對多連接)

5. TLM FIFO

5.1兩種TLM FIFO:

5.2TLM FIFO自帶的方法



1.TLM簡介

TLM:Transaction Level Modeling(事務級建模),它是一個獨立於語言的一個標準,常用於系統建模,加速軟硬件協同開發。在芯片開發中,常配合system C使用來進行系統設計。最新的標準是OCSI TLM 2.0。

2.UVM TLM基本概念

2.1 TLM 通信常用的的三種傳輸:Put/Get/Transport

  1. Put 操作

               Port A是put動作發起者,Export B是動作接收者,數據流A->B. 實現A主動向B發送數據。

             2.Get 操做

              Port A是get動作發起者,Export B是動作接收者,數據流B->A. 實現A主動向B索取數據。

 

            3.Transport 操做

              Port A是transport動作發起者,Export B是動作接收者。transprot操作相當於一次put加一次get。A先發起put操作,相當於提交一個request,數據從A->B, 後通過get返回response,數據從B->A. 

          在示意圖上常常用方框表示Port,圓圈表示Export。 

           其他TLM操作還有peek,get_peek兩種,但實際應用較少。

 2.2 TLM 通信中的三種端口:Port,Export,IMP

1. 控制流優先級:Port > Export > IMP

2. Port 始終是傳輸動作的發起者,Export和IMP只能作爲動作的接受者。

3. 使用connect()建立連接關係時,只有優先級高的才能調用connect()做連接。

4. 三種端口均是uvm_component的子類,但應該使用new()函數在build_phase中創建。(注意:不能用create創建,端口  不屬於UVM樹的一部分)。

5. 在有Port,Export,IMP連接的data path中,只有且必須以IMP作爲終點。

6. Port,Export相當於一道門,沒用存儲作用,因而必須以IMP(tlm implement port class)作爲終點。

7. IMP 在聲明時相較於Port/Export多了一個類型參數'IMP'

uvm_nonblocking_put_export#(T)

uvm_blocking_put_imp#(T, IMP); // 第一個參數T是這個IMP傳輸的數據類型。 第二個參數IMP爲包含該IMP的component類型。

例如:

class B extends uvm_component;
   ...
     uvm_blocking_put_export#(my_transaction) B_export;
     uvm_blocking_put_imp#(my_transaction, B) B_imp;
   ...
endclass

 

2.3  Put/Get/Transport等動作的實現

發起者的動作實現,最終會落到終點IMP所在的component中,因此必須在IMP所在的component中定義名字爲put/get/transport的函數或任務,完成最終的數據傳輸操作。在blocking的端口,可以將put/get/transport定義爲function或task;而noblocking的端口,則只允許定義成function。

下面這個例子,路徑是 A.port-->B.export-->B.imp, 當A.port調用put()時,這個任務會調用B.export的put(),B.export的put()又會調用B.imp的put(),而B.imp的put()最終會調用B.put(). 因此用戶必須在B中定義put() 函數/任務。

2.4 跨層次連接

在複雜的UVM TB中常用到port跨多級component連接的情形,在一個path中,始終只會有一個imp作爲連接的結尾。


在多層次連接中,connect要按控制流逐層進行連接。

3. 所有常用的一對一Port類型的總結 

以上這些port默認都是一對一連接,除非在實例化時改變默認的連接數量設置參數,如使用new()創建時改變參數min/max_size的值

function new (string name,
              uvm_component parent,
              int min_size=1,
              int max_size=1)

UVM端口思維導圖

4. Analysis端口(一對多連接)

  • analysis_port/export和analysis_imp的通信是一對多的通信,類似廣播的形式。
  • analysis端口沒有blocking/unblocking的概念,因爲他管廣播內容,不管接受的收到與否。
  • 只有一個操作:write()
  • analysis端口連接也必須以analysis_imp結尾。
  • 一個component中有多個analysis_imp時,因爲需要實現多個同名但內容不同的write函數時,該怎麼辦?UVM定義了`uvm_analysis_imp_decl(xxx) 宏來處理這種複雜情況。

5. TLM FIFO

 

TLM FIFO相當於一個緩存兩端加上IMP,input和output兩端都能連接Port,所以兩側和它連接的component都能主動發送或索取數據。

5.1兩種TLM FIFO:

  • uvm_tlm_fifo: 包含analysis 端口以外的多有端口,不支持write操作。
  • uvm_tlm_analysis_fifo: 含有下圖中的所有端口,支持write操作。

  • peek()區別於get()的地方是,peek()不會使FIFO緩存裏的transaction個數減少。
  • 連個特殊的analysis port:put_ap和get_ap, 有向第三方轉發的作用.

        put_ap:即當往fifo的buffer寫入一筆transaction,這個transaction同時會通過put_ap寫到第三方component中.

        get_ap:即從fifo的buffer讀出一筆transaction,這個transaction自然會發從fifo get export連接的component,但同時會通過put_ap寫到第三方component中.

       就像fifo分了個叉,從這個叉上可以把fifo正在put/get的內容發給第三方,從而可以窺探fifo內部正在處理的transaction。

  • FIFO中的許多export雖然表面的名字是export,但實際的類型是IMP,UVM掩飾類IMP的存在。
  • FIFO的好處是不用手動再寫write(),put(),get()這些component中要聲明的同名函數。

5.2TLM FIFO自帶的方法

used:查詢fifo裏存了多少transaction

is_empty: 判斷當前fifo是否爲空

is_full: 判斷當前fifo是否滿了

flush:清空fifo中緩存的數據,復位時可以用

TLM FIFO默認的深度是1,如果需要更改,可以在new()是更改參數size的值,如需要無限大小,就將傳入的size參數設爲0。

new函數原型爲:

       function new(string name, uvm_component parent=null, int size=1);

 


參考
UVM實戰(卷1) (張強 著)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章