UVM初学篇 -(22)UVM field_automation 域的自动化机制
field_automation机制是域的自动化的机制,这个机制的最大的优点是可以对一些变量进行批量的处理,比如对象拷贝、克隆、打印之类的变量。
一、 成员变量的注册
使用field_automation机制首先要用`uvm_field 系列宏完成变量的注册,类中的成员变量类型决定了要使用什么样的 `uvm_field 宏:如int型变量,使用`uvm_field_int(ARG,FLGA)宏,其中ARG为定义的成员变量,FLAG表示为当前成员变量的操作打开或关闭。
1,标量类型
最简单的uvm_field系列宏有如下几种:
`define uvm_field_int(ARG,FLAG)
`define uvm_field_real(ARG,FLAG)
`define uvm_field_enum(T,ARG,FLAG)
`define uvm_field_object(ARG,FLAG)
`define uvm_field_event(ARG,FLAG)
`define uvm_field_string(ARG,FLAG)
特别指出:这里的define除了枚举类型外,都是两个参数,对于枚举类型来说,`define uvm_field_enum(T,ARG,FLAG) 需要有三个参数,这里的T就是枚举的类型名称。
2,静态数组类型
与静态数组相关的uvm_field系列宏有:
`define uvm_field_sarray_int(ARG,FLAG)
`define uvm_field_sarray_enum(ARG,FLAG)
`define uvm_field_sarray_object(ARG,FLAG)
`define uvm_field_sarray_string(ARG,FLAG)
特别说明:这里都是一维数组类型,enum类型的数组里参数只有两个。
3,动态数组类型
`define uvm_field_array_enum(ARG,FLAG)
`define uvm_field_array_int(ARG,FLAG)
`define uvm_field_array_object(ARG,FLAG)
`define uvm_field_array_string(ARG,FLAG
特别说明:这里都是一维数组类型,enum类型的数组里参数只有两个。
4, 队列类型
`define uvm_field_queue_enum(ARG,FLAG)
`define uvm_field_queue_int(ARG,FLAG)
`define uvm_field_queue_object(ARG,FLAG)
`define uvm_field_queue_string(ARG,FLAG)
特别说明:enum类型的数组里参数只有两个。
5,联合数组
`define uvm_field_aa_int_string(ARG, FLAG)
`define uvm_field_aa_string_string(ARG, FLAG)
`define uvm_field_aa_object_string(ARG, FLAG)
`define uvm_field_aa_int_int(ARG, FLAG)
`define uvm_field_aa_int_int_unsigned(ARG, FLAG)
`define uvm_field_aa_int_integer(ARG, FLAG)
`define uvm_field_aa_int_integer_unsigned(ARG, FLAG)
`define uvm_field_aa_int_byte(ARG, FLAG)
`define uvm_field_aa_int_byte_unsigned(ARG, FLAG)
`define uvm_field_aa_int_shortint(ARG, FLAG)
`define uvm_field_aa_int_shortint_unsigned(ARG, FLAG)
`define uvm_field_aa_int_longint(ARG, FLAG)
`define uvm_field_aa_int_longint_unsigned(ARG, FLAG)
`define uvm_field_aa_string_int(ARG, FLAG)
`define uvm_field_aa_object_int(ARG, FLAG)
特别说明:这里联合数组有两大识别标志,一是索引的类型,二是存储数据的类型。在这一系列uvm_field系列宏中,出现的第一个类型是存储数据类型,第二个类型是索引类型,如uvm_field_aa_int_string用于声明那些存储的数据是int,而其索引是string类型的联合数组。
二、 field automation机制函数
field automation功能非常强大,它主要提供了如下函数。
1,copy函数用于实例的复制,其原型为:
extern function void copy (uvm_object rhs);
如果要把某个A实例复制到B实例中,那么应该使用B.copy(A)。在使用此函数前,B实例必须已经使用new函数分配好了内存空间。
2,compare函数用于比较两个实例是否一样,其原型为:
extern function bit compare (uvm_object rhs, uvm_comparer comparer=null);
如果要比较A与B是否一样,可以使用A.compare(B),也可以使用B.compare(A)。当两者一致时,返回1;否则为0。
3,pack_bytes函数用于将所有的字段打包成byte流,其原型为:
extern function int pack_bytes (ref byte unsigned bytestream[],input uvm_packer packer=null);
4,unpack_bytes函数用于将一个byte流逐一恢复到某个类的实例中,其原型为:
extern function int unpack_bytes (ref byte unsigned bytestream[],input uvm_packer packer=null);
5,pack函数用于将所有的字段打包成bit流,其原型为:
extern function int pack (ref bit bitstream[],input uvm_packer packer=null);
pack函数的使用与pack_bytes类似。
6,unpack函数用于将一个bit流逐一恢复到某个类的实例中,其原型为:
extern function int unpack (ref bit bitstream[], input uvm_packer packer=null);
7,pack_ints函数用于将所有的字段打包成int(4个byte,或者dword)流,其原型为:
extern function int pack_ints (ref int unsigned intstream[],input uvm_packer packer=null);
8,unpack_ints函数用于将一个int流逐一恢复到某个类的实例中,其原型为:
extern function int unpack_ints (ref int unsigned intstream[],input uvm_packer packer=null);
9,print函数用于打印所有的字段。
function void print (uvm_printer printer = null)
10,clone函数,原型是:
virtual function uvm_object clone ()
三、 field_automation使用方法
1, object类型域的自动化
part1/field_automation是UVM field_automation机制的实验,首先注册在`uvm_object_utils_begin(sequence_item),` uvm_object_utils_end之间。
`uvm_object_utils_begin(squence_item)
`uvm_field_int(data,UVM_ALL_ON)
…
`uvm_object_utils_end
注册之后就可以在验证环境中使用field_automation函数。
在dadd_item对data,addr进行了注册。
File:dadd_item.svClass:dadd_itemclass dadd_item extends uvm_sequence_item;`uvm_object_utils_begin(dadd_item)`uvm_field_int(data,UVM_ALL_ON)`uvm_field_int(addr,UVM_ALL_ON)`uvm_object_utils_endrand bit data_en;rand bit [31:0] data;rand bit [31:0] addr;extern function new(string name ="dadd_item");endclass: dadd_item
代码3.41 field_automation机制对item中参数注册代码
在dadd_scoreboard中对DUT的数据包和参考模型的数据包对比时用到了compare函数,这样对比的就是data和addr变量。
File:dadd_scoreboard.svClass:dadd_scoreboardtask dadd_scoreboard :: main_phase(uvm_phase phase);dadd_item dadd_exp_item, dadd_act_item, tmp_dadd_exp_item;forkwhile(1)beginexp_port.get(dadd_exp_item);dadd_exp_queue.push_front(dadd_exp_item);endwhile(1)beginact_port.get(dadd_act_item);beginwait(dadd_exp_queue.size()>0);tmp_dadd_exp_item = dadd_exp_queue.pop_back();if(!tmp_dadd_exp_item.compare(dadd_act_item))begin`uvm_error("dadd_scoreboard",$sformatf("Transaction miss match!\nExpect_addr:%h,Expect_data:%h\nActual_addr:%h,Expect_data:%h\n", tmp_dadd_exp_item.addr,tmp_dadd_exp_item.data,dadd_act_item.addr,dadd_act_item.data));endelsebegin`uvm_info("dadd_scoreboard","DADD_PASS",UVM_LOW);endendendjoinendtask: main_phase
代码3.42 field_automation机制实验中的dadd_scoreboard的代码
2,component类型域的自动化
首先注册在`uvm_component_utils_begin(component),` uvm_component_utils_end之间。
`uvm_component_utils_begin(squence_item)
`uvm_field_int(data,UVM_ALL_ON)
…
`uvm_component_utils_end
注册之后在也可在环境中使用一些相关的函数。
前面config_db机制讲过config_db::get时可以不用写也能得到相应的值,这就用到了field_automation机制。
在component通过field_automation机制注册的变量可以省略config_db::get,但是要注意config_db::get的第三个参数,也就是标志位一定要和得到这个值的变量名一致。
在part1/field_automation实验中,在dadd_environment中向dadd_driver发送一个字符串:
File:dadd_environment.svClass:dadd_environmentfunction void dadd_environment :: build_phase(uvm_phase phase);iagt = dadd_iagent :: type_id :: create("iagt",this);oagt = dadd_oagent :: type_id :: create("oagt",this);refmdl = dadd_refmodel :: type_id :: create("refmdl",this);scb = dadd_scoreboard :: type_id :: create("scb",this);dadd_iagt_to_refmdl_fifo = new("dadd_iagt_to_refmdl_fifo",this);dadd_oagt_to_scb_fifo = new("dadd_oagt_to_scb_fifo",this);dadd_refmdl_to_scb_fifo = new("dadd_refmdl_to_scb_fifo",this);if(!uvm_config_db #(virtual dadd_interface) :: get(this,"","vif",vif))`uvm_fatal("dadd_environment","The interface is not get !!!");iagt.vif = vif;oagt.vif = vif;uvm_config_db#(string) :: set(this,"iagt.drv","field_automation_config_db","This is no need config_db::get by use field_automation in component.");endfunction : build_phase
代码3.43 field_automation机制component类型域的自动化实验中dadd_environment的代码
在dadd_driver中声明了一个变量
string field_automation_config_db;
在main_phase中直接打印出field_automation_config_db,这个变量名字和dadd_environment中config_db::set的值是相同的。
File:dadd_driver.svClass:dadd_driverclass dadd_driver extends uvm_driver #(dadd_item);string field_automation_config_db;`uvm_component_utils_begin(dadd_driver)`uvm_field_string(field_automation_config_db,UVM_ALL_ON)`uvm_component_utils_end
代码3.44 field_automation机制component类型域的自动化实验中dadd_driver的代码
执行Makefile脚本:
make all
执行仿真,打印的结果为:
![]()
图3.24 component类型域的自动化实验的仿真log截图
本书(《UVM实验教程-从平台、脚本到方法学全代码解析-王建利》)及其实验代码已上传至GitHub 访问网址为: https://github.com/brentwang-lab/uvm_tb_gen
相关文章:
UVM初学篇 -(22)UVM field_automation 域的自动化机制
field_automation机制是域的自动化的机制,这个机制的最大的优点是可以对一些变量进行批量的处理,比如对象拷贝、克隆、打印之类的变量。 一、 成员变量的注册 使用field_automation机制首先要用uvm_field 系列宏完成变量的注册,类中的成员变…...
STL二分查找
本课主要介绍容器部分里面的二分查找函数。涉及的函数有 3 个,这 3 个函数的强两个输入参数都和迭代器有关,或者说参数是可以迭代的,而第三个参数则是你要查找的值。 1. binary_search binary_search 的返回结果是 bool 值,如果找…...
啤酒游戏—企业经营决策沙盘
感谢黄浦区文华学院的邀请,今年是为南房集团开展系统思考培训的第二年。我们现在为客户设计的一整年系统思考训练中,会将系统环路结构图与真实议题研讨作为前置内容,让大家在理解整体框架后,再体验麻省理工学院系统动力学著名的“…...
尚硅谷-react教程-求和案例-@redux-devtools/extension 开发者工具使用-笔记
## 7.求和案例_react-redux开发者工具的使用(1).npm install redux-devtools/extension(2).store中进行配置import { composeWithDevTools } from redux-devtools/extension;export default createStore(allReducer,composeWithDevTools(applyMiddleware(thunk))) src/redux/s…...
【动手学强化学习】part2-动态规划算法
阐述、总结【动手学强化学习】章节内容的学习情况,复现并理解代码。 文章目录 一、什么是动态规划?1.1概念1.2适用条件 二、算法示例2.1问题建模2.2策略迭代(policyiteration)算法2.2.1伪代码2.2.2完整代码2.2.3运行结果2.2.4代码…...
【python爬虫实战】爬取全年天气数据并做数据可视化分析!附源码
由于篇幅限制,无法展示完整代码,需要的朋友可在下方获取!100%免费。 一、主题式网络爬虫设计方案 1. 主题式网络爬虫名称:天气预报爬取数据与可视化数据 2. 主题式网络爬虫爬取的内容与数据特征分析: - 爬取内容&am…...
初识Linux · 动静态库(incomplete)
目录 前言: 静态库 动态库 前言: 继上文,我们从磁盘的理解,到了文件系统框架的基本搭建,再到软硬链接部分,我们开始逐渐理解了为什么运行程序需要./a.out了,这个前面的.是什么我们也知道了。…...
华为OD机试 - 匿名信(Java 2024 E卷 100分)
华为OD机试 2024E卷题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为OD机试(JAVA)真题(E卷D卷A卷B卷C卷)》。 刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加…...
通过rancher2.7管理k8s1.24及1.24以上版本的k8s集群
目录 初始化实验环境 安装Rancher 登录Rancher平台 通过Rancher2.7管理已存在的k8s最新版集群 文档中的YAML文件配置直接复制粘贴可能存在格式错误,故实验中所需要的YAML文件以及本地包均打包至网盘. 链接:https://pan.baidu.com/s/1oYX4eGoBtW_R-7i…...
text-align的属性justify
text-align常用的属性是left、center、right,具体的可参考css解释,今天重点记录的对象是justify justify 可以使文本的两端都对齐在两端对齐文本中,文本行的左右两端都放在父元素的内边界上。然后,调整单词和字母间的间隔&#x…...
使用python自制桌面宠物,好玩!——枫原万叶桌宠,可以直接打包成exe去跟朋友炫耀。。。
大家好,我是小黄。 今天我们使用python实现一个桌面宠物。只需要gif动态图片就行。超级简单容易上手。 #完整源代码可在下方图片免费获取 一:下载相关的库文件。 我们本次使用到的库文件为:tkinter和pyautogui 下载命令: pip…...
使用 ASP.NET Core 8.0 创建最小 API
构建最小 API,以创建具有最小依赖项的 HTTP API。 它们非常适合需要在 ASP.NET Core 中仅包括最少文件、功能和依赖项的微服务和应用。 本教程介绍使用 ASP.NET Core 生成最小 API 的基础知识。 在 ASP.NET Core 中创建 API 的另一种方法是使用控制器。 有关在最小 …...
气候服务平台ClimateSERV2.0简介(python)
1 简介 ClimateSERV 2.0允许开发从业者、科学家/研究人员和政府决策者可视化和下载历史降雨数据、植被状况数据以及 180 天的降雨和温度预报,以增进对农业和水资源供应相关问题的理解并做出改进的决策。 这些数据可以通过 Web 应用程序直接访问,也可以…...
Docker | centos7上对docker进行安装和配置
安装docker docker配置条件安装地址安装步骤2. 卸载旧版本3. yum 安装gcc相关4. 安装需要的软件包5. 设置stable镜像仓库6. 更新yum软件包索引7. 安装docker引擎8. 启动测试9. 测试补充:设置国内docker仓库镜像 10. 卸载 centos7安装docker https://docs.docker.com…...
React--》掌握Valtio让状态管理变得轻松优雅
Valtio采用了代理模式,使状态管理变得更加直观和易于使用,同时能够与React等框架无缝集成,本文将深入探讨Valtio的核心概念、使用场景以及其在提升应用性能中的重要作用,帮助你掌握这一强大工具,从而提升开发效率和用户…...
python爬虫百度图片
直接给代码,可直接用,个人需要修改的地方有两处: self.directory 这是本地存储地址,修改为自己电脑的地址,另外,**{}**不要删spider.json_count 10 这是下载的图像组数,一组有30张图像&#x…...
前端开发:Vue中数据绑定原理
Vue 中最大的一个特征就是数据的双向绑定,而这种双向绑定的形式,一方面表现在元数据与衍生数据之间的响应,另一方面表现在元数据与视图之间的响应,而这些响应的实现方式,依赖的是数据链,因此,要…...
CTF-RE 从0到N: TEA
TEA TEA(Tiny Encryption Algorithm,轻量加密算法) 是一种简单、快速的对称加密算法。它是一个分组加密算法,通常用于加密 64 位的数据块,并使用 128 位的密钥。TEA 是一种“费斯妥结构”(Feistel structu…...
python 使用PIL获取图片长宽
在Python中,你可以使用Pillow库(PIL的一个分支和替代品)来获取图片的长和宽。Pillow提供了丰富的图像处理功能,包括获取图像的基本属性,如尺寸。 以下是一个简单的示例,展示了如何使用Pillow库来获取图片的…...
【Nas】X-DOC:搞机之PVE部署All In One(黑群晖NAS 软路由OpenWrt Docker Win10远程桌面)
【Nas】X-DOC:搞机之PVE部署All In One(黑群晖NAS & 软路由OpenWrt & Docker & Win10远程桌面) 1、原硬件配置清单:2、改AIO后增加配置清单:3、虚拟化平台PVE:4、搭建的关键服务: 1…...
.Net框架,除了EF还有很多很多......
文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...
循环冗余码校验CRC码 算法步骤+详细实例计算
通信过程:(白话解释) 我们将原始待发送的消息称为 M M M,依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)(意思就是 G ( x ) G(x) G(x) 是已知的)࿰…...
条件运算符
C中的三目运算符(也称条件运算符,英文:ternary operator)是一种简洁的条件选择语句,语法如下: 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true,则整个表达式的结果为“表达式1”…...
HTML 列表、表格、表单
1 列表标签 作用:布局内容排列整齐的区域 列表分类:无序列表、有序列表、定义列表。 例如: 1.1 无序列表 标签:ul 嵌套 li,ul是无序列表,li是列表条目。 注意事项: ul 标签里面只能包裹 li…...
新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案
随着新能源汽车的快速普及,充电桩作为核心配套设施,其安全性与可靠性备受关注。然而,在高温、高负荷运行环境下,充电桩的散热问题与消防安全隐患日益凸显,成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...
【JVM面试篇】高频八股汇总——类加载和类加载器
目录 1. 讲一下类加载过程? 2. Java创建对象的过程? 3. 对象的生命周期? 4. 类加载器有哪些? 5. 双亲委派模型的作用(好处)? 6. 讲一下类的加载和双亲委派原则? 7. 双亲委派模…...
【 java 虚拟机知识 第一篇 】
目录 1.内存模型 1.1.JVM内存模型的介绍 1.2.堆和栈的区别 1.3.栈的存储细节 1.4.堆的部分 1.5.程序计数器的作用 1.6.方法区的内容 1.7.字符串池 1.8.引用类型 1.9.内存泄漏与内存溢出 1.10.会出现内存溢出的结构 1.内存模型 1.1.JVM内存模型的介绍 内存模型主要分…...
Bean 作用域有哪些?如何答出技术深度?
导语: Spring 面试绕不开 Bean 的作用域问题,这是面试官考察候选人对 Spring 框架理解深度的常见方式。本文将围绕“Spring 中的 Bean 作用域”展开,结合典型面试题及实战场景,帮你厘清重点,打破模板式回答,…...
通过MicroSip配置自己的freeswitch服务器进行调试记录
之前用docker安装的freeswitch的,启动是正常的, 但用下面的Microsip连接不上 主要原因有可能一下几个 1、通过下面命令可以看 [rootlocalhost default]# docker exec -it freeswitch fs_cli -x "sofia status profile internal"Name …...
Linux 下 DMA 内存映射浅析
序 系统 I/O 设备驱动程序通常调用其特定子系统的接口为 DMA 分配内存,但最终会调到 DMA 子系统的dma_alloc_coherent()/dma_alloc_attrs() 等接口。 关于 dma_alloc_coherent 接口详细的代码讲解、调用流程,可以参考这篇文章,我觉得写的非常…...
