当前位置: 首页 > news >正文

路科验证UVM入门与进阶详解实验0

一.代码编译

首先创建新项目,导入lab0 的UVM文件;

针对uvm_compile文件,先进行编译;

module uvm_compile;// NOTE:: it is necessary to import uvm package and macrosimport uvm_pkg::*;`include "uvm_macros.svh"initial begin`uvm_info("UVM", "Hello, welcome to RKV UVM training!", UVM_LOW)#1us;`uvm_info("UVM", "Bye, and more gifts waiting for you!", UVM_LOW)end
endmodule

无论在什么地方,UVM验证顶层都必须有下面这两行代码,代表着预编译的UVM库(包括UVM开源库和Questa的UVM定制部分库)。

import uvm_pkg::*
`include "uvm_macros.svh"

uvm_macros.svh是包含了众多宏定义的头文件,将其include进来可以让宏定义识别成功,否则编译时会报错;
而uvm_pkg是UVM库的预编译库,很庞大,包括了uvm_factory、uvm_config_db、各种phase等。
仿真后可以在下方位置看到。

import uvm_pkg::*

上面语句表示把默认编译好的库mtiUvm.uvm_pkg导入到uvm_compile里。如果没有import进来,那么编译就会报错。

当我们编译并且仿真uvm_compile,有如下信息:

其中,

    sv_std.std指的是systemverilog的内建包,定义了一些class、task、function和变量;
    mtiUvm.uvm_pkg表示mentor已经编译好的库,mti表示mentor公司;
    mtiUvm.questa_uvm_pkg是questa专门针对uvm定制的库。

 当我们在使用questasim时,我们不需要独立编译uvm_pkg,因为已经提前帮我们编译好了。但如果我们使用的是其他仿真器,比如VCS时,就需要独立编译一下uvm_pkg。

run -all后,打印信息如下:

 二、SV与UVM之间的关系

添加sv_class_inst.sv文件,编译,仿真,看看发生了什么?实际上这个实验是SV模块实验环节的抽象,它只是在顶层module容器中要例化软件验证环境的顶层,即 SV class top。在接下来的阶段,从打印出的信息可以看得出来,相当于从测试的开始,到验证环境的搭建,激励的发送,检查的执行等,最后又到了测试的结束。因此这是SV模块实验的“一”,即一生二,二生三,三生万物的那个“顶层” 。
sv_class_inst.sv代码

module sv_class_inst;import uvm_pkg::*;`include "uvm_macros.svh"class top;function new();`uvm_info("SV_TOP", "SV TOP creating", UVM_LOW)endfunctionendclassinitial begintop t; `uvm_info("SV_TOP", "test started", UVM_LOW)t = new();`uvm_info("SV_TOP", "test finished", UVM_LOW)endendmodule

sv_class_inst.sv代码分析:

对文件sv_class_inst.sv进行编译、仿真、运行,结果如下:

如何查看类的例化情况?

有人可能想在仿真窗口查看一下t句柄指向的对象。

module sv_class_inst;import uvm_pkg::*;`include "uvm_macros.svh"class top;function new();`uvm_info("SV_TOP", "SV TOP creating", UVM_LOW)endfunctionendclassinitial begintop t; `uvm_info("SV_TOP", "test started", UVM_LOW)t = new();`uvm_info("SV_TOP", "test finished", UVM_LOW)end
endmodule

结果会发现object窗口啥都没有。这是因为此处是硬件的信号,无法查看软件信号。

方法一:
正确的方式应该是通过view-locals打开locals窗口,这里可以看到软件变量。并且,需要在仿真后在第17行设置断点(没有设断点那么运行后就结束了,也看不到t),运行,就可以在locals窗口看到了。@top代表这个对象是top类,@1表示是top类的第一个对象。

 

方法二:
首先,如下图打开class instances窗口。

然后在仿真命令中加入-classdebug选项后进行仿真,并在仿真后在第17行设置断点。

vsim -novopt work.sv_class_inst -classdebug

如下图操作后也能在class instances窗口看到断点处的类例化的情况,此处就是@top@1.

uvm_class_inst.sv代码


module uvm_class_inst;import uvm_pkg::*;`include "uvm_macros.svh"class top extends uvm_component;`uvm_component_utils(top)function new(string name = "top", uvm_component parent = null);super.new(name, parent);`uvm_info("UVM_TOP", "SV TOP creating", UVM_LOW)endfunctionendclassinitial begintop t; `uvm_info("UVM_TOP", "test started", UVM_LOW)t = new("t", null);`uvm_info("UVM_TOP", "test finished", UVM_LOW)endendmodule

uvm_class_inst.sv代码分析:

uvm_class_inst定义的top类看似没什么内容,但是仿真、设断点之后发现里面别有洞天,有一层又一层的结构。这是因为top继承了uvm_component,所以也继承了他的结构和内容。

如果想要看到层次结构,可以如下图点开class tree-sim.

在class tree窗口即可看到。

三、UVM验证顶层与SV验证顶层的对比

uvm_test_inst代码


package test_pkg;import uvm_pkg::*;`include "uvm_macros.svh"class top extends uvm_test;`uvm_component_utils(top);function new(string name = "top", uvm_component parent = null);super.new(name,parent);`uvm_info("UVM_TOP", "SV TOP creating", UVM_LOW)endfunctiontask run_phase(uvm_phase phase);phase.raise_objection(this);`uvm_info("UVM_TOP", "test is running", UVM_LOW)phase.drop_objection(this);      endtask //run_phaseendclassendpackagemodule uvm_test_inst;import uvm_pkg::*;`include "uvm_macros.svh"import test_pkg::*;initial begin`uvm_info("UVM_TOP", "test started", UVM_LOW)run_test("top");`uvm_info("UVM_TOP", "test finished", UVM_LOW)end
endmodule

uvm_test_inst代码分析:

仿真,运行后,消息如下:

可以发现打印消息按照重要程度以及id分别列出。此处UVM_TOP为什么只有3个,而不是4个呢?明明代码里有4个UVM_TOP出现啊?
因此下面这行代码没有被执行:

`uvm_info("UVM_TOP", "test finished", UVM_LOW)

原因如下:

整个运行过程从initial块开始,接着进入run_test(),开始执行class top的内容:先是function new,接着是task run_phase。需要注意的是,当run_phase drop_objection之后,因为没有别的phase进行raise_objection,因此运行到此结束。所以没有执行上述提到的代码,最后只出现了3个UVM_TOP。

去掉 raise/drop_objection会怎样?

我们将raise/drop_objection注释掉,并加入了10ns的延时以及UVM_TOP类型的uvm_info(注意,因为代码没有写仿真时间单位,默认是1ns,所以加入的延时如果小于1ns会被仿真器忽略)

task run_phase(uvm_phase phase);// phase.raise_objection(this);`uvm_info("UVM_TOP", "test is running", UVM_LOW)#10ns;`uvm_info("UVM_TOP", "test finished after 10ns", UVM_LOW);// phase.drop_objection(this);      endtask

并如下图设好断点。


一步一步运行,可以发现程序在完成第15行之后就退出了,并且最后退出的时间是在0 ns处。

这就是注释掉raise/drop_objection产生的后果,即,进入到run_phase之后,由于没有举手,所以程序会跳过有延时的地方并直接退出。

sv和uvm中仿真窗口的区别

在sv的仿真中,仿真窗口只会出现硬件层次结构,不会出现sv的层次结构;
而到了uvm,仿真窗口会有双顶层结构出现,也就是uvm层次——uvm_root和硬件层次uvm_test_inst。

其中,top就是我们继承于uvm_test的类名称。

四、启动UVM验证的必要步骤

相比于uvm_class_inst,uvm_test_inst更适合作为UVM验证顶层容器。原因如下:

  •     只有继承于uvm_test的类,才可以作为UVM验证环境的顶层
  •     创建顶层验证环境,有且只能依赖于run_test(“UVM_TEST_NAME”)来传递,或者通过仿真参数传递,而不是通过构建函数new()。尽管new()可以创建一个对象,但是不能做与顶层验证环境相关的其他工作。具体的原因需要等对UVM有更深入了解时才能体会。

搭建验证框架 -> 验证组件之间的连接和通信 -> 编写测试用例,继而完成复用和覆盖率收敛。

相关文章:

路科验证UVM入门与进阶详解实验0

一.代码编译 首先创建新项目,导入lab0 的UVM文件; 针对uvm_compile文件,先进行编译; module uvm_compile;// NOTE:: it is necessary to import uvm package and macrosimport uvm_pkg::*;include "uvm_macros.svh"in…...

Linux之Shell编程(1)

文章目录前言一、Shell是什么二、Shell脚本的执行方式脚本的常用执行方式三、Shell的变量Shell变量介绍shell变量的定义四、设置环境变量基本语法快速入门五、位置参数变量介绍●基本语法●位置参数变量六、预定义变量基本介绍基本语法七、运算符基本介绍基本语法前言 为什么要…...

Java问题诊断工具——JVisualVM

这篇文章源自一次加班改bug的惨痛经历[,,_,,]:3负责的一个项目占用不断增加,差点搞崩服务器(╥﹏╥)……一下子有点懵,不能立刻确定是哪里导致的问题,所以决定好好研究下这个之前一直被我忽视的问题诊断工具🔧——JVisualVM嘿嘿我…...

Python3实现简单的车牌检测

导语Hi,好久不见~~~两周没写东西了,从简单的开始,慢慢提高文章水准吧,下一个月开始时间就会比较充裕了~~~利用Python实现简单的车牌检测算法~~~让我们愉快地开始吧~~~相关文件网盘下载链接: https://pan.baidu.com/s/1iJmXCheJoWq…...

基于支持向量机SVM多因子测量误差预测,支持向量机MATLAB代码编程实现

目录 支持向量机SVM的详细原理 SVM的定义 SVM理论 SVM应用实例,SVM的测量误差预测 代码 结果分析 展望 支持向量机SVM的详细原理 SVM的定义 支持向量机(support vector machines, SVM)是一种二分类模型,它的基本模型是定义在特…...

新农具时代,拼多多的进击与本分

这几年,乡村振兴被频频提及,核心就是经济振兴。但经济振兴,不能只靠政府,更要靠企业,政府引导、企业主导才能真正让农民、农村、农业长期受益。企业中,被寄予厚望的是电商企业。甚至,电商成为了…...

质量工具之故障树分析FTA(2) - FTA的基本概念

关键词:问题解决、故障树、故障树分析、FTA、可靠性、鱼骨图、根本原因分析 前文我们已经详细介绍了FTA的历史。 我们在工作中碰到一个问题,可以利用的问题解决工具有很多,故障树分析FTA就是其中之一。 但是FTA毕竟是相对复杂较难掌握的工具…...

《高质量C/C++编程》读书笔记二

文章目录前言三、命名规则四、表达式和基本语句if语句循环语句五、常量前言 这本书是林锐博士写的关于C/C编程规范的一本书,我打算写下一系列读书笔记,当然我并不打算全盘接收这本书中的内容。   良好的编程习惯,规范的编程风格可以提高代码…...

常用的美颜滤镜sdk算法

本文主要介绍常见的美颜滤镜SDK算法,包括 SRGB、 HSL、 Lab、 JPEG、 TIFF等。本文不会过多介绍算法原理,只是列举一些在实际项目中用到的滤镜效果,如: 1.色彩空间变换 2.颜色范围调节 3.色彩平衡调节 4.灰度级调节 5.色相/饱和度…...

动态SQL必知必会

动态SQL必知必会1、什么是动态SQL2、为什么使用动态SQL3、动态SQL的标签4、if 标签-单标签判断5、choose标签-多条件分支判断6、set 标签-修改语句7、foreach标签7.1 批量查询7.2 批量删除7.3 批量添加8、模糊分页查询1、什么是动态SQL 动态 SQL 是 MyBatis 的强大特性之一。如…...

DML编程控制

id生成策略 模型类: Data TableName("tbl_user") public class User {TableId(type IdType.AUTO)TableId(type IdType.NONE)TableId(type IdType.INPUT)TableId(type IdType.ASSIGN_ID)TableId(type IdType.ASSIGN_UUID)private Long id;private String name;T…...

关于肺结节实时的目标检测

目录 1. 对屏幕固定区域的检测 1.1 代码 1.2 结果展示 2. video 检测 2.1 代码 2.2 展示...

利用 Rainbond 云原生平台简化 Kubernetes 业务问题排查

Kubernetes 已经成为了云原生时代基础设施的事实标准,越来越多的应用系统在 Kubernetes 环境中运行。Kubernetes 已经依靠其强大的自动化运维能力解决了业务系统的大多数运行维护问题,然而还是要有一些状况是需要运维人员去手动处理的。那么和传统运维相…...

C++中的future和promise使用方法

future和promise C11中std::future提供了一种访问异步操作结果的机制。异步操作不能马上就获取操作结果,只能在未来某个时候获取,但可以以同步等待的方式来获取结果,可以通过查询future的状态(future_status)来获取异…...

Vue项目创建

一.Axios简介 1、Axios是什么? Axios是一个基于promise的HTTP库,类似于jQuery的ajax,用于http请求。可以应用于浏览器端和node.js,既可以用于客户端,也可以用于node.js编写的服务端 安装使用 1.下载axios npm inst…...

2 Vue组件化编程

2.1. 模块与组件、模块化与组件化 模块 理解:向外提供特定功能的 js 程序,一般就是一个 js 文件为什么:js 文件很多很复杂作用:复用、简化 js 的编写,提高 js 运行效率 组件 定义:用来实现局部功能的代码…...

使用GPT-4生成QT代码

一、概述最近ChatGPT火爆起来了,ChatGPT是一种基于GPT的自然语言处理模型,可以用于生成自然语言文本,例如对话、文章等。最近又发现了一个优秀且免费的代码生成工具Cursor.so ,Cursor.so集成了 GPT-4 ,可以帮助你快速编…...

Golang每日一练(leetDay0013)

目录 37. 解数独 Sudoku Solver 🌟🌟🌟 38. 外观数列 Count and Say 🌟🌟 39. 组合总和 Combination Sum 🌟🌟 🌟 每日一练刷题专栏 🌟 Golang每日一练 专栏 Py…...

7个Python中的隐藏小技巧分享

Python 是每个程序员都喜欢的语言,因为它易于编码和易于阅读的语法。但是,你知道 python 有一些很酷的技巧可以用来让事情变得更简单吗?在今天的内容中,我将与你分享7 个你可能从未使用过的Python 技巧前言Python 是每个程序员都喜…...

学习系统编程No.8【bash实现】

引言: 北京时间:2023/3/22/6:59,一晃3月都要过去了,时间真快,我都不知道自己这个月是怎么过的呢?怎么就要结束了,难受,恍惚自己还在2022年,刚刚晨跑回来,洗完…...

2023年顶级编程语言趋势

对于开发人员和软件工程师来说,选择更优秀的编程语言使编写可以在任何地方运行的软件变得更加容易,工作效率更高。从 Java 的缓慢衰落到 MATLAB 的惊人流行,对当今最流行的编程语言的分析,可以帮助你了解最新趋势并响应最新趋势。…...

网络安全之认识勒索病毒

一、什么是勒索病毒 勒索病毒,是一种新型电脑病毒,伴随数字货币兴起,主要以邮件、程序木马、网页挂马、服务器入侵、捆绑软件等多种形式进行传播,一旦感染将给用户带来无法估量的损失。如果遭受勒索病毒攻击,将会使绝…...

C语言手撕一个Hash表(HashTable)

什么是Hash Table 散列表用的是数组支持按照下标随机访问数据的特性,所以散列表其实就是数组的一种扩展,由数组演化而来。可以说,如果没有数组,就没有散列表。 散列函数 散列函数是将我们想插入的节点散列成一个数值的函数。它…...

代码随想录第二十七天(669、108、538、回溯算法介绍)

669. 修剪二叉搜索树 不能简单地通过递归实现代码&#xff0c;比如&#xff1a; class Solution { public:TreeNode* trimBST(TreeNode* root, int low, int high) {if (root nullptr || root->val < low || root->val > high) return nullptr;root->left t…...

【Leetcode】设计循环队列

目录 【Leetcode622】设计循环队列 A.链接 B.题目再现 C.解法 【Leetcode622】设计循环队列 A.链接 设计循环队列 B.题目再现 C.解法 其实这题用数组或是链表都能解决&#xff0c;但是如果是用链表的话&#xff0c;那么队列为空的条件和队列满了的条件是一样的&#xff0…...

【Linux】浅谈shell命令以及运行原理

前言&#xff1a;上篇博文把linux下的基本指令讲解完了。本期我们聊聊Linux下【shell】命令及其运行原理。 目录 Shell的基本概念与作用 原理图展示 shell命令执行原理 Shell的基本概念与作用 Linux严格意义上说的是一个操作系统&#xff0c;我们称之为“核心&#xff08;ker…...

【shell脚本】nginx服务管理及存活检测脚本实战

前言 今天终于敢说自己是csdn万粉博主了&#xff0c;感谢大家的厚爱&#xff0c;我会继续输出更多优质的好文章&#xff0c;一起学习。 座右铭&#xff1a; 先努力让自己发光&#xff0c;再帮助更多的人。 &#x1f3e0; 个人主页&#xff1a;我是沐风晓月 &#x1f9d1; 个人…...

web服务器—nginx

一、nginx介绍Nginx(“engine x”)是一款是由俄罗斯的程序设计师Igor Sysoev所开发高性能的 Web和 反向代理服务器&#xff0c;也是一个 IMAP/POP3/SMTP 代理服务器。和apache一样&#xff0c;都是web服务器软件&#xff0c;因为其性能优异&#xff0c;所以被广大运维喜欢。又因…...

网络安全工具大合集

还是一句话&#xff0c;功夫再高&#xff0c;也怕菜刀首先&#xff0c;恭喜你发现了宝藏。本文章集成了全网优秀的开源攻防武器项目&#xff0c;包含&#xff1a;信息收集工具&#xff08;自动化利用工具、资产发现工具、目录扫描工具、子域名收集工具、指纹识别工具、端口扫描…...

什么是SHA256?比特币是如何应用SHA256算法的?

SHA 256算法是一种具有确定性的单向哈希函数 算法是执行操作的一系列步骤或过程 哈希函数是种数学函数&#xff0c;输入的长度任意&#xff0c;但是输出长度固定&#xff0c;可以理解为文件的数字指纹&#xff0c;同一个输入值&#xff0c;总是得相同的输出 SHA256&#xff0…...