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中完成;ui

build_phase中除了完成實例化以外,還要完成config_db機制的get行爲,即把其它component設置給此component的一些參數接收過來;this

任何一個派生自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中完成的;component

agent有兩種形式,UVM_PASSIVE和UVM_ACTIVE,之前者方式運轉的agent只監測總線而不驅動總線;之後者方式運行的agent驅動總線,也能夠監測總線;接口

uvm_blocking_get_port也是一個TLM事務級端口,用來接收一個uvm_analysis_port發送的信息,而uvm_analysis_port是發送信息的;uvm驗證平臺的各個組件之間經過這兩個端口來實現事務級別通訊;seo

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組件中。

相關文章
相關標籤/搜索