文章目录
第一个uvm实例
program automatic test;
import uvm_pkg::*; //输入uvm类库
`include "uvm_macros.svh" //输入uvm宏定义
class hello extends uvm_test;
`uvm_component_utils(hello_uvm) //寄存器测试案例
function new (string name,uvm_component parent);
super.new(name,parent);
endfunction : new
virtual task run_phase(uvm_phase phase); //在run_phase中执行代码
`uvm_info("TEST","hello uvm!",UVM_MEDIUM); //执行打印信息
endtask : run_phase
endclass : hello
initial
run_test(); //跑测试案例
endprogram
uvm仿真流程
- 利用宏在factory中登记表格记录类
class hello extends uvm_test;
`uvm_component_utils(hello_uvm)
- uvm_pkg 创建一个全局实例uvm_top,他是uvm_root类的对象;
import uvm_pkg::*;
- 执行run_test();任务,uvm_top检索factory等级表格中+UVM_TESTNAME = "NAME"指定的测试案例,并创建一个叫做uvm_test_top的子组件;
initial run_test();
- 在执行过程中,父组件管理子组件的phase执行,父子关系是一个逻辑层次关系,不是面向对象的继承关系。
uvm消息服务
- 总会显示的消息:
`uvm_fatal("massage","massage");
`uvm_error("massage","massage");
`uvm_warning("massage","massage");
- 用于仿真信息过滤的信息等级:
`uvm_info("massage","massage",UVM_LOW);
`uvm_info("massage","massage",UVM_MEDIUM);
`uvm_info("massage","massage",UVM_HIGH);
`uvm_info("massage","massage",UVM_FULL);
`uvm_info("massage","massage",UVM_DEBUG);
- 信息等级过滤的默认等级是UVM_MEDIUM
- 在仿真命令行中利用+UVM_VERBOSITY=UVM_DEBUG来控制信息过滤等级。
override uvm组件替换
- set_inst_override_by_type
uvm的各种元素
- TLM class(Transaction Level Modeling)事务传输类
- 在UVM组件之间进行通信;
- Transaction class事务类
- 封装了激励结构
class transaction extends uvm_sequence——item;
- Sequence class 序列类
- 创建一个事务序列,由driver进行处理
class transaction——sequence extends uvm_sequence #(transaction) ;
- Sequencer class 序列类
- 启动序列并把事务传递给驱动器
typedef uvm——sequencer #(transaction) transaction_sequencer;
- Driver class 序列类
- 接收序列器发送的事务并驱动到接口上
class driver extends uvm_driver #(transaction);
- Agent class 代理类
- 封装了序列器(sequencer)、驱动器(driver)、监视器(monitor)、接口(interface)
class master_agent extends uvm_agent;
- Environment class 环境类
- 封装了代理器(agent)、计分板(scoreboard)和覆盖率(coverage)
- 通过TLM连接各个组件进行通信
class bus_env extends uvm_env;
- Testcase class 测试案例类
- 封装了验证环境(environment)
- 在测试案例中配置和修改
class test_base extends uvm_test;
元素详解
TLM事务级建模
- uvm组件之间通信
单向或双向通信;
阻塞和非阻塞接口;
port和export类型;
put()和get()方法; - 被动通信使用analysis port
监视器、计分板和覆盖率;
总是广播和非阻塞的;
write()方法; - TLM基类
uvm_*_port/_imp/_export;
uvm_*_fifo_*;
uvm_*_socket
uvm_sequence_item class
- 只定义了激励属性
使用rand声明随机变量;(randc可能会出现问题)
没有phase方法;
没有uvm组件的父子关系; - 使用宏创建对事务的操作
宏创建了对数据的操作方法,如copy(),print()等;
uvm_sequence class
通过uvm_sequence类的派生可以在uvm sequence中创建事务;
raise_objection表示动作的开始(举起手);
drop_objection表示动作的结束(放下手);
uvm_sequencer class
- 使用参数化传递类;
通过参数化选择事务; - 包含一个序列描述符(default sequence);
必须通过配置机制使用测试案例里需要的序列; - 包含内建TLM port(seq_item_export);
必须和驱动器相连;
typedef uvm——sequencer #(transaction) transaction_sequencer;
uvm_driver class
- 通过内建uvm_driver派生驱动器
内建了sequence item的句柄(req)和TLM端口,该TLM用于连接序列器;
uvm_agent class
- 在agent中封装了sequencer、driver和monitor;
uvm_env class
- 封装了agent、scoreboard和coverage
uvm_test class
- 开发一个testcase需要两步:
- 创建一个默认的不带约束的testcase;
利用基类uvm_test派生test_base; - 在test_base的基础上派生需要detestcase;
用于覆盖不同的设计功能和代码;
test program
- 在progran的initial 模块中执行测试案例;
消息服务
严重性Severity
fatal,error,warning,info
都显示
显示Verbosity
none,low,medium,high,full,debug
默认medium,用+UVM_VERBOSITYNAME=UVM_NAME控制;
控制仿真器的行为
uvm_exit:推出仿真;
uvm_count:对错误信息计数;
set_report_max_quit_count:错误信息计数达到max,退出仿真;
uvm_display:显示信息在屏幕;
uvm_log将信息写入log日志;
uvm_no action:不做处理;