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验证平台相关推荐

  1. UVM学习之路(5)— 完整的UVM验证平台

    UVM学习之路(5)- 完整的UVM验证平台 一.前言 一个完整的UVM验证平台还应该加入寄存器模型,对应的设计文件中也应该存在寄存器及其控制端口, 通过该控制端口可以配置DUT中的寄存器. 二.设计 ...

  2. UVM学习之路(6)— 基于MCDF的验证平台

    UVM学习之路(6)- 基于MCDF的验证平台 一.前言 MCDF即多通道数据整形器(Multi-Channel Data Formatter)可以将多个通道是数据经过打包后以数据包的形式发送出去,其 ...

  3. php学习之路五(表单验证)

    <html><head><title>PHP处理表单</title></head><body><h2>请填写个人信息 ...

  4. UVM学习笔记—快速入门篇

    UVM指的是验证方法学,是学习数字验证的入门课程.它是至关重要的,有不少人往IC验证方向发展的,多多少少都会去了解UVM.但UVM并不是简单的翻个书就可以学会的,还是要掌握学习方法或者跟着老师学习的. ...

  5. 从VHDL到UVM验证平台转变的优点评估

    路科验证官网:路科验证 - 专注于数字芯片验证的系统思想和前沿工程领域 EETOP路科首页: EETOP - 路科验证 - IC验证培训 CSDN路科首页:CSDN - 路科验证 - IC验证培训 由 ...

  6. UVM学习笔记—前门访问/后门访问

    目录 0.前言 1.前门访问 2.后门访问 2.1路径设置 2.2操作类型 0.前言 在UVM学习笔记-寄存器模型的搭建及使用中提到过前门访问和后门访问的概念,这篇文章将会详细的阐述一下这2种访问方式 ...

  7. IC验证——UVM学习

    UVM是一种基于Systemverilog的验证方法学,其特征是提供用于基本验证结构和可调用的基础类库,可让验证工程师快速搭建可靠的验证框架.UVM自定义的框架构建类和测试类能够帮助验证师减轻环境构建 ...

  8. UVM学习——搭建简单的UVM平台

    引言 本专栏的博客均与 UVM 的学习相关,学习参考: [1]UVM Tutorial [2]张强著,UVM实战 (卷 Ⅰ) [3]Download UVM (Standard Universal V ...

  9. UVM实战 卷I学习笔记2——为验证平台加入各个组件(1)

    目录 1.加入transaction 2.加入env 3.加入monitor 4.封装成agent 开始引入reference model.monitor.scoreboard等验证平台的组件,在这些 ...

最新文章

  1. Tomcat遇到”Error listenerStart”或”Error filterStart”问题且无详细日志时的log配置...
  2. Java(CallableStatement)调用Oracle存储过程返回结果集(ResultSet)
  3. percona toolkit for mysql_Percona Toolkit for MySQL安装(CentOS5.8) | 学步园
  4. mysql分析sql语句性能_sql语句执行性能分析
  5. 开源项目葫芦藤:IdentityServer4的实现及其运用
  6. [SQL]LeetCode183. 从不订购的客户 | Customers Who Never Order
  7. 前端学习(173):格式化文本二
  8. PCL之点云分割算法概述
  9. linux命令安装中英文插件,linux – 如何使用命令行自动安装Eclipse插件?
  10. LeetCode(8):字符串转整数(atoi)
  11. Java——容器和泛型
  12. 最详细的联发科刷机教程MediaTek SP Flash Tool教程MTK通用驱动Windows 10 MTK VCOM USB Preloader Drivers
  13. windows server2003/R2 安装IIS6(asp.net)
  14. PingCAP,中国第一只开源独角兽总融资达3.4亿美元,不能错过的开源深度解析
  15. javaJNI(javah用法)
  16. 打开我的计算机我的文档不见,我电脑桌面上的我的文档不见了,是什么原因造成我的文档不见了呢?是? 爱问知识人...
  17. 云通讯 发送短信模板代码
  18. yaml-cpp保存标定文件-Node/Emitter
  19. linux环境下java输出乱码,linux java 输出乱码问题
  20. 5G NR Polar码系统编码和非系统编码(二)

热门文章

  1. C语言求1元2次方程的解,一元二次方程求解程序完整代码
  2. 最简单的豆瓣电影排行爬虫 萌新都可以看懂
  3. python open函数用法_Python使用open函数打开文件的常用模式
  4. numpy.ndarray.transpose
  5. ChatGPT和体育产业:数字化赛事与观赛体验的转变
  6. python安在d盘_python安装c盘还是d盘-女性时尚流行美容健康娱乐mv-ida网
  7. 十年测试两茫茫,不思量,自难忘!
  8. 浏览器扩展:比你想象得更危险
  9. Elasticsearch单机版安装(基于CentOS7)
  10. centos7 U盘启动最好解决方案