uvm實戰(32位全加器)

(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()
    在這裏插入圖片描述
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章