注1:采用fifo,用戶可以不用定義put/get/write等函數或任務;
1.uvm_tlm_analysis_fifo(參數化的類)
(1) uvm_tlm_analysis_fifo中的*_export,雖然名字中有export,但是本質上都是IMP;
(2) uvm_tlm_analysis_fifo內的緩沖使用system verilog中的mailbox實現;
(3)需要補充fifo的相關函數,如put,get,try_put,try_get;
注:下圖表示當sb收到monitor通過ap傳來的result時,會從cmd_f中pop trans,得到cmd信息,根據cmd信息計算expected result,並與actual result進行比較;
注:注意下圖中uvm_tlm_analysis_fifo.try_get(cmd)的使用;
注:下圖為env中uvc間的連接;
2.uvm_tlm_fifo與uvm_tlm_analysis_fifo
(1) uvm_tlm_fifo與uvm_tlm_analysis_fifo為FIFO的兩種類型(本質為uvm_component);
(2) 二者的差異在於uvm_tlm_analysis_fifo有一個analysis_export端口,並且有一個write函數,而uvm_tlm_fifo沒有;
3.使用FIFO通信
(1) FIFO的本質是一塊緩存加兩個IMP,可以在實例化時,通過指定fifo的size參數來指定FIFO緩存的上限, 默認情況下為1. 若要把緩存設置為無限大小,將傳入的size參數設置為0即可.
function new(string name, uvm_component parent=null, int size=1);
(2)fifo的函數size與flush
注1:size函數可以返回fifo緩存的上限值;
注2:flush函數可以用於清空FIFO緩存中的所有數據,一般用於復位等操作;
(3) 在monitor與FIFO的連接關系中, monitor依然是analysis_port, FIFO中是uvm_analysis_imp,數據流和控制流的方向相同;
(4) 在scoreboard與FIFO的連接關系中, scoreboard中采用blocking_get_port端口. FIFO中使用的是一個get端口的IMP,在這種連接關系中, 控制流是從scoreboard到FIFO, 而數據流是從FIFO到scoreboard.
(5) FIFO中的analysis_export和blocking_get_export雖然名字中有關鍵字export,但是其類型是IMP.