(1)首先寫明32位加法器的verilog代碼
(2)interface.sv(使用時鐘塊控制同步信號的時序)
(3)my_transaction.sv(相當於數據包,具有生命週期,派生於uvm_object的派生類,uvm_sequence_item類)
- 爲激勵成員指定rand屬性
- 將自定義的事務類向UVM註冊(uvm_object_utils,uvm_field_int)
- 約束項,控制隨機成員的隨機範圍
- uvm中包含着field_automatic機制,可以通過宏uvm_object_utils_begin和宏uvm_object_utils_end來實現my_transaction的factory註冊,根據數據類型的不同,分爲:
解釋:
1、通過import語句將整個uvm_pkg導入驗證平臺中,只有導入這個庫,編譯器才能識別uvm_component類
2、uvm_macros.svh文件中包括衆多宏定義
3、通過繼承的方式修改構造函數
(4)my_sequence.sv
- 從uvm_sequence擴展,其中後面的參數指定產生transaction的類型
- 使用uvm_object_utils註冊到factory中(也具有生命週期,當其中所有transaction發送完畢,即結束)
- body()任務是sequence中的一個重要方法,作用是創建並控制transaction
- 其中`uvm_do是uvm內建的宏,用來產生transaction,每調用一次產生一個transaction,是創建一個my_transaction的實例m_trans,將其隨機化,最終送給sequencer
- UVM通過objection機制來控制驗證平臺的關閉,在task phase中調用raise_objection()和drop_objection(),task phase其他需要執行的語句放在這兩個方法之間,在執行消耗仿真時間語句之前raise_objection(),在task phase結束時drop_objection(),建議每一個task phase都raise,drop一次
(5)my_sequencer.sv
-
派送於uvm_sequencer類,並且使用宏uvm_component_utils註冊到factory,參數是my_transaction類型
sequencer的作用: -
啓動sequence
-
將sequence產生的item發送到driver中
(6)my_driver.sv
- 聲明interface,在類中使用virtual interface,virtual my_if vif;(避免使用絕對路徑)
- 數據傳遞至reference model ,使用uvm_analysis_port #(my_transaction) ap;聲明ap,並在build_phase中實例化ap
- build_phase也是UVM內建的一個phase,當UVM啓動後會自動執行build_phase,build_phase在new函數之後main_phase函數之前執行,在build_phase中主要通過config_db的set和get操作傳遞一些數據,以及實例化成員變量,由於build_phase是一個函數,所以不消耗仿真時間
- config_db機制,分爲set、get操作,set可以理解爲“寄信”,而get相當於"收信“即設置配置資源,獲取配置資源uvm_config_db#(type)::get(獲取配置資源的源組件,配置路徑,資源ID,目標變量或對象)
- main_phase(),driver從這個方法完成對sequencer的transaction獲取,對transaction的分解和驅動DUT,seq_item_port.get_next_item(req);//從sequencer中獲取transaction,seq_item_port.item_done();//通知sequencer事務已經處理完畢
(7)my_monitor.v - 驗證平臺中實現監測DUT的部件是monitor,monitor收集DUT的端口數據,並將其轉換爲transaction送給scoreboard等
- 與driver類似,在my_monitor中也需要一個virtual my_if
(8) my_agent.sv - agent封裝了sequencer、driver、monitor,先需要聲明句柄
- agent需要實例化sequencer、driver、monitor對象並將sequencer與driver連接起來
- agent有active和passive之分,passive模式只有monitor而沒有sequencer和driver
- 分爲build_phase與connect_phase這兩個函數,其中build_phase創建sequencer、driver、monitor對象,connect_phase將driver中的seq_item_port與sequencer中的seq_item_export連接,實現之間的transaction通信
(9)my_model.sv - reference_model 的輸出被scoreboard接受,與DUT的輸出比較
(10)my_scoreboard.sv - my_scoreboard比較的數據一是來源於reference_model,二是來源於monitor,前者通過exp_port獲取,後者通過act_port獲取
- 在main_phase中通過fork建立兩個進程,一個進程處理exp_port的數據,當收到數據,放入expect_queue中,另一個進程處理act_port的數據,是DUT的輸出數據
- 當收集到數據後,從expect_queue中彈出之前從exp_port收到的數據,並調用my_transaction的compare函數(前提是exp_port先於act_port收到數據)
(11)my_env.sv - my_env實例化 i_agent(driver,monitor,sequencer),o_agent(monitor),scoreboard,
reference_model組件以及三個tlm_analysis_fifo(agt_scb_fifo、agt_mdl_fifo、mdl_scb_fifo) - 在connect_phase函數中將analysis_export與blocking_get_expect連接起來
(12)my_test.sv
- 例化env
- 設置整個驗證平臺的超時退出時間
- 通過config_db設置驗證平臺中某些參數的值
- report_phase(在main_phase之後執行)
(13)top.sv
- 例化DUT
- 例化輸入輸出的interface
- 定義時鐘頻率
- run_test()