TLM是transaction Level Modeling(事務(wù)級建模)的縮寫。簡單來說,一個transaction就是把具有某一特定功能的一組信息封裝在一起而成為的一個類。
如何要在兩個uvm_component之間通信,例如實現(xiàn)monitor和scoreboard通信,最簡單的方法就是使用全局變量,在monitor里對此全局變量進行賦值,在scoreboard里監(jiān)測此全局變量值的改變。
這種方法簡單、直接,不過要避免使用全局變量,濫用全局變量只會造成災(zāi)難性的后果。
由config機制的特性可以想出另一種方法來,即從uvm_object派生出一個參數(shù)類config_object,在此類中有monitor要傳給scoreboard的變量。在base_test中,實例化這個config_object,并將其指針通過config_db#(config_object)::set傳遞給scoreboard和monitor。
當(dāng)monitor要和scoreboard通信時,只要把此config_object中相應(yīng)變量的值改變即可。scoreboard中則監(jiān)測變量值的改變,監(jiān)測到之后做相應(yīng)動作。但是一是要引入一個專門的config_object類,二是一定要有base_test這個第三方的參與。永遠不能保證某一個從base_test派生而來的類會不會改變這個config_object類中某些變量的值。
-
TLM通信中有如下幾個常用的術(shù)語:
1)put操作,通信的發(fā)起者A把一個transaction發(fā)送給B。。A具有的端口(用方框表示)稱為PORT,而B的端口(用圓圈表示)稱為EXPORT。這個過程中,數(shù)據(jù)流是從A流向B的。
2)get操作,A向B索取一個transaction。A上的端口依然是PORT,而B上的端口依然是EXPORT。這個過程中,數(shù)據(jù)流是從B流向A的。到這里,讀者應(yīng)該意識到,PORT和EXPORT體現(xiàn)的是控制流而不是數(shù)據(jù)流。
3)transport操作,A上的端口依然是PORT,而B上的端口依然是EXPORT。A依然是“發(fā)起者”,B依然是“目標”。在這個過程中,數(shù)據(jù)流先從A流向B,再從B流向A。在現(xiàn)實世界中,相當(dāng)于是A向B提交了一個請求(request),而B返回給A一個應(yīng)答(response)。所以這種transport操作也常常被稱做request-response操作。
put、get和transport操作都有阻塞和非阻塞之分。
-
PORT與EXPORT
PORT具有高優(yōu)先級,而EXPORT具有低優(yōu)先級。只有高優(yōu)先級的端口才能向低優(yōu)先級的端口發(fā)起三種操作
UVM提供對TLM操作的支持,在其中實現(xiàn)了PORT與EXPORT。對應(yīng)于不同的操作,有不同的PORT,UVM中常用的PORT有
uvm_blocking_put_port#(T);
uvm_nonblocking_put_port#(T);
uvm_put_port#(T);
uvm_blocking_get_port#(T);
uvm_nonblocking_get_port#(T);
uvm_get_port#(T);
uvm_blocking_peek_port#(T);
uvm_nonblocking_peek_port#(T);
uvm_peek_port#(T);//peek系列端口,它們與get系列端口類似,用于主動獲取數(shù)據(jù)
uvm_blocking_get_peek_port#(T);
uvm_nonblocking_get_peek_port#(T);
uvm_get_peek_port#(T);//集合了get操作和peek操作兩者的功能
uvm_blocking_transport_port#(REQ, RSP);
uvm_nonblocking_transport_port#(REQ, RSP);
uvm_transport_port#(REQ, RSP);
這15個端口中前12個定義中的參數(shù)就是這個PORT中的數(shù)據(jù)流類型,而最后3個定義中的參數(shù)則表示transport操作中發(fā)起請求時傳輸?shù)臄?shù)據(jù)類型和返回的數(shù)據(jù)類型
TLM中的操作,同時以blocking和nonblocking關(guān)鍵字區(qū)分。對于名稱中不含這兩者的,則表示這個端口既可以用作是阻塞的,也可以用作是非阻塞的,否則只能用于阻塞的或者只能用于非阻塞的。
-
下面的15種EXPORT定義與前面的15種PORT一一對應(yīng)
來源:UVM源代碼
uvm_blocking_put_export#(T);
uvm_nonblocking_put_export#(T);
uvm_put_export#(T);
uvm_blocking_get_export#(T);
uvm_nonblocking_get_export#(T);
uvm_get_export#(T);
uvm_blocking_peek_export#(T);
uvm_nonblocking_peek_export#(T);
uvm_peek_export#(T);
uvm_blocking_get_peek_export#(T);
uvm_nonblocking_get_peek_export#(T);
uvm_get_peek_export#(T);
uvm_blocking_transport_export#(REQ, RSP);
uvm_nonblocking_transport_export#(REQ, RSP);
uvm_transport_export#(REQ, RSP);
-
PORT與EXPORT的連接
為了實現(xiàn)端口間的通信,UVM 中使用connect 函數(shù)來建立連接關(guān)系。如A要和B通信(A 是發(fā)起者),那么可以這么寫:A.port.connect(B.export),但是不能寫成B.export.connect(A.port),只有發(fā)起者才能調(diào)用connect 函數(shù)。
舉例,A的代碼為
文件:src/ch4/section4.2/4.2.1/A.sv3
classAextendsuvm_component;
`uvm_component_utils(A)
uvm_blocking_put_port#(my_transaction)A_port;
endclass14
functionvoid
A::build_phase(uvm_phasephase);
super.build_phase(phase);
A_port=new("A_port",this);
endfunction19
taskA::main_phase(uvm_phasephase);
endtask
接一個EXPORT。B的代碼為
文件:src/ch4/section4.2/4.2.1/B.sv3
classBextendsuvm_component;
`uvm_component_utils(B)
uvm_blocking_put_export#(my_transaction)B_export;
…endclass
functionvoidB::build_phase(uvm_phasephase);
super.build_phase(phase);
B_export=new("B_export",this);
endfunction19
taskB::main_phase(uvm_phasephase);
endtask
在env中建立兩者之間的連接:
文件:src/ch4/section4.2/4.2.1/my_env.sv4
class my_env extends uvm_env;
A A_inst;
B B_inst;
…
virtual function void build_phase(uvm_phase phase);
…
A_inst = A::type_id::create("A_inst", this);
B_inst = B::type_id::create("B_inst", this);
endfunction
…
endclass
function void my_env::connect_phase(uvm_phase phase);
super.connect_phase(phase);
A_inst.A_port.connect(B_inst.B_export);
endfunction
-
FPGA
+關(guān)注
關(guān)注
1630文章
21803瀏覽量
606464 -
通信
+關(guān)注
關(guān)注
18文章
6081瀏覽量
136493 -
TLM
+關(guān)注
關(guān)注
1文章
32瀏覽量
24785
原文標題:UVM里的TLM通信機制
文章出處:【微信號:FPGA學(xué)姐,微信公眾號:FPGA學(xué)姐】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論