phase機制:
uvm中根據是否消耗時間將phase分為function phase和task phase; uvm中所有的Phase的會按照自上而下的順序執行;對於function phase, 比如build_phase, connect_phase等,在同一時間只有一個phase在執行;但是對於task phase, run_phase和reset_phase, main_phase等12個Phase是並行進行的,此12個phase稱為動態運行的Phase;
動態運行的Phase有12個,其中reset, configure, main, shutdown四個phase是核心;
objection機制:
在驗證平台中,可以通過drop_objection通知系統可以關閉驗證平台,在drop_objection之前一定要raise_objection;當進入某一phase時,UVM會收集此phase提出的所有的objection,並實時監測objection是否已經被撤銷了,當發現所有都已經撤銷后,會關閉此phase,開始進入下一個phase, 當所有的phase執行完畢后,會調用$finish來將整個的驗證平台關掉;
如果UVM發現此Phase中沒有提起任何objection,那將會直接跳轉到下一個Phase。假如驗證平台對於main_phase, 只有driver中提起objection,其他的monitor等組件沒有提起objection,所有的代碼都會執行,但是執行到driver中的drop_objection時,會關掉其他所有組件的main_phase。因此在執行一些消耗時間的代碼時,在此Phase下任意一個component中至少提起objection一次;
上述關於objection機制的結論只適用於12個run_time的phase, 對於run_phase不適用,由於run_phase與動態運行的Phase並行運行的,如果12個phase中有objection被提起,run_phase不需要raise_objection就可以自動執行;
objection機制的引入是為了解決何時結束仿真的問題,是面向task phase, 而不是function phase, 因此在function phase中一般不會用,用了也不會報錯;
super.phase的用處:
在phase中看到有時用super.phase,有時不用,有什么用處呢?對於build_phase來說,uvm_component對其做的最重要的事情是自動獲取通過config_db::set設置的參數,如果要關閉這個功能,可以在自己的build_phase中不調用super.build_phase;
除了build_phase外,UVM在其他的Phase中幾乎沒有做任何相關的事情。因此,除了build_phase外,在寫其他的Phase時,完全可以不必加上super.xxx_phase語句,當然這個結論只適用於擴展自uvm_component的類。如果是擴展自用戶自定義的類,如base_test類,且在某個phase,比如connect_phase中定義了一些重要內容,在具體的測試用例的connect_phase中不應該省略super.connect_phase;