參考資料:
(1) uvm啟動過程及phase機制實現原理介紹_HelloQili的博客-CSDN博客
(2) UVM1.1應用指南及源代碼分析-張強
1.phase機制簡介
1.1. phase機制的必要性
在不同的時間做不同的事情;
1.2. phase的自動執行(原理)
(1) uvm_root的run_test task中,調用uvm_phase的一個static task m_run_phases,開始了uvm_phases的啟動;
注1:上段code中通過process得到進程的句柄;其中process是sv中內建類;
注2: 進程類型的對象在進程產生的時候在內部產生 ,用戶不能通過調用new產生進程類型的對象;
注3: 進程類process不能被擴展;
注4: 進程類的self()函數返回當前進程的句柄;上述code中通過self函數得到了fork...join_none這個進程的句柄;
注5:得到進程的句柄后,可以通過控制句柄對進程進行控制,比如通過調用process.kill()函數可以殺死該進程;
(2) m_run_phases中啟動forever進程不斷get phase,get成功就執行phase的execute_phase task.
(3) uvm_phase的execute_phase task會通過調用traverse task對uvm_components tree上的所有component進行遍歷.
(4) ...
2. uvm_phase簡介及分類
注1:uvm_phase分為function phase(不耗費仿真時間)和task phase(耗費仿真時間),具體詳見下表;
3. uvm_phase的執行順序
注1:run_time phase中的reset_phase, configure_phase, main_phase, shutdown_phase都有與之對應的pre_*_phase和post_*_phase;
注2:run_phase與run-time phase並行運行;
注3:引入run_time phase是為了實現更加精細化的控制;
注4:只有當所有組件均執行完當前phase時,才會接着執行下一個phase(尤其是對於task phase而言);如下圖所示,雖然對於A和B而言,都存在一段空白等待事件,但是從整個驗證平台的角度來看,各個task phase之間是沒有空白的,這可以稱作phase間的同步;
注5:phase間的同步不止適用於不同component的各個run-time phase之間,還適用於不同component的run_phase與run_phase之間,以及同一component的run_phase與post_shutdown_phase之間;
3.1. 時間角度:
(1) uvm_phase按照上圖所示從上到下的順序執行,其中run_phase與其他12個run_time phase並行執行.
3.2. 空間角度:
3.2.1. UVM樹中有直系關系的component(function phase)
(1) build_phase與finial_phase從上到下執行,其他function phase(如connect_phase)都是自下而上執行.
(2) UVM在build_phase做uvm_component的實例化工作,這也是build_phase從上到下執行的原因;只有parent uvm_component組件例化后,才能進行child uvm_component組件的例化;
3.2.2. UVM樹中具有兄弟關系的component(function phase)
(1) 如driver與monitor:執行順序按照字典序(這里的字典序的排序依據new時指定的名字).
3.2.3. UVM樹中叔侄關系的component(function phase)
(1) 如my_scoreboard與my_driver:UVM樹采用深度優先的原則,如果i_agt的build_phase執行完畢,接下來執行的是其孩子的build_phase,一直到整棵以i_agt為樹根的UVM子樹的build_phase執行完畢,之后再執行i_agt的兄弟的build_phase;
3.2.4. UVM中task phase執行順序
(1) run_phase, main_phase等task_phase也是按照自下而上的順序執行. 確切的說,是自下而上的啟動(先啟動driver的run_phase,然后啟動agent的run_phase),同時在運行,並不是說driver的run_phase執行完畢才開始執行agent的run_phase.