在设计仿真用例时,有限制条件的激励相比漫无目的的仿真更加有效的找出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_env env;function new(string name = base_test, uvm_component parent = null);super.new(name,parent);endfunctionextern virtual function void build_phase(uvm_phase phase);extern virtual function void report_phase(uvm_phase phase);`uvm_component_utils(base_test) //使用uvm_component_utils宏来注册到factory中endclass//在build_phase中实例化my_env,并设置sequencer的default_sequence来启动my_sequence function void base_test::build_phase(uvm_phase phase); 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的数量来打印不同的信息,一些日志分析工具 function void base_test::report_phase(uvm_phase phase); uvm_report_server server; int err_num; super.report_phase(phase); server = get_report_server(); err_num = server.get_severity_count(uvm_error); if (err_num != 0) begin $display(test case failed); end else begin $display(test case passed); end endfunction
代码中的super.new(name,parent)是继承基类的构造函数的写法,包括下面的 super.build_phase(phase)也是继承基类的表现。
除了上述操作外,还通常在base_test中做如下事情:
第一,设置整个验证平台的超时退出时间;
第二,通过config_db设置验证平台中某些参数的值。这些根据不同的验证平台及不同的公司而不同,没有统一的答案
下面介绍基于上面定义的base test如何来构造测试用例呢
首先构造用例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
高通将推出28纳米工艺Krait系芯片
2019将是关键的一年 因为苹果将引领一个后iPhone时代
索泰RTX 4070 SUPER X-GAMING OC欧泊白评测
视频监控进入数据爆炸时代 安防厂商抢占赛道
如何用Arduinos和NRF24L01模块创建发射器和接收器
基于base test如何来构造测试用例
5G信号如何覆盖 5G基站的概念是什么
关于YK-AD系列通信电源的基本常识
为什么要成为高级程序员
实施功能安全的 RTD 系统:RTD 设计
SEMICON China 2023盛大启幕 汉高粘合剂创新技术“连接未来”
科技巨头跨界造车哪家强?
有种SPD叫RUILON
vlookup使用后怎么让数值固定
劳动力管理厂商Kronos签约艾默生过程控制
继三星Note7爆炸后,惠普也因电池存在安全隐患,召回全球部分笔记本电脑
RAS(二)Intel MCA初探
经纬仪的使用方法和步骤 经纬仪的用途有哪些
NVIDIA公布未来绘图芯片的发展路线图 7纳米制程芯片将由台积电代工
PCIM Asia 2022将重返上海举办