UVM Lab Guide自学笔记——快速入门UVM

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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类中的变量创建支持方法(打印,复制,比较等)(将在下一个单元中介绍)。

类声明

数据类构造函数和组件类构造函数之间存在主要差异。在数据类构造函数中,参数中没有父组件句柄。

相关文档
最新文档