參考資料:
(1) 《uvm cookbook》;
(2) 公眾號-芯片學堂;
(3) 《uvm user guide》;
(4) 從run_test淺談Test Bench的啟動 (qq.com)
(5) 《practical UVM step by step with IEEE》第二章;
1.uvm tb
1.1 uvm tb作用
(1) 實例化DUT模塊以及UVM Test class(通過在tb.sv的initial begin-end塊內調用run_test函數實現);
(2) 實現DUT與驗證環境的連接(interface binding以及uvm_config_db::set(), uvm_config_db::get());
(3) 時鍾產生(復位信號由UVM testbench提供);
注1:需要指明timescale;
注2:時鍾生成放到module內部實現,不要在testbench中產生時鍾;(《practical UVM step by step with IEEE》2.7章)
1 //tb.sv 2 module tb; 3 my_if input_if(clk, rst_n, **); 4 my_if output_if(clk, rst_n, **); 5 6 dut my_dut(.clk(clk), .rst_n(rst_n), 7 .rxd(input_if.data), .rx_dv(input_if.valid), 8 .txd(output_if.data), .tx_en(output_if.valid), 9 ); 10 11 initial begin 12 run_test(); 13 end 14 15 initial begin 16 uvm_config_db #(virtual my_if)::set(**); 17 uvm_config_db #(virtual my_if)::set(**); 18 end 19 endmodule
1 //top-level testbench; 2 module wb_env_top_mod(); 3 logic clk; 4 parameter sim_cycle=10; 5 parameter rst_delay=5; 6 7 initial begin 8 clk=0; 9 forever clk=#(sim_cycle/2) ~clk; 10 end 11 12 wb_master_if mast_if(clk); 13 wb_slave_if slave_if(clk); 14 15 wb_env_tb_mod test(); 16 dut dut(mast_if, slave_if); 17 18 endmodule: wb_env_top_mod
1 `include "wb_test.pkg" 2 module wb_env_tb_mod; 3 import uvm_pkg::*; 4 import wb_tests::*; 5 6 typedef virtual wb_master_if v_if1; 7 typedef virtual wb_slave_if v_if2; 8 9 initial begin 10 uvm_config_db #(v_if1)::set(null, "uvm_test_top.env.rst_agent", "mst_if", wb_env_top_mod.mast_if); 11 uvm_config_db #(v_if1)::set(null, "uvm_test_top.env.master_agent", "mst_if", wb_env_top_mod.mast_if); 12 uvm_config_db #(v_if2)::set(null, "uvm_test_top.env.slave_agent", "slv_if", wb_env_top_mod.slave_if); 13 run_test(); 14 end 15 16 endmodule: wb_env_tb_mod
1.2 uvm tb框圖
2.two top level module testbench(hdl_top & hvl_top)
(1) hdl_top包含interface和DUT;
(2) hvl_top包含啟動uvm驗證平台的initial begin-end塊;
注:詳見uvm cookbook;
3.uvm tb搭建具體步驟(需要有如下環節,但順序可能有所不同)
3.1構建transaction
(1) 作用: DUT激勵;
(2) 派生關系: UVM class library提供uvm_sequence_item基類(uvm_sequence_item派生於uvm_transaction);每一個user-defined data item都應該直接或間接派生於uvm_sequence_item;
(3) 創建user-defined transaction:
(3.1) 根據DUT transaction spec,弄清楚專用的約束、任務與函數;
(3.2) 從uvm_sequence_item基類或其派生類構建新的派生類;
(3.3) 定義構造函數;
(3.4) 為transaction類添加成員變量;
(3.5) 使用uvm field宏以便於直接使用print, copy, compare等函數;
(4) 示例
3.2 構建sequence & virtual sequence
詳見seq部分文檔(聲明seq&啟動seq);
3.3 構建sequencer & virtual sequencer
詳見sequencer部分文檔;
3.4 構建driver
(1)作用:從sequencer獲取data item,然后按照接口協議把data item驅動到總線上;
(2)派生關系:UVM類庫提供uvm_driver基類,所有的driver類都應該直接或間接的派生自uvm_driver;
(3)創建
(3.1) 從uvm_driver類派生;
(3.2) 使用UVM field automation機制實現print, copy, compare等函數的自動定義;
(3.3) 獲取來自sequencer的下一個data item;
(3.4) 在driver中聲明一個virtual interface,為了實現driver與DUT的連接;
(4)示例
3.5 構建monitor
(1)作用:負責從bus上提取信號信息,轉換成事件,數據和狀態信息,然后通過TLM port將信息傳遞給其他uvc;
(2)示例:
3.6 構建agent
(1)作用:實例化driver, monitor, sequencer並采用TLM port實現其連接(為了提高靈活性, agent也會包含配置信息以及其他參數);
(2) 工作模式(active mode與passive mode)
(2.1) active mode: agent需要實例化driver, sequencer, monitor;
(2.2) passive mode: agent不需要實例化driver,sequencer,僅僅需要實例化monitor;
(3) 示例
3.7 實現check與coverage收集
(1) assertion check示例
(2) 函數check示例
(3) 功能覆蓋率的收集
(3.1) 功能覆蓋率的收集是通過sv的covergroup實現的; covergroup的關鍵在於coverpoint與bin的確定以及什么時候收集覆蓋率;
3.8 構建env
(1)作用:可復用組件的容器,它實例化並配置所有的子組件;
(2)示例:
3.9 構建test
篇?-uvm_test - 蠶食鯨吞 - 博客園 (cnblogs.com)