參考資料:
(1) uvm中run_test | 駿的世界 (lujun.org.cn)
(2) 從run_test淺談Test Bench的啟動 (qq.com)
1. run_test
(1) run_test是uvm_globals.svh中定義的一個task,用於啟動UVM.
2. 調用uvm_root.run_test
(1)在run_test內,會先獲取uvm_root的實例,然后調用其run_test函數,傳入test_name的名字.
3. class uvm_coreservice_t
4. uvm_root
5.uvm_root.run_test
(1) 初始化objection;
(2) 設置testcase的name,從cmdline獲取+UVM_TESTNAME參數.如果有,將來使用第一個參數設置的值.如果cmdline沒有設置UVM_TESTNAME,使用傳入的testname.
(3) 根據test_name,調用工廠函數create_component_by_name,創建testcase的實例,並且賦值給uvm_test_top,因此對於UVM環境,頂層的testcase將來都會變成uvm_test_top;
(4) m_children是uvm_component中內建的變量,保存該類包含哪些子類;當一個子類,通過UVM的工廠機制創建類實例后,會往其父類的m_children中加入該類對象;而testcase的父類就是uvm_root,因testcase被工廠機制創建實例之后,會將往uvm_root的m_children中加入該testcase的類對象,此時m_children的個數就不為0。
(5) 判斷創建的實例是否成功;
(6) 通過process類,保存進程號,啟動uvm phase。此處用fork join_none,父進程就不必等子進程結束,就可以退出。#0,父進程休眠,其他進程得到調度,使其他phase的runner得到運行。
(7) 最后等待uvm的phase結束.結束之后.將創建的所有子進程殺掉.調用report.打印(l_rs.report_summarize,格式可以見仿真log末尾部分).最后調用$finish結束仿真。