uvm學習雜記

宙斯黃發表於2018-01-21

一個類,只定義了而沒有例項化,是沒有任何意義的,但也有特殊情況,對於一個靜態類,即其成員變數都是靜態的,不例項化也可以正常使用;

類要想和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元件中。

 

相關文章