有5個uvm component class:A, B, C, D, E,需要把一個transaction從A通過B, C, D傳到E,怎麼傳輸?
方法一:使用TLM通信傳輸,利用多層PORT端口級聯實現,如圖1所示。
A component的代碼爲:
B component的代碼爲:
C component和D component的代碼類似於B component。在每個component中定義一個uvm_blocking_put_port端口(PORT)和次內層component的句柄,然後再build_phase中實例化,最後在connect_phase中連接起來。
E component的代碼爲:
env的代碼爲:
TLM是Transaction Level Modeling(事務級建模)的縮寫,它起源於SystemC的一種通信標準。TLM通信中有三個常用的術語:put操作、get操作和transport操作。有三種端口PORT、EXPORT和IMP。在UVM中,只有IMP才能作爲連接關係的終點,如果PORT或者EXPORT作爲終點,則會報錯。
除了以上三種端口外,UVM中還有兩種特殊的端口:analysis_port和analysis_export,用於傳遞transaction。analysis_port和analysis_export如果直接相連會出錯,只有在analysis_export後面再連接一級uvm_analysis_imp纔不會出錯。
在此基礎上,可以引入FIFO來進行通信,FIFO的本質是一塊緩存加兩個IMP。FIFO中的analysis_export和blocking_get_export雖然名字中有關鍵字export,但是其類型卻是IMP(uvm_analysis_imp)。
不過無論使用FIFO還是使用IMP,都能實現同樣的目標,兩者各有其優勢與劣勢,在實際應用中,讀者可以根據自己的習慣來選擇合適的連接方式。