5.1 phase機(jī)制
(1)UVM中的phase流妻,按照其是否消耗仿真時間($time打印出的時間)的特性,可以分成function phase 和 task phase纬向。 圖中灰色背景所示的是task phase燕偶,其他為function phase寨闹。
(2)對于function phase來說,在同一時間只有一個phase在執(zhí)行挂谍;但是在task phase中叔壤,run_phase和pre_reset_phase等12個小的phase并行運(yùn)行。后者稱為動態(tài)運(yùn)行(run-time)的phase口叙。
(3)UVM在build_phase中做uvm_component及其派生類變量的實例化工作炼绘。uvm_object可以在任何phase完成。
(4)除了build_phase之外庐扫,所有function phase都是自下而上執(zhí)行的饭望。
(5)對于同一層次的、具有兄弟關(guān)系的component形庭,執(zhí)行順序是按照字典序的铅辞,與實例化的順序無關(guān)。
(6)UVM采用深度優(yōu)先地原則萨醒,如i_agt實例化時名字為"i_agt"斟珊,scb為"scb",則i_agt的build_phase先執(zhí)行富纸,執(zhí)行完畢后囤踩,再執(zhí)行driver,monitor晓褪,sequence的build phase堵漱,全部執(zhí)行完畢后再執(zhí)行scoreboard的build phase。
(7)super.build_phase:自動獲取通過config_db::set設(shè)置的參數(shù)涣仿。如果要關(guān)掉這個功能勤庐,可以在自己的build_phase中不調(diào)用super.build_phase。
(8)對于直接擴(kuò)展自uvm_component的類好港,出build_phase外愉镰,完全可以不必加上super.xxxx_phase語句。
(9)jump函數(shù)的參數(shù)钧汹,uvm_pre_reset_phase::get()后的所有phase都可以丈探。
(10)<sim command> +UVM_PHASE_TRACE:對phase進(jìn)行調(diào)制。
(11)uvm_top.set_timeout(500ns, 0):設(shè)置超時時間拔莱,第二個參數(shù)表示此設(shè)置是否可以被其后的其他set_timeout語句覆蓋碗降。
? ? ? ? ? ? 默認(rèn)的超時退出時間:
? ? ? ? ? ? ? ? ? ? `define UVM_DEFAULT_TIMEOUT 9200s
? ? ? ? ? ? ? ? ? ? <sim command> +UVM_TIMEOUT="300ns, YES"
5.2 objection機(jī)制
(1)對于run-time的phase隘竭,如果想執(zhí)行一些耗費(fèi)時間的代碼,那么要在此phase下任意一個component中至少提起一次objection遗锣。
(2)如果UVM發(fā)現(xiàn)某phase沒有提起任何objection货裹,那么將會直接跳轉(zhuǎn)到下一個phase中。
(3)如果12個動態(tài)運(yùn)行的phase有objection被提起精偿,那么run_phase根本不需要raise_objection就可以自動執(zhí)行弧圆。
(4)在一個實際的驗證平臺中,通常會在以下兩種objection的控制策略中選擇一種:
? ? ? ? ? ? ? ? 1. 在scoreboard中進(jìn)行控制笔咽。
? ? ? ? ? ? ? ? 2. 在sequence中提起sequencer的objection搔预,當(dāng)sequence完成后,再撤銷此objection叶组。一般情況下只在sequence中控制objection拯田。
(5)一個phase對應(yīng)一個drain_time,沒有設(shè)置的情況下甩十,drain_time的默認(rèn)值為0船庇。
? ? ? ? ? ? "base_test.sv"
? ? ? ? ? ? task base_test::main_phase(uvm_phase phase);
? ? ? ? ? ? ?? phase.phase_done.set_drain_time(this, 200);
? ? ? ? ? ? endtask
(6) objection的調(diào)試
? ? ? ? ? ? <sim command> +UVM_OBJECTION_TRACE
5.3 domain的應(yīng)用
(1)domain只能隔離run-time的phase,其他phase還是同步的侣监,即run_phase和function_phase是同步的鸭轮。
(2)class B extends uvm_component;
? ? ? ? ? ? ? ? ?? uvm_domain ? ? new_domain;
? ? ? ? ? ? ? ? ?? `uvm_component_utils(B)
? ? ? ? ? ? ? ? ?? function new(string name, uvm_component parent);
? ? ? ? ? ? ? ? ? ? ? ? ? ? super.new(name, parent);
? ? ? ? ? ? ? ? ? ? ? ? ? ? new_domain = new("new_domain");
? ? ? ? ? ? ? ? ?? endfunction
? ? ? ? ? ? ? ? ?? virtual function void connect_phase(uvm_phase phase);
? ? ? ? ? ? ? ? ? ? ? ? ? ? set_domain(new_domain);
? ? ? ? ? ? ? ? ?? endfunction
? ? ? ? ? ? set_domain將B加入到此domain中。
(3)phase的跳轉(zhuǎn)只局限于某一個domain中橄霉。