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…...
linux 驱动源码分析的理解。
首先 , 是linux 驱动,我看网上的老师,在分析源码时 , 不会 所有的函数都分析,而是分析一些比较重要的函数,一些厉害的人,在分析源码时…...
鸿蒙-任务栏右击退出 或 UIAbility窗口关闭,怎么弹框拦截
onPrepareToTerminate 需要配置权限 ohos.permission.PREPARE_APP_TERMINATE 参考链接:文档中心import { emitter } from kit.BasicServicesKit; import { common } from kit.AbilityKit; import { TipsDialog } from kit.ArkUI;// entryAbility.ets 在你的uiabilit…...
【C++进阶篇】——STL的简介
【C进阶篇】——STL的简介 1.什么是STL STL(standard template libaray-标准模板库):是C标准库的重要组成部分,不仅是一个可复用的组件库,而且是一个包罗数据结构与算法的软件框架。 2.STL的版本 原始版本 Alexander Stepanov、Meng Lee 在…...
信息安全工程师(70)网络攻击陷阱技术与应用
前言 网络攻击陷阱技术是一种主动的防御方法,作为网络安全的重要策略和技术手段,有利于网络安全管理者获得信息优势。 一、网络攻击陷阱技术原理 网络攻击陷阱技术可以消耗攻击者所拥有的资源,加重攻击者的工作量,迷惑攻击者&…...
Web保存状态的手段(Session的使用)
一,JSP中的page指令 1. <% page language“java” session“true”%> session:此页面是否使用session,默认值为true 二,使用Session完善之前的登录程序 1. 如何禁止直接输入URL地址进入登录功能的欢迎界面? …...
第五十四章 安全元素的详细信息 - DerivedKeyToken 详情
文章目录 第五十四章 安全元素的详细信息 - <DerivedKeyToken> 详情详情消息中的位置 第五十四章 安全元素的详细信息 - 详情 <DerivedKeyToken> 的目的是携带发送者和接收者可以独立使用的信息来生成相同的对称密钥。这些方可以使用该对称密钥对 SOAP 消息的相关…...
kafka 的高可用机制是什么?
大家好,我是锋哥。今天分享关于【kafka 的高可用机制是什么?】面试题?希望对大家有帮助; kafka 的高可用机制是什么? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Apache Kafka 是一个分布式消息系统&am…...
4.1.3 网站通信技术
文章目录 1. 网站通信方式2. URL - 统一资源定位符定义格式演示 3. 发送请求的4种形式在地址栏中输入URL访问超链接href属性指定URLform表单在action中指定URL通过AJAX请求后端数据 4. 两种不同返回的请求发送URL,后端处理完响应页面发送AJAX请求,后端处…...
Java-图书管理系统
我的个人主页 欢迎来到我的Java图书管理系统,接下来让我们一同探索如何书写图书管理系统吧! 1管理端和用户端 2建立相关的三个包(book、operation、user) 3建立程序入口Main类 4程序运行 1.首先图书馆管理系统分为管理员端和…...
python如何通过json以及pickle读写保存数据
记录信息 比如说我写了这样一段程序,记录了爱吃的食物: food_list []while True:c input("输入1添加新的食物,输入2查询已添加的食物,输入exit退出:")if c "1":new_food input("输入你…...
dede 百度网站地图/酒店网络营销方式有哪些
1. 介绍Linux平台SQL Server 2017 AlwaysOn可用性组可细分为三种情况:针对高可用性创建需要Pacemaker搭建Linux群集,在Linux群集上的可用性组需要CLUSTER_TYPE EXTERNAL。仅为读取缩放创建无需配置Linux群集,可用性组设置为CLUSTER_TYPE NO…...
做网站需要什么人员/电商运营怎么自学
题意描述: 给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。 解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。 注意,返回任意的子集,所以与之前的题目在终止条…...
白城网站建设哪家好/衡阳有实力seo优化
算法概述 在失真图像的基础上产生了一个幻觉参考图像,将失真图像和幻觉参考图像成对输入回归网络中,同时结合生成网络中提取的部分信息,最终产生图像的质量分数。 创新点 首先在回归网络中,该网络将感知差异信息融合入回归网络…...
有哪些招聘网站/郑州seo地址
2019独角兽企业重金招聘Python工程师标准>>> 忙了几天,今天在公司居然没什么活干 ,所以早上就用公司的电脑写写之前在公司编写framebuffer的使用心得体会总结,这也算是一点开发经验,不过我还没写全,精华部分…...
服务专业的网站建站公司/百度授权代理商
ubuntu 16.04下安装mysql并配置远程访问 步骤1 – 安装MySQL 在 Ubuntu 16.04 中,默认情况下,只有最新版本的 MySQL 包含在 APT 软件包存储库中。在撰写本文时,那是 MySQL 5.7 要安装它,只需更新服务器上的包索引并安装默认包 apt…...
杭州做网站公司有哪些/网站关键词排名外包
你的过去我来不及参与,你的未来我奉陪到底 逸兴遄(chuan)飞; 留未尽之情,回无穷之味。 世界上只有一种英雄主义,就是看清生活的真相之后依然热爱生活(罗曼罗兰) 梨花淡白柳深青,柳絮飞时花满城。 惆怅东…...