UVM Lab Guide自学笔记——快速入门UVM
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
UVM Lab Guide自学笔记——快速入门UVM
from Monchy(蒙奇)
在2020年秋招前根据Synopsys的SystemVerilog Verification UVM1.1Lab Guide自学UVM验证,在此分享前两章详细的学习笔记,几乎是指南的中文翻译,大量的过程截图对初学者很友好。(UVM Lab Guide是Synopsys给出的UVM官方入门指南,里面包涵源码和实验指导,可以在网上自行下载。建议参考《UVM实战》(张强))
1UVM Environment
1学习目标
创建一个简单的UVM测试环境
嵌入报告消息
编译测试环境
运行仿真并观察结果
将数据、sequencer和驱动程序类添加到环境
编译并仿真环境以观察行为
2实验准备
UVM由一组编码准则以及一组基类和宏组成。这组基类和宏可帮助你开发外观和感觉上一致的测试平台。这套编码准则使您能够开发鲁棒且高度可重复使用的测试平台组件,从而减少了修改、维护验证基础架构的时间,并花费更多时间验证您的设计。
第一个实验将按照UVM编码准则,使用UVM基类和宏开始构建UVM验证环境的过程:
UVM lab文件夹有3个目录:labs(实验文件夹,里面的程序待补充)、solutions(lab的参考代码)和rtl(被测试的rtl代码)。
3搭建UVM测试平台
任务1.创建简单的UVM 测试文件test_collection.sv
Solution:
`ifndef TEST_COLLECTION_SV `define TEST_COLLECTION_SV `include "router_env.sv"
class test_base extends uvm_test;`uvm_component_utils(test_base)router_env env;
function new(string name,uvm_component parent);
super.new(name,parent);
`uvm_info("TRACE",$sformatf("%m"),UVM_HIGH);endfunction:new
virtual function void build_phase(uvm_phase phase);
super.build_phase(phase);
`uvm_info("TRACE",$sformatf("%m"),UVM_HIGH);
env =router_env::type_id::create("env",this);endfunction:build_phase
virtual function void start_of_simulation_phase(uvm_phase phase);super.start_of_simulation_phase(phase);
`uvm_info("TRACE",$sformatf("%m"),UVM_HIGH);
//Note:If you want to see the topology as a tree format try://uvm_top.print_topology(uvm_default_tree_printer);
uvm_top.print_topology();
factory.print();
endfunction:start_of_simulation_phase endclass:test_base
`endif
test.sv Solution:
program automatic test;import uvm_pkg::*;`include "test_collection.sv"initial begin
$timeformat(-9,1,"ns",10);run_test();end endprogram
编译并仿真简单的UVM 测试平台:
$vcs -sverilog -ntb_opts uvm-1.1test.sv 编译开关-ntb_opts 用于使能UVM
$simv +UVM_TESTNAME=test_base 可以通过factory configuration 修改测试。
include 环境文件
在每种方法的开头输入这个语句。这是为
了在调试过程中提供帮助。将此语句嵌入每个方法中,通过将报告详细程度设置为UVM_HIGH ,可以依次执行所有操作。在该语句中,%m 用于打印当前的分层路径。uvm_test 是基类,test_base 是它的扩展类register the class in factory
构造函数有两个参数factory.print()显示在factory 中通过uvm_component_utils 宏注册的所有class 类型有用的调试代码
任务2创建简单的环境
在此任务中,您将构建一个简单的环境,它包括sequence_item(packet),sequence (packet_sequence),sequencer(sequencer),驱动器(driver),agent(input_agent)和环境(router_env)。生成激励,并查看sequencer和驱动器之间的相互作用。
packet.sv Solution:
`ifndef PACKET_SV
`define PACKET_SV
class packet extends uvm_sequence_item;
rand bit[3:0]sa,da;
rand bit[7:0]payload[$];
`uvm_object_utils_begin(packet)
`uvm_field_int(sa,UVM_ALL_ON|UVM_NOCOMPARE)
`uvm_field_int(da,UVM_ALL_ON)
`uvm_field_queue_int(payload,UVM_ALL_ON)
`uvm_object_utils_end
constraint valid{
payload.size inside{[1:10]};
}
function new(string name="packet");
super.new(name);
`uvm_info("TRACE",$sformatf("%m"),UVM_HIGH); endfunction:new
endclass:packet
`endif
packet_sequence.sv Solution: `ifndef PACKET_SEQUENCE_SV
`define PACKET_SEQUENCE_SV
`include"packet.sv"
class packet_sequence extends uvm_sequence#(packet);
`uvm_object_utils(packet_sequence)使用嵌入在`uvm_object_utils_begin/ end宏中的uvm_field_*宏为UVM类中的变量创建支持方法(打印,复制,比较等)(将在下一个单元中介绍)。
类声明
数据类构造函数和组件类构造函数之间存在主要差异。在数据类构造函数中,参数中没有父组件句柄。