在設(shè)計(jì)仿真用例時(shí),有限制條件的激勵(lì)相比漫無(wú)目的的仿真更加有效的找出RTL的bug。因此,同一份測(cè)試方案,不同的sequence往往代表著不同的test_case。真正的測(cè)試用例都是基于base_test派生的一個(gè)類。
第一,在這么多不同的case下,我們可以設(shè)置一個(gè)base_case,base_case將環(huán)境env,cfg等一些東西包進(jìn)去;
第二,需要幾個(gè)不同的sequence就寫幾個(gè)sequence,sequence之間沒有聯(lián)系,繼承于uvm_sequence;
第三,在每個(gè)具體的執(zhí)行case下,可以用asserte插入具體的配置參數(shù),并且每個(gè)case設(shè)置自己獨(dú)立的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宏來(lái)注冊(cè)到factory中endclass //在build_phase中實(shí)例化my_env,并設(shè)置sequencer的default_sequence來(lái)啟動(dòng)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//根據(jù)UVM_ERROR的數(shù)量來(lái)打印不同的信息,一些日志分析工具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)是繼承基類的構(gòu)造函數(shù)的寫法,包括下面的 super.build_phase(phase)也是繼承基類的表現(xiàn)。
除了上述操作外,還通常在base_test中做如下事情:
第一,設(shè)置整個(gè)驗(yàn)證平臺(tái)的超時(shí)退出時(shí)間;
第二,通過config_db設(shè)置驗(yàn)證平臺(tái)中某些參數(shù)的值。這些根據(jù)不同的驗(yàn)證平臺(tái)及不同的公司而不同,沒有統(tǒng)一的答案
下面介紹基于上面定義的basetest如何來(lái)構(gòu)造測(cè)試用例呢
首先構(gòu)造用例case0的激勵(lì)sequence
然后基于base case構(gòu)造自己的case來(lái)啟動(dòng)自己的激勵(lì)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);//啟動(dòng)仿真repeat (10) begin `uvm_do(m_trans)//發(fā)送此transaction。 end #100; if(starting_phase != null) starting_phase.drop_objection(this);//仿真結(jié)束 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 //通過設(shè)置默認(rèn)sequence來(lái)啟動(dòng)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會(huì)利用UVM_TEST_NAME從命令行中尋找測(cè)試用例的名字,創(chuàng)建它的實(shí)例并運(yùn)行
… +UVM_TEST_NAME=my_case0
-
FPGA
+關(guān)注
關(guān)注
1620文章
21510瀏覽量
598940 -
仿真
+關(guān)注
關(guān)注
50文章
3972瀏覽量
132963 -
終端
+關(guān)注
關(guān)注
1文章
1080瀏覽量
29725
原文標(biāo)題:仿真驗(yàn)證之base test
文章出處:【微信號(hào):FPGA學(xué)姐,微信公眾號(hào):FPGA學(xué)姐】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論