Table of Contents
2.1 TLM 通信常用的的三種傳輸:Put/Get/Transport
2.2 TLM 通信中的三種端口:Port,Export,IMP
1.TLM簡介
TLM:Transaction Level Modeling(事務級建模),它是一個獨立於語言的一個標準,常用於系統建模,加速軟硬件協同開發。在芯片開發中,常配合system C使用來進行系統設計。最新的標準是OCSI TLM 2.0。
2.UVM TLM基本概念
2.1 TLM 通信常用的的三種傳輸:Put/Get/Transport
- 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)
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) (張強 著)