UVM学习之路(4)— 基本的UVM验证平台
UVM学习之路(4)— 基本的UVM验证平台
一、前言
一般我们将设计输出的文件称为DUT(Design Under Test),即待测设计,验证是来找出DUT中的bug, 这个过程通常是把DUT放入一个验证平台中来实现的。 一个基本的UVM验证平台框图如下所示:
本次使用的源码修改来自张强的《UVM实战》第二章节的源码
二、设计模块
本次我们使用一个最简单的DUT来搭建一个UVM验证环境,其功能非常简单, 通过rxd接收数据, 再通过txd发送出去。该模块信号列表如下所示:
三、UVM验证环境
本次uvm代码的组织结构如下所示:
uvm_test是整个UVM的树根,本次搭建的平台中有3个不同实现的uvm_test
1、 使用default_sequence
case0.sv代码如下
class case0_sequence extends uvm_sequence #(transaction_dut);transaction_dut m_trans;function new(string name= "case0_sequence");super.new(name);endfunction virtual task body();if(starting_phase != null) starting_phase.raise_objection(this);repeat (10) begin`uvm_do_with(m_trans, { m_trans.pload.size() == 10;})end#100;if(starting_phase != null) starting_phase.drop_objection(this);endtask`uvm_object_utils(case0_sequence)
endclassclass case0 extends uvm_test;my_env env;function new(string name = "case0", uvm_component parent = null);super.new(name,parent);endfunction virtual function void build_phase(uvm_phase phase);super.build_phase(phase);`uvm_info("case0", "case0 build_phase", UVM_LOW);env = my_env::type_id::create("env", this); /* 1. use default_sequence */uvm_config_db#(uvm_object_wrapper)::set(this, "env.in_agt.sqr.main_phase", "default_sequence", case0_sequence::type_id::get());endfunctionvirtual function void 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("--------------------------------------------------");$display("---- TEST CASE FAILED ----");$display("--------------------------------------------------");endelse begin$display("--------------------------------------------------");$display("---- TEST CASE PASSED ----");$display("--------------------------------------------------");endendfunction`uvm_component_utils(case0)
endclass
2、 手动创建sequence
case1.sv代码如下
class case1_sequence extends uvm_sequence #(transaction_dut);transaction_dut m_trans;function new(string name= "case1_sequence");super.new(name);endfunction virtual task body();if(starting_phase != null) starting_phase.raise_objection(this);repeat (10) begin`uvm_do_with(m_trans, { m_trans.pload.size() == 10;})end#100;if(starting_phase != null) starting_phase.drop_objection(this);endtask`uvm_object_utils(case1_sequence)
endclassclass case1 extends uvm_test;my_env env;function new(string name = "case1", uvm_component parent = null);super.new(name,parent);endfunction virtual function void build_phase(uvm_phase phase);super.build_phase(phase);`uvm_info("case1", "case1 build_phase", UVM_LOW);env = my_env::type_id::create("env", this); endfunctionvirtual task main_phase(uvm_phase phase);/* 2. not use default_sequence */case1_sequence seq;seq = case1_sequence::type_id::create("seq");// set starting_phase for uvm_sequence.body() taskseq.starting_phase = phase;seq.start(env.in_agt.sqr);endtask virtual function void 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("--------------------------------------------------");$display("---- TEST CASE FAILED ----");$display("--------------------------------------------------");endelse begin$display("--------------------------------------------------");$display("---- TEST CASE PASSED ----");$display("--------------------------------------------------");endendfunction`uvm_component_utils(case1)
endclass
3、在uvm_test中提起和释放objection
case2.sv
代码如下
class case2_sequence extends uvm_sequence #(transaction_dut);transaction_dut m_trans;function new(string name= "case2_sequence");super.new(name);endfunction virtual task body();repeat (10) begin`uvm_do_with(m_trans, { m_trans.pload.size() == 10;})end#100;endtask`uvm_object_utils(case2_sequence)
endclassclass case2 extends uvm_test;my_env env;function new(string name = "case2", uvm_component parent = null);super.new(name,parent);endfunction virtual function void build_phase(uvm_phase phase);super.build_phase(phase);`uvm_info("case2", "case2 build_phase", UVM_LOW);env = my_env::type_id::create("env", this); endfunctionvirtual task main_phase(uvm_phase phase);/* 3. not use default_sequence, in addition set objection raise and drop in this */case2_sequence seq;phase.raise_objection(this);seq = case2_sequence::type_id::create("seq");seq.starting_phase = phase;seq.start(env.in_agt.sqr);phase.drop_objection(this);endtask virtual function void 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("--------------------------------------------------");$display("---- TEST CASE FAILED ----");$display("--------------------------------------------------");endelse begin$display("--------------------------------------------------");$display("---- TEST CASE PASSED ----");$display("--------------------------------------------------");endendfunction`uvm_component_utils(case2)
endclass
四、附录
本篇中的UVM验证平台源码:https://gitee.com/william_william/uvm-s02.git
UVM学习之路(4)— 基本的UVM验证平台相关推荐
- UVM学习之路(5)— 完整的UVM验证平台
UVM学习之路(5)- 完整的UVM验证平台 一.前言 一个完整的UVM验证平台还应该加入寄存器模型,对应的设计文件中也应该存在寄存器及其控制端口, 通过该控制端口可以配置DUT中的寄存器. 二.设计 ...
- UVM学习之路(6)— 基于MCDF的验证平台
UVM学习之路(6)- 基于MCDF的验证平台 一.前言 MCDF即多通道数据整形器(Multi-Channel Data Formatter)可以将多个通道是数据经过打包后以数据包的形式发送出去,其 ...
- php学习之路五(表单验证)
<html><head><title>PHP处理表单</title></head><body><h2>请填写个人信息 ...
- UVM学习笔记—快速入门篇
UVM指的是验证方法学,是学习数字验证的入门课程.它是至关重要的,有不少人往IC验证方向发展的,多多少少都会去了解UVM.但UVM并不是简单的翻个书就可以学会的,还是要掌握学习方法或者跟着老师学习的. ...
- 从VHDL到UVM验证平台转变的优点评估
路科验证官网:路科验证 - 专注于数字芯片验证的系统思想和前沿工程领域 EETOP路科首页: EETOP - 路科验证 - IC验证培训 CSDN路科首页:CSDN - 路科验证 - IC验证培训 由 ...
- UVM学习笔记—前门访问/后门访问
目录 0.前言 1.前门访问 2.后门访问 2.1路径设置 2.2操作类型 0.前言 在UVM学习笔记-寄存器模型的搭建及使用中提到过前门访问和后门访问的概念,这篇文章将会详细的阐述一下这2种访问方式 ...
- IC验证——UVM学习
UVM是一种基于Systemverilog的验证方法学,其特征是提供用于基本验证结构和可调用的基础类库,可让验证工程师快速搭建可靠的验证框架.UVM自定义的框架构建类和测试类能够帮助验证师减轻环境构建 ...
- UVM学习——搭建简单的UVM平台
引言 本专栏的博客均与 UVM 的学习相关,学习参考: [1]UVM Tutorial [2]张强著,UVM实战 (卷 Ⅰ) [3]Download UVM (Standard Universal V ...
- UVM实战 卷I学习笔记2——为验证平台加入各个组件(1)
目录 1.加入transaction 2.加入env 3.加入monitor 4.封装成agent 开始引入reference model.monitor.scoreboard等验证平台的组件,在这些 ...
最新文章
- Tomcat遇到”Error listenerStart”或”Error filterStart”问题且无详细日志时的log配置...
- Java(CallableStatement)调用Oracle存储过程返回结果集(ResultSet)
- percona toolkit for mysql_Percona Toolkit for MySQL安装(CentOS5.8) | 学步园
- mysql分析sql语句性能_sql语句执行性能分析
- 开源项目葫芦藤:IdentityServer4的实现及其运用
- [SQL]LeetCode183. 从不订购的客户 | Customers Who Never Order
- 前端学习(173):格式化文本二
- PCL之点云分割算法概述
- linux命令安装中英文插件,linux – 如何使用命令行自动安装Eclipse插件?
- LeetCode(8):字符串转整数(atoi)
- Java——容器和泛型
- 最详细的联发科刷机教程MediaTek SP Flash Tool教程MTK通用驱动Windows 10 MTK VCOM USB Preloader Drivers
- windows server2003/R2 安装IIS6(asp.net)
- PingCAP,中国第一只开源独角兽总融资达3.4亿美元,不能错过的开源深度解析
- javaJNI(javah用法)
- 打开我的计算机我的文档不见,我电脑桌面上的我的文档不见了,是什么原因造成我的文档不见了呢?是? 爱问知识人...
- 云通讯 发送短信模板代码
- yaml-cpp保存标定文件-Node/Emitter
- linux环境下java输出乱码,linux java 输出乱码问题
- 5G NR Polar码系统编码和非系统编码(二)
热门文章
- C语言求1元2次方程的解,一元二次方程求解程序完整代码
- 最简单的豆瓣电影排行爬虫 萌新都可以看懂
- python open函数用法_Python使用open函数打开文件的常用模式
- numpy.ndarray.transpose
- ChatGPT和体育产业:数字化赛事与观赛体验的转变
- python安在d盘_python安装c盘还是d盘-女性时尚流行美容健康娱乐mv-ida网
- 十年测试两茫茫,不思量,自难忘!
- 浏览器扩展:比你想象得更危险
- Elasticsearch单机版安装(基于CentOS7)
- centos7 U盘启动最好解决方案