在設計仿真用例時,有限制條件的激勵相比漫無目的的仿真更加有效的找出RTL的bug。因此,同一份測試方案,不同的sequence往往代表著不同的test_case。真正的測試用例都是基于base_test派生的一個類。
第一,在這么多不同的case下,我們可以設置一個base_case,base_case將環境env,cfg等一些東西包進去;
第二,需要幾個不同的sequence就寫幾個sequence,sequence之間沒有聯系,繼承于uvm_sequence;
第三,在每個具體的執行case下,可以用asserte插入具體的配置參數,并且每個case設置自己獨立的default_sequence;
第四,在終端指定不同的case_name跑不同的case;
文件:src/base_test.svclass base_test extends uvm_test;my_envenv;functionnew(stringname="base_test",uvm_componentparent=null);super.new(name,parent);endfunction externvirtualfunctionvoidbuild_phase(uvm_phasephase);externvirtualfunctionvoidreport_phase(uvm_phasephase);`uvm_component_utils(base_test) //使用uvm_component_utils宏來注冊到factory中endclass //在build_phase中實例化my_env,并設置sequencer的default_sequence來啟動my_sequencefunctionvoidbase_test::build_phase(uvm_phasephase);super.build_phase(phase);env=my_env::create("env",this);uvm_config_db#(uvm_object_wrapper)::set(this,"env.i_agt.sqr.main_phase","default_sequence",my_sequence::get());endfunction//根據UVM_ERROR的數量來打印不同的信息,一些日志分析工具functionvoidbase_test::report_phase(uvm_phasephase);uvm_report_serverserver;interr_num;super.report_phase(phase);server=get_report_server();err_num=server.get_severity_count(UVM_ERROR);if(err_num!=0)begin$display("TESTCASEFAILED");endelsebegin$display("TESTCASEPASSED");endendfunction
代碼中的super.new(name,parent)是繼承基類的構造函數的寫法,包括下面的 super.build_phase(phase)也是繼承基類的表現。
除了上述操作外,還通常在base_test中做如下事情:
第一,設置整個驗證平臺的超時退出時間;
第二,通過config_db設置驗證平臺中某些參數的值。這些根據不同的驗證平臺及不同的公司而不同,沒有統一的答案
下面介紹基于上面定義的basetest如何來構造測試用例呢
首先構造用例case0的激勵sequence
然后基于base case構造自己的case來啟動自己的激勵sequence
文件:src/my_case0.sv class case0_sequence extends uvm_sequence #(my_transaction); my_transaction m_trans; …virtual task body();if(starting_phase != null)starting_phase.raise_objection(this);//啟動仿真repeat (10) begin `uvm_do(m_trans)//發送此transaction。 end #100; if(starting_phase != null) starting_phase.drop_objection(this);//仿真結束 endtask … endclass class my_case0 extends base_test; function new(string name = "my_case0", uvm_component parent = null); super.new(name,parent); endfunction extern virtual function void build_phase(uvm_phase phase); `uvm_component_utils(my_case0) endclass //通過設置默認sequence來啟動case0_sequence function void my_case0::build_phase(uvm_phase phase); super.build_phase(phase);uvm_config_db#(uvm_object_wrapper)::set(this,"env.i_agt.sqr.main_phase","default_sequence",case0_sequence::get());endfunction
UVM會利用UVM_TEST_NAME從命令行中尋找測試用例的名字,創建它的實例并運行
… +UVM_TEST_NAME=my_case0
-
FPGA
+關注
關注
1626文章
21678瀏覽量
602040 -
仿真
+關注
關注
50文章
4048瀏覽量
133431 -
終端
+關注
關注
1文章
1117瀏覽量
29834
原文標題:仿真驗證之base test
文章出處:【微信號:FPGA學姐,微信公眾號:FPGA學姐】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論