uvm白皮书练习_ch2_ch221只有driver的验证平台之*2.2.1 最简单的验证平台
uvm白皮书练习
ch221
dut.sv
这个DUT的功能非常简单,通过rxd接收数据,再通过txd发送出去。其中rx_dv是接收的数据有效指示,tx_en是发送的数据有效指示。
module dut (clk,rst_n,rxd,rx_dv,txd,tx_en
);input clk ; input rst_n ; input rxd ; input rx_dv ; output txd ; output tx_en ; reg [7:0] txd;
reg tx_en; always @(posedge clk) beginif(!rst_n)begintxd <= 8'h00;tx_en <= 1'b0;endelse begintxd <= rxd;tx_en <= rx_dv;end
end
endmodule
my_driver.sv
所有派生自uvm_driver的类的new函数有两个参数,一个是string类型的name,一个是uvm_component类型的parent。关于name参数,比较好理解,就是名字而已;至于parent则比较难以理解,读者可暂且放在一边,下文会有介绍。事实上,这两个参数是由uvm_component要求的,每一个派生自uvm_component或其派生类的类在其new函数中要指明两个参数:name和parent,这是uvm_component类的一大特征。而uvm_driver是一个派生自uvm_component的类,所以也会有这两个参数。
driver所做的事情几乎都在main_phase中完成。UVM由phase来管理验证平台的运行,这些phase统一以xxxx_phase来命名,且都有一个类型为uvm_phase、名字为phase的参数。main_phase是uvm_driver中预先定义好的一个任务。因此几乎可以简单地认为,实现一个driver等于实现其main_phase。上述代码中还出现了uvm_info宏。这个宏的功能与Verilog中display语句的功能类似,但是它比display语句更加强大。它有三个参数,第一个参数是字符串,用于把打印的信息归类;第二个参数也是字符串,是具体需要打印的信息;第三个参数则是冗余级别。在验证平台中,某些信息是非常关键的,这样的信息可以设置为UVM_LOW,而有些信息可有可无,就可以设置为UVM_HIGH,介于两者之间的就是UVM_MEDIUM。UVM默认只显示UVM_MEDIUM或者UVM_LOW的信息
uvm_info宏非常强大,它包含了打印信息的物理文件来源、逻辑结点信息(在UVM树中的路径索引)、打印时间、对信息的分类组织及打印的信息。读者在搭建验证平台时应该尽量使用uvm_info宏取代display语句。
类的定义类似于在纸上写下一纸条文,然后把这些条文通知给SystemVerilog的仿真器:验证平台可能会用到这样的一个类,请做好准备工作。而类的实例化在于通过new()来通知SystemVerilog的仿真器:请创建一个A的实例。仿真器接到new的指令后,就会在内存中划分一块空间,在划分前,会首先检查是否已经预先定义过这个类,在已经定义过的情况下,按照定义中所指定的“条文”分配空间,并且把这块空间的指针返回给a_inst,之后就可以通过a_inst来查看类中的各个成员变量,调用成员函数/任务等。对大部分的类来说,如果只定义而不实例化,是没有任何意义的(这里的例外是一些静态类,其成员变量都是静态的,不实例化也可以正常使用。);而如果不定义就直接实例化,仿真器将会报错。
第2行把uvm_macros.svh文件通过include语句包含进来。这是UVM中的一个文件,里面包含了众多的宏定义,只需要包含一次。
第4行通过import语句将整个uvm_pkg导入验证平台中。只有导入了这个库,编译器在编译my_driver.sv文件时才会认识其中的uvm_driver等类名。
第24和25行定义一个my_driver的实例并将其实例化。注意这里调用new函数时,其传入的名字参数为drv,前文介绍uvm_info宏的打印信息时出现的代表路径索引的drv就是在这里传入的参数drv。另外传入的parent参数为null,在真正的验证平台中,这个参数一般不是null,这里暂且使用null。
第26行显式地调用my_driver的main_phase。在main_phase的声明中,有一个uvm_ phase类型的参数phase,在真正的验证平台中,这个参数是不需要用户理会的。本节的验证平台还算不上一个完整的UVM验证平台,所以暂且传入null。
第27行调用finish函数结束整个仿真,这是一个Verilog中提供的函数。
(行数不一定一一对应,需要自己判断)
`ifndef MY_DRIVER_SV
`define MY_DRIVER_SVclass my_driver extends uvm_driver;function new(string name="my_driver",uvm_component parent =null);super.new(name,parent);endfunction //new()extern virtual task main_phase(uvm_phase phase);//调用附近的代码
endclass //my_driver extends uvm_drivertask my_driver::main_phase(uvm_phase phase);top_tb.rxd <= 8'b0;//初始值复位top_tb.rx_dv <= 1'b0;while (!top_tb.rst_n) @(posedge top_tb.clk);//等个时钟for(int i =0;i<25;i++)begin@(posedge top_tb.clk);//等个时钟top_tb.rxd <= i[7:0];// top_tb.rxd <= $urand_range(0.255);top_tb.rx_dv <= 1'b1;`uvm_info("my_driver","data is driver",UVM_LOW);end@(posedge top_tb.clk);top_tb.rx_dv <= 1'b0;
endtask //my_driver::main_phase
`endif
top_tb.sv
`timescale 1ns/1ns
`include "uvm_macros.sv"import uvm_pkg::*;
`include "my_driver.sv"module top_tb ;
reg clk ; //时钟
reg rst_n ; //复位
reg [7:0] rxd ; //接受数据
reg rx_dv ; //接受数据
reg [7:0] txd ; //发送数据
reg tx_en ; //发送数据dut my_dut(
.clk (clk ),
.rst_n (rst_n),
.rxd (rxd ),
.rx_dv (rx_dv),
.txd (txd ),
.tx_en (tx_en)
);initial beginmy_driver drv;drv = new("drv",null);//传入数据drv.main_phase(null);$finish;
end
/*时钟模块*/
initial beginclk = 0;forever begin#100ns clk = ~clk;end
end
/*复位模块*/
initial beginrst_n = 1'b0;#1000;rst_n = 1'b1;
end/*fsdb*/
initial begin$fsdbDumpfile("verilog.fsdb");$fsdbDumpvars(0);$display("fsdbDumpfilrs is start at %d",$time);// #1e7;// $finish;
end
endmodule
仿真结果
激励本来是256次,发送随机数,这里为了方便直观,改25次,升序
fsdbDumpfilrs is start at 0
UVM_INFO my_driver.sv(22) @ 1000: drv [my_driver] data is driver
UVM_INFO my_driver.sv(22) @ 3000: drv [my_driver] data is driver
UVM_INFO my_driver.sv(22) @ 5000: drv [my_driver] data is driver
UVM_INFO my_driver.sv(22) @ 7000: drv [my_driver] data is driver
UVM_INFO my_driver.sv(22) @ 9000: drv [my_driver] data is driver
UVM_INFO my_driver.sv(22) @ 11000: drv [my_driver] data is driver
UVM_INFO my_driver.sv(22) @ 13000: drv [my_driver] data is driver
UVM_INFO my_driver.sv(22) @ 15000: drv [my_driver] data is driver
UVM_INFO my_driver.sv(22) @ 17000: drv [my_driver] data is driver
UVM_INFO my_driver.sv(22) @ 19000: drv [my_driver] data is driver
UVM_INFO my_driver.sv(22) @ 21000: drv [my_driver] data is driver
UVM_INFO my_driver.sv(22) @ 23000: drv [my_driver] data is driver
UVM_INFO my_driver.sv(22) @ 25000: drv [my_driver] data is driver
UVM_INFO my_driver.sv(22) @ 27000: drv [my_driver] data is driver
UVM_INFO my_driver.sv(22) @ 29000: drv [my_driver] data is driver
UVM_INFO my_driver.sv(22) @ 31000: drv [my_driver] data is driver
UVM_INFO my_driver.sv(22) @ 33000: drv [my_driver] data is driver
UVM_INFO my_driver.sv(22) @ 35000: drv [my_driver] data is driver
UVM_INFO my_driver.sv(22) @ 37000: drv [my_driver] data is driver
UVM_INFO my_driver.sv(22) @ 39000: drv [my_driver] data is driver
UVM_INFO my_driver.sv(22) @ 41000: drv [my_driver] data is driver
UVM_INFO my_driver.sv(22) @ 43000: drv [my_driver] data is driver
UVM_INFO my_driver.sv(22) @ 45000: drv [my_driver] data is driver
UVM_INFO my_driver.sv(22) @ 47000: drv [my_driver] data is driver
UVM_INFO my_driver.sv(22) @ 49000: drv [my_driver] data is driver
$finish called from file "top_tb.sv", line 28.
$finish at simulation time 51000相关文章:
uvm白皮书练习_ch2_ch221只有driver的验证平台之*2.2.1 最简单的验证平台
uvm白皮书练习 ch221 dut.sv 这个DUT的功能非常简单,通过rxd接收数据,再通过txd发送出去。其中rx_dv是接收的数据有效指示,tx_en是发送的数据有效指示。 module dut (clk,rst_n,rxd,rx_dv,txd,tx_en );input clk ; input rst_n ; in…...
服务断路器_Resilience4j超时降级
创建模块cloud-consumer-resilience4j-order80 POM引入依赖 <dependencies><!-- 引入Eureka 客户端依赖 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</a…...
【知识点随笔分析】我看看谁还不会用CURL命令
目录 前言: CURL介绍: CURL的基本使用: CURL与PING命令的区别: CURL命令的应用: 总结: 前言: 当今互联网时代,与服务器进行数据交互成为了无法回避的需求。无论是获取Web…...
ICCV 2023|Occ2Net,一种基于3D 占据估计的有效且稳健的带有遮挡区域的图像匹配方法...
本文为大家介绍一篇入选ICCV 2023的论文,《Occ2Net: Robust Image Matching Based on 3D Occupancy Estimation for Occluded Regions》, 一种基于3D 占据估计的有效且稳健的带有遮挡区域的图像匹配方法。 论文链接:https://arxiv.org/abs/23…...
leetcode - 14. Longest Common Prefix
Description Write a function to find the longest common prefix string amongst an array of strings. If there is no common prefix, return an empty string “”. Example 1: Input: strs ["flower","flow","flight"] Output: "…...
MySQL-查询语句语法(DQL)结构(查询操作 一)
SQL语句 编写顺序 - 执行顺序 1、SELECT 字段列表 4 2、FROM 表名列表 1 3、WHERE 条件列表 2 4、GROUP BY 分组字段列表 …...
SWAT-MODFLOW地表水与地下水耦合
耦合模型被应用到很多科学和工程领域来改善模型的性能、效率和结果,SWAT作为一个地表水模型可以较好的模拟主要的水文过程,包括地表径流、降水、蒸发、风速、温度、渗流、侧向径流等,但是对于地下水部分的模拟相对粗糙,考虑到SWAT…...
工地临时用电之智慧用电:全方位保障用电安全
随着科技进步和智能化的发展,工地用电管理也迎来了智慧化的革新。智慧用电,作为智慧工地的重要组成部分,通过集中式管理和创新的技术手段,为工地提供了全方位的用电安全保障。 针对工地临时用 的现状及系统结构,力安科…...
JumpServer开源堡垒机与爱可生云树数据库完成兼容性认证
近日,中国领先的开源软件提供商FIT2CLOUD飞致云宣布,JumpServer开源堡垒机已经完成与爱可生云树数据库软件的兼容性认证。经过双方联合测试,云树数据库软件(简称:ActionDB)V1.0与杭州飞致云信息科技有限公司…...
信息化发展64
信息化体系 信息化代表了一种信息技术被高度应用,信息资源被高度共享,从而使得人的智能潜力以及社会物质资源潜力被充分发挥,个人行为、组织决策和社会运行趋于合理化的理想状态。 1997年召开的首届全国信息化工作会议,对信息化和…...
什么是全媒体整合营销?如何做好全媒体整合营销呢?
互联网发展进入深水区,目前营销大部分工作都与网络有关,网络营销形成各种分支,媒体平台的类型越来越多,如今的互联网发展背景下企业如何做好网络营销呢?小马识途营销顾问团队普遍认为企业当今应该开展的全媒体整合营销…...
系统集成|第十六章(笔记)
目录 第十六章 信息(文档)和配置管理16.1 文档管理16.2 配置管理 上篇:第十五章、采购管理 下篇:第十七章、变更管理 第十六章 信息(文档)和配置管理 16.1 文档管理 信息系统项目相关信息(文档…...
hive数据库操作,hive函数,FineBI可视化操作
1、数据库操作 1.1、创建数据库 create database if not exists myhive;use myhive;1.2、查看数据库详细信息 desc database myhive;数据库本质上就是在HDFS之上的文件夹。 默认数据库的存放路径是HDFS的:/user/hive/warehouse内 1.3、创建数据库并指定hdfs存…...
信息学奥赛一本通 2075:【21CSPJ普及组】插入排序(sort) | 洛谷 P7910 [CSP-J 2021] 插入排序
【题目链接】 ybt 2075:【21CSPJ普及组】插入排序(sort) 洛谷 P7910 [CSP-J 2021] 插入排序 【题目考点】 1. 排序: 插入排序 插入排序示例: #include <bits/stdc.h> using namespace std; int main() {int…...
基于微信小程序的民宿短租酒店预订系统设计与实现(源码+lw+部署文档+讲解等)
文章目录 前言系统主要功能:具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序(小蔡coding)有保障的售后福利 代码参考源码获取 前言 💗博主介绍:✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计…...
Python第二次作业(2)【控制台界面】
要求:使用Python输出五个控制台界面 第一张: 代码如下: print(" 英雄联盟商城登录界面 ") print("~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*") print(" 1.用户登录 &q…...
conda创建环境在Collecting package metadata (current_repodata.json)时报错的解决
conda创建环境在Collecting package metadata (current_repodata.json)时报错的解决 报错信息: Collecting package metadata (current_repodata.json): - ERROR conda.auxlib.logz:stringify(171): Traceback (most recent call last): File “C:\Users\dandelion…...
卤制品配送经营商城小程序的用处是什么
卤制品也是食品领域重要的分支,尤其对年轻人来说,只要干净卫生好吃价格合理,那复购率宣传性自是不用说,而随着互联网发展,传统线下门店也须要通过线上破解难题或进一步扩大生意。 而商城小程序无疑是商家通过线上私域…...
信息化发展65
1.2现代化基础设施 基础设施包括交通、能源、水利、物流等以传统基础设施和信息网络为核心的新型基础设施,在国家发展全局中具有战略性、基础性、先导性作用。统筹推进传统基础设施和新型基础设施建设,打造系统完备、高效实用、智能绿色、安全可靠的现代…...
pytho实例--pandas读取表格内容
前言:由于运维反馈帮忙计算云主机的费用,特编写此脚本进行运算 如图,有如下excel数据 计算过程中需用到数据库中的数据,故封装了一个读取数据库的类 import MySQLdb from sshtunnel import SSHTunnelForwarderclass SSHMySQL(ob…...
IDEA运行Tomcat出现乱码问题解决汇总
最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…...
Java 语言特性(面试系列1)
一、面向对象编程 1. 封装(Encapsulation) 定义:将数据(属性)和操作数据的方法绑定在一起,通过访问控制符(private、protected、public)隐藏内部实现细节。示例: public …...
Zustand 状态管理库:极简而强大的解决方案
Zustand 是一个轻量级、快速和可扩展的状态管理库,特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...
模型参数、模型存储精度、参数与显存
模型参数量衡量单位 M:百万(Million) B:十亿(Billion) 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的,但是一个参数所表示多少字节不一定,需要看这个参数以什么…...
从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路
进入2025年以来,尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断,但全球市场热度依然高涨,入局者持续增加。 以国内市场为例,天眼查专业版数据显示,截至5月底,我国现存在业、存续状态的机器人相关企…...
Mac软件卸载指南,简单易懂!
刚和Adobe分手,它却总在Library里给你写"回忆录"?卸载的Final Cut Pro像电子幽灵般阴魂不散?总是会有残留文件,别慌!这份Mac软件卸载指南,将用最硬核的方式教你"数字分手术"࿰…...
【HTTP三个基础问题】
面试官您好!HTTP是超文本传输协议,是互联网上客户端和服务器之间传输超文本数据(比如文字、图片、音频、视频等)的核心协议,当前互联网应用最广泛的版本是HTTP1.1,它基于经典的C/S模型,也就是客…...
Web后端基础(基础知识)
BS架构:Browser/Server,浏览器/服务器架构模式。客户端只需要浏览器,应用程序的逻辑和数据都存储在服务端。 优点:维护方便缺点:体验一般 CS架构:Client/Server,客户端/服务器架构模式。需要单独…...
Python 训练营打卡 Day 47
注意力热力图可视化 在day 46代码的基础上,对比不同卷积层热力图可视化的结果 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader import matplotlib.pypl…...
基于鸿蒙(HarmonyOS5)的打车小程序
1. 开发环境准备 安装DevEco Studio (鸿蒙官方IDE)配置HarmonyOS SDK申请开发者账号和必要的API密钥 2. 项目结构设计 ├── entry │ ├── src │ │ ├── main │ │ │ ├── ets │ │ │ │ ├── pages │ │ │ │ │ ├── H…...
