- 使用UVM的第一條原則:驗證平臺中所有的組件均應派生自UVM中的類。
- factory機制:必須用宏
uvm_component_utils,uvm_object_utils, uvm_object_utils_begin … end
註冊後才能使用。 - UVM factory機制會維護一個註冊表,這些宏可以把用戶定義的類註冊到該表中。
- 在top tb中使用
run_test("your_test_name")
,它會自動創建和運行類,該對象的名字是uvm_test_top。也可以在run的命令行中添加:+UVM_TESTNAME=my_case 來指定運行某個case。 - config_db 機制:由於UVM通過run_test語句實例化了一個脫離了top tb層次結構的實例,建立了脫離了硬件世界的軟件天地,爲了對這片天地裏的信號等進行配置,UVM引入了config_db機制。
config_db分爲set和get兩部操作。 - 在main_phase中,raise_objection() 應該放在第一個消耗時間的語句前,否則無法起到作用。當然,標準的基於uvm 的testbench只應該在sequence裏 raise/drop objection.
- 執行順序 :
在build_phase
時是從樹根到葉子,有在每級節點創建完成後纔開始下級結點的創建。同一級下的component創建先後順序不確定 (?)
具體參考build_phase執行順序的實驗結果
在connect_phase
時是從葉子到樹根的順序. - interface在class中使用會引起編譯錯誤。爲了在class中使用,SystemVerilog創造了
virtual interface
。 - 使用UVM宏語句的結尾不用分號結尾也可,如
uvm_info, uvm_fatal, uvm_component_utils
等。 - UVM
test
類的三個主要作用:1.例化頂層驗證環境 2.通過factory overrides或config db的方式配置驗證環境 3.通過引入Sequence來完成test的具體測試內容。 - UVM
env
類: 一個soc top env下可能由許多 dedicated的env,如PCIe Env, USB env, Memory controller Env等。 - filed automation機制: 提供
copy()
,compare()
,print()
等函數,以及pack_bytes()
,unpack_bytes()
等。
tr.pack_bytes(data_q)
將tr中所有的字段變成byte流放入data_q中,其放入順序是根據uvm_filed系列宏的書寫順序排列的。
tr.unpack_bytes(data_array)
函數將data_array數組中的byte流轉化成tr中已被filed automation註冊過的各個字段 - 在定義component 時使用參數化的定義之名使用的transcation類型,這樣可以使用其預定義好的成員變量,如driver中的req
- sequence不屬於驗證平臺的任何一部分。sequence就像彈夾,裏面的子彈是transcation,而sqeuencer是一把槍。彈夾用完就扔掉沒用了,但槍只有戰鬥結束纔不用。
uvm_do
宏做如下事:
1.創建一個transcation的實例。
2.將其隨機化。
3.最終將其送給sequencer。- driver從sequencer中獲取item的方法:
seq_item_port.get_next_item(req)
是阻塞的
seq_item_port.try_next_item(req)
是非阻塞的
try_next_item的行爲更接近真實的driver的行爲,當由數據時就驅動數據到總線,否則總線就處於空閒狀態。 - 通過set
default_sequence
的方式啓動sequence。 starting_phase
是uvm_sequence基類中的uvm_phase類型的成員變量。sequencer在啓動default_sequence時,會將自身的phase賦值給seq.starting_phase. 因此sequence中可以使用starting_phase進行raise/drop objection。
參考:
UVM實戰(卷1) (張強 著)