UVM 源码__report 机制浅析(一)

news2024/11/29 7:42:53

以uvm_error 为例浅析其背后的故事:

uvm_error 是一个宏,在声明的时候只需要传入ID 和 msg,均为字符类型;

分析以上源码,发现起内部主要是调用了一个叫做uvm_report_enabled的函数进行判断,打印函数使用的是uvn_report_error。接下来首先了解一下uvm_report_enabled函数。

uvm_report_enabled(uvm_report_object.svh):

函数内部调用了get_report_erbosity_level函数,其输出值与传入的verbosity进行比较,取真假; 同时还调用了get_report_action函数,与uvm_action`(uvm_no_action)的类型转换值进行相等判断,取真假。

好吧,又多了两个函数:get_report_verbosity_level & get_report_action,继续介绍:

get_report_verbosity_level(uvm_report_object.svh):

get_report_verbosity_level 函数内部调用了uvm_report_handler的get_verbosity_level函数,从名字也可以看出,get_report_verbosity_level函数最后输出的应该是一个verbosity数。这里出现一个新的变量,uvm_report_handler,它会在每个 component 实例化的时候被实例化,也就是说,每个 component 对应一个 m_rh,此变量用于记录这个component 的一些报告信息,如是否单独对此 component 设置了报告冗余度级别 (verbosity_lever)

接着往下挖,get_verbosity_level:

在get_verbosity_level函数中,首先判断severity_id_verbosities关联数组是否存在key为severity的情况,如果存在,取出来,其内容是uvm_id_verbosities_array类型,也是一个关联数组,再去检查在uvm_id_verbosities_array关联数组中是否存在key为ID的情况,存在直接取出,作为get_verbosity_level函数输出,由上边分析,uvm_id_verbosities_array关联数组的内容应该是verbosity.

实际上,也确是如此,以下为uvm_id_verbosities_array关联数组源码,其内容实质上是一个 uvm_pool

uvm_pool 的本质是一个派生自 uvm_object 的联合数组;

目前,可以下这样一个定论:

severity_id_verbosities 是这样的一个联合数组:它的索引是 uvm_severity(整数型),而其内容则是一个 uvm_object,在这个 object 中有着一个联合数组,这个联合数组的索引是string 类型的,而内容则是整数类型的verbosity。

好,到目前为止,get_verbosity_level的第一个判断理清楚了,接着看第二个判断:

id_verbosities 是一个 uvm_id_verbosities_array 类型的变量。

246 行的意思其实就是说检查一下 id_verbosities 内部的联合数组中是否存在与 ID 相匹配的记录。从这里我们可以看到,UVM 对于这种信息报告的控制到了非常精细的地步。例如假如在 main_phase 中我们使用 main 这个 ID 来报告信息,而在 shutdown_phase 中使用 shutdown 这个 ID,那么我们可以分别对这两个 ID 的信息报告冗余级别进行设置,如可以把 main 设置为 UVM_HIGH,而把 shutdown 设置为UVM_MEDIUM

如果 id_verbosities 中也没有记录的话,那么将会直接返回m_max_verbosity_level,这是一个 int 类型的变量,会在系统初始化的时候设置为UVM_MEDIUM

三个return 顺序执行,优先按severity_id_verbosity查找,找不到使用id_verbosity 查找,在找不到直接用系统定义的verbosity。

所以到这里,初步可以这样下个定论,我也不知道对不对啊,后边在验证,在宏声明的时候,根据应用场景的不同,我们可能会在不同的phase中进行打印,对于第一个传入的参数id是必要的,因为源码会依据ID决定他的verbosity存储到哪一个关联数组中;另外不同类型的severity是源码遍历的大方向。大致可以通过一下图形表示:

get_report_verbosity_level 函数到此就结束了,返回uvm_report_enabled函数,继续看第二个判断中的get_report_action 函数。

get_report_action:

我们发现get_report_action 和get_report_verbosity_level 的内容相似,在get_report_action中调用的是m_rh.get_action,m_rh在上边已经介绍过,此处不做过多赘述。

这个函数与 get_report_verbossity_level 几乎就是姐妹函数,它根据 severity_id_actions id_actions 中的记录来给出返回值。这两者都是 uvm_id_actions_array 类型的变量;

其实在uvm中,报告机制除了对ID 进行冗余级别的控制之外,还会进行行为级别的控制。

二者相互补充具有很强的关联度,想了解的同学可以自己加深学习。

uvm_action 具体如下:

所以,uvm_report_enabled的作用实际上就是判断severity 下的verbosity/action设置是否符合打印条件的verbosity/action,符合的ID 返回1,执行uvm_report_error函数。

关于uvm_report_error(uvm_report_object):

这个函数会调用uvm_report_handler的report函数:

在report 中,继续调用uvm_report_server的report函数:

这里在259行会得到一个uvm_report_handler的句柄,这个句柄具体是:比如,在agent中调用了uvm_error,那么这个句柄就是agent, 这里使用uvm_report_object 类型的client,保证了派生至uvm_report_object 的component 都可以使用,但如果是object 类型,其实也是可以这样的,最后会通过uvm_root , 实际上还是调用uvm_report_object。

接下来在report函数中会进行判断,调用 uvm_report_enabled 函数,这个函数前面已经有过介绍,就是判断设定的verbosity 和action 与该severity 下的verbosity 和action 的关系,返回值,并根据返回的值来决定是否打印信息。

能走到273行,说明有满足打印条件的ID,下一步就是如何让打印输出到指定文件,这里在273行首先会拿到一个输出文件的句柄,后边会将打印的文件放到里边。

279 行的判断场景是使用了report回调函数的情况,如果这样,就要调用uvm_report_handler里边的run_hooks:

这里会根据severity 分别调用report_*_hook,report_error_hook 为例:

直接返回1.其实这边只是预留了一个回调函数的接口。使用&=重载操作符将右侧的值复制到左侧的ok变量返回。

继续看report函数:

286 行将会调用 uvm_report_catcher process_all_report_catchers 函数,uvm_report_catcher派生至uvm_callback类,其process_all_report_catchers主要是捕获相关callback函数的信息。

291 行调用compose_massage 函数,把要打印的信息,如时间,ID,文件行数等组织在一个字符串里,之后把这个字符串作为参数,调用processs_report函数:

326 行则决定是否把信息输出到屏幕上,332 341 行用于把信息送到 log 文件里。343 行则决定是否调用 die 函数,这个函数定义在 uvm_report_object 类中:

这里会调用 uvm_root m_do_pre_abort 函数,进行仿真结束前的清理工作,之后调用 report_summarize 函数,把所有的统计信息打印出来,如有多少个UVM_ERROR 出现等,每个不同的 ID 有多少条信息打印。最后会调用$finish 退出仿真。例如如果是一个uvm_fatal 宏的话,这里就会结束仿真。

345 352 行用来查看 UVM_ERROR 数是否已经达到了预先设定的值,如果是的话那也会直接结束仿真。

354 行则根据 action 来调用系统的$stop 函数,以挂起仿真。

简单分析了一下uvm_error的背后故事,我们可以总结,实现打印信息的控制,可以通过:

  • 第一,通过控制 ID 来实现不同的输出控制。
  • 第二,通过设置不同 ID 的信息报告冗余级别。
  • 第三,通过设置不同 ID action
  • 第四,从 uvm_report_catcher 派生一个类,然后把这个 callback 加入到callback池中。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1187674.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

零基础学Python有什么建议?如何入门编程?

零基础,如何入门编程? 首先要明确一点,编程之所以被成为超能力,在于其无所不能。学到深处,你自然可以跳脱限制,随心所欲;入门之时,你却处处碰壁,像蹒跚学步的孩童。其实…

Sublime Text Dev v4.0(HTML代码编辑)

Sublime Text是一款代码编辑器,也是一个先进的文本编辑器,支持HTML和散文。该软件由程序员Jon Skinner于2008年1月份开发,最初被设计为一个具有丰富扩展功能的Vim。 Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图、…

人工智能进入强监管时代

全球AI产业正进入“强监管”时代,对人工智能安全威胁的监管正在成为各国政府普遍关注的重要议题。 以ChatGPT为代表的基于LLM(大语言模型)的生成式人工智能应用正风靡全球,各行各业都在争先恐后将其集成到前端和后端的各种系统中,与此同时生…

Docker - 概述

Docker概述 Docker概述Docker安装Docker命令 镜像命令容器命令操作命令 … Docker镜像容器数据卷DockerFileDocker网络管理IDEA整合DockerDocker ComposeDocker Swarm 简化版的K8s Docker为什么出现? 传统的项目部署,环境配置是十分麻烦,第…

【理解链表指针赋值】链表中cur->next = cur->next->next->next与cur =cur->next->next的区别

最近在做链表的题目的时候,对于所定义的cur链表指针产生了一些疑惑,查阅资料后整理一下我的理解: /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode(int x) : val(x), next(n…

Linux 设置静态IP(Ubuntu 20.04/18.04)

以Ubuntu20.04示例 第一步:查看当前网络信息 ifconfig 本机网卡名为:ens32,IP地址为:192.168.15.133,子网掩码为:255.255.255.0 第二步:查看当前网关信息 route -n 网关地址为:1…

麒麟KYLINOS命令行设置系统静音

原文链接:麒麟KYLINOS命令行设置系统静音 hello,大家好啊,今天给大家带来一篇在麒麟KYLINOS上使用命令行调节系统静音的方法,有时候需要制作模板,便可以采用此方法,话不多说,一起来看看吧。 1、…

aardio 模式匹配函数

废话不多说 直接开干! 知识点 string.find 使用模式匹配查找字符串并返回起始位置(i),结束位置(j); 第三个参数pos指定搜索开始的位置,这个参数可以省略(使用默认值1); pos如果为负数,则从右侧倒数计数(-1表示字符串最后一个字符)。 函数返回…

Mysql 一步到位实现插入或替换数据(REPLACE INTO语句)

单条数据插入/替换 比如有一个数据表叫test_table,包含: 主键:key_id数据:value 运行: REPLACE INTO test_table (key_id,value) VALUES ("id_1","value_1"); REPLACE INTO test_table (key_id,value) VAL…

星乐园项目┃助学无止境·探访暖人心

2023年7月10日至10月31日,广州市从化区齐家社会工作服务中心的“星乐园-乡村儿童公益辅导服务项目”社工带领高校志愿老师、社区志愿者在从化区城郊街新开村、太平镇西湖村分阶段、分批次对两个助学点的学困儿童家庭开展了入户探访活动。旨在通过走访了解他们的生活…

第70讲:MySQL数据库全局锁的核心概念

文章目录 1.全局锁的概念2.使用全局锁的语法结构3.全局锁的基本使用 1.全局锁的概念 全局锁是对整个数据库实例添加一个锁,全局锁是面向整个数据库实例的,而不是单个数据库,添加锁之后这个实例就会处于只读状态,此时所有的数据库…

跨足泛娱乐:TikTok如何重新定义娱乐产业?

在当今数字时代,社交媒体已成为人们生活中不可或缺的一部分。它们不仅是人们互相分享生活、观点和见解的平台,还在娱乐产业中发挥着越来越重要的作用。 TikTok,作为一款短视频分享应用,已经在全球范围内引起轰动,重新…

huggingface-cli: error: invalid choice: ‘download‘解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

AWTK 与 Qt 的异同点比较

相似之处: 跨平台支持: AWTK 和 Qt 都提供了跨平台的支持,可以在多种操作系统上进行开发和部署,包括 Windows、Linux、macOS 等。丰富的组件库: 两者都提供了丰富的图形界面组件库,能够满足各种应用程序的…

基于SSM的生鲜配送系统的设计与实现

末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:采用JSP技术开发 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目&#x…

img为空时不显示

当img标签的src为空时&#xff0c;会显示一个裂开的图片&#xff0c;不好看 <img src"" style"width:200px;height: 200px;" /> 解决办法&#xff1a; 1、图片为空时隐藏图片 <img src"" onerrorthis.style.display"none" …

MySQL最新2023年面试题及答案,汇总版(2)【MySQL最新2023年面试题及答案,汇总版-第三十二刊】

文章目录 MySQL最新2023年面试题及答案&#xff0c;汇总版(2)01、InnoDB的BTree 存储整行数据和主键的值的区别是什么&#xff1f;02、读写分离常见方案&#xff1f;03、为什么索引结构默认使用BTree&#xff0c;而不是Hash&#xff0c;二叉树&#xff0c;红黑树&#xff1f;04…

PyCharm+Miniconda3安装配置教程

PyCharm是Python著名的Python集成开发环境&#xff08;IDE&#xff09; conda有Miniconda和Anaconda&#xff0c;前者应该是类似最小化版本&#xff0c;后者可能是功能更为强大的版本&#xff0c;我们这里安装Miniconda 按官方文档的说法conda相当于pip与virtualenv的结合&am…

基于Kinect 动捕XR直播解决方案 - 技术实现篇

一 安装与部署 1. 安装与部署Kinect-v2设备: 安装硬件: Kinect-v2设备带线一台; Kinect-v2 原装适配器适配器组合件设备一台; Kinect-v2 USB 3.0 WIndows PC 一天&#xff0c;原主板支持USB3.0接口; Windows PC 系统 Win10( Win 10 Version 21H2更新, 基于x64系统), 特别…

聚观早报 |苹果iMac2028年将有3款;小米汽车明年发布

【聚观365】11月9日消息 苹果iMac2028年将有多款 小米汽车明年发布 何小鹏再谈AEB 友道智途助力智慧交通新基建 vivo X100系列四款配色公布 苹果iMac2028年将有多款 据外媒报道&#xff0c;苹果iMac此前虽曾有21.5英寸、24英寸、27英寸等版本&#xff0c;但他们目前在售的…