UVM_2

第一个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仿真流程

  1. 利用宏在factory中登记表格记录类
class hello extends  uvm_test;
		`uvm_component_utils(hello_uvm)	
  1. uvm_pkg 创建一个全局实例uvm_top,他是uvm_root类的对象;
import uvm_pkg::*;
  1. 执行run_test();任务,uvm_top检索factory等级表格中+UVM_TESTNAME = "NAME"指定的测试案例,并创建一个叫做uvm_test_top的子组件;
initial run_test();
  1. 在执行过程中,父组件管理子组件的phase执行,父子关系是一个逻辑层次关系,不是面向对象的继承关系。

uvm消息服务

  1. 总会显示的消息:
`uvm_fatal("massage","massage");
`uvm_error("massage","massage");
`uvm_warning("massage","massage");
  1. 用于仿真信息过滤的信息等级:
`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的各种元素

  1. TLM class(Transaction Level Modeling)事务传输类
  • 在UVM组件之间进行通信;
  1. Transaction class事务类
  • 封装了激励结构
class transaction extends uvm_sequence——item;
  1. Sequence class 序列类
  • 创建一个事务序列,由driver进行处理
class transaction——sequence extends uvm_sequence #(transaction) ;
  1. Sequencer class 序列类
  • 启动序列并把事务传递给驱动器
typedef uvm——sequencer #(transaction) transaction_sequencer;
  1. Driver class 序列类
  • 接收序列器发送的事务并驱动到接口上
class driver extends uvm_driver #(transaction);
  1. Agent class 代理类
  • 封装了序列器(sequencer)、驱动器(driver)、监视器(monitor)、接口(interface)
class master_agent extends uvm_agent;
  1. Environment class 环境类
  • 封装了代理器(agent)、计分板(scoreboard)和覆盖率(coverage)
  • 通过TLM连接各个组件进行通信
class bus_env extends uvm_env;
  1. Testcase class 测试案例类
  • 封装了验证环境(environment)
  • 在测试案例中配置和修改
class test_base extends uvm_test;

元素详解

TLM事务级建模

  • uvm组件之间通信
    单向或双向通信;
    阻塞和非阻塞接口;
    portexport类型;
    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需要两步:
  1. 创建一个默认的不带约束的testcase;
    利用基类uvm_test派生test_base;
  2. 在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:不做处理;

例子

在这里插入图片描述

uvm基类树

在这里插入图片描述在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值