uvm學習雜記
一個類,只定義了而沒有實例化,是沒有任何意義的,但也有特殊情況,對于一個靜態類,即其成員變量都是靜態的,不實例化也可以正常使用;
類要想和DUT通信,不能在類里定義接口,會報錯,只能在類里定義虛擬接口;若直接基于sv的測試平臺中是在new函數中調用接口,在UVM中則通過uvm_config_db::get來得到從top module傳遞而來的interface;
UVM中,各個component(driver,monitor等功能部件)通信使用TLM事務級模型方式,其中要發送信息的一方,使用uvm_analysis_port#(my_transaction),是UVM庫中的一個參數化的類;
driver是最底層的,這里不必進行實例化,只需在build_phase中,也要完成類的實例化工作,只需調用super.build_phase(phase);In_agent實現driver,monitor,sequencer的實例化,而In_agent的實例化則在env的build_phase中完成;
build_phase中除了完成實例化之外,還要完成config_db機制的get行為,即把其它component設置給此component的一些參數接收過來;
任何一個派生自uvm_component類的主要的動作都是在main_phase中完成的,main_phase的第一句話是super.main_phase,即調用父類的main_phase;seq_item_port是用于連接driver和sequencer的一個端口,driver如果想要發送數據就要從這個端口獲得;sequence如果有數據要給driver,也要通過這個端口給driver;seq_item_port中my_driver的父類中,即uvm_driver類中,它的實例化也是在uvm_driver的build_phase中完成的;
agent有兩種形式,UVM_PASSIVE和UVM_ACTIVE,以前者方式運轉的agent只監測總線而不驅動總線;以后者方式運行的agent驅動總線,也可以監測總線;
uvm_blocking_get_port也是一個TLM事務級端口,用來接收一個uvm_analysis_port發送的信息,而uvm_analysis_port是發送信息的;uvm驗證平臺的各個組件之間通過這兩個端口來實現事務級別通信;
scoreboard中一般使用一個隊列來暫存從reference model得到的期望數據;
uvm驗證平臺可以使用uvm_tlm_analysis_fifo把uvm_blocking_get_port和uvm_analysis_port連接;
在uvm中,即使driver,monitor,reference model和scoreboard的main_phase都是無限循環的,但是也不需要顯式的調用finish,只需要使用objection機制即可。在發包之前,通過調用startingphase.raiseobjection(this)告訴UVM可以開始發包了,當包發送完后,調用startingphase.dropobjection(this)來告訴UVM可以使用finish,只需要使用objection機制即可。在發包之前,通過調用startingphase.raiseobjection(this)告訴UVM可以開始發包了,當包發送完后,調用startingphase.dropobjection(this)來告訴UVM可以使用finish了;當調用drop_objection時,UVM會檢查其它的component的objection是否已經被drop了,直到被drop后,才會調用$finish.
在program頂層,調用run_test()函數會create tc-->create env。調用run_test后,會自動創建一個env的實例,會自動調用env中的main_phase。所有派生自uvm_component及其派生類的類,都應該使用uvm_component_utils宏來注冊。在uvm驗證平臺中,只要一個類使用uvm_component_utils注冊,切此類被實例化了,那么這個類的main_phase會自動被調用。
uvm驗證平臺的開啟和關閉,一般是在main_phase中,通過raise_objection和drop_objection來開啟和關閉。
在uvm的build_phase中,一定要使用super.build_phase(phase);語句來聲明,否則的話,uvm的樹形結構就無法建立起來,這一點要牢記。
使用uvm進行編程,要對uvm的基類比較熟悉。想實現一個功能的時候,首先要知道從uvm的哪個基類里面來派生。比如說,所有的transaction,都必須從uvm_sequence_item這個uvm的基類來派生。
uvm_driver中預先定義好了一個任務,叫做main_phase,UVM由phase來管理驗證平臺的運行。可以簡單地認為,實現一個driver,就是實現uvm_driver::main_phase這個task任務。
有時候如果不知道當前代碼的層次結構,可以使用get_full_name函數來獲取。不過get_full_name函數只能用于component組件,無法應用于object組件,因為只有component組件才構成了uvm的樹形結構。可以使用`uvm_info("DEBUG",get_full_name(),UVM_LOW)在uvm component組件中。

浙公網安備 33010602011771號