uvm testbench簡介(作用,結構以及搭建步驟)


參考資料:

(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)

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM