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…...
未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?
编辑:陈萍萍的公主一点人工一点智能 未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战,在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...
Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例
使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件,常用于在两个集合之间进行数据转移,如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model:绑定右侧列表的值&…...
C++.OpenGL (10/64)基础光照(Basic Lighting)
基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...
【7色560页】职场可视化逻辑图高级数据分析PPT模版
7种色调职场工作汇报PPT,橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版:职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...
push [特殊字符] present
push 🆚 present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中,push 和 present 是两种不同的视图控制器切换方式,它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...
android13 app的触摸问题定位分析流程
一、知识点 一般来说,触摸问题都是app层面出问题,我们可以在ViewRootImpl.java添加log的方式定位;如果是touchableRegion的计算问题,就会相对比较麻烦了,需要通过adb shell dumpsys input > input.log指令,且通过打印堆栈的方式,逐步定位问题,并找到修改方案。 问题…...
在树莓派上添加音频输入设备的几种方法
在树莓派上添加音频输入设备可以通过以下步骤完成,具体方法取决于设备类型(如USB麦克风、3.5mm接口麦克风或HDMI音频输入)。以下是详细指南: 1. 连接音频输入设备 USB麦克风/声卡:直接插入树莓派的USB接口。3.5mm麦克…...
Spring Security 认证流程——补充
一、认证流程概述 Spring Security 的认证流程基于 过滤器链(Filter Chain),核心组件包括 UsernamePasswordAuthenticationFilter、AuthenticationManager、UserDetailsService 等。整个流程可分为以下步骤: 用户提交登录请求拦…...
Elastic 获得 AWS 教育 ISV 合作伙伴资质,进一步增强教育解决方案产品组合
作者:来自 Elastic Udayasimha Theepireddy (Uday), Brian Bergholm, Marianna Jonsdottir 通过搜索 AI 和云创新推动教育领域的数字化转型。 我们非常高兴地宣布,Elastic 已获得 AWS 教育 ISV 合作伙伴资质。这一重要认证表明,Elastic 作为 …...
Ubuntu系统多网卡多相机IP设置方法
目录 1、硬件情况 2、如何设置网卡和相机IP 2.1 万兆网卡连接交换机,交换机再连相机 2.1.1 网卡设置 2.1.2 相机设置 2.3 万兆网卡直连相机 1、硬件情况 2个网卡n个相机 电脑系统信息,系统版本:Ubuntu22.04.5 LTS;内核版本…...
