UVM源码--uvm_component 浅析(一)

news2024/10/6 12:26:29

目录

1. uvm_object

2. uvm_component

3. 为什么在uvm_component 例化是需要指定一个parent?

4.uvm_component 的树形结构是如何组织起来的?

5. 静态函数与非静态函数的区别:

 6. uvm_root 的单实例实现思路:

7. run_test 的背后

1. uvm_object

uvm_object是一个相对简单的类,它提供了一些基本的接口,如用于 field_automation 机制的 printcopypack 等,一些鉴别身份的,如 get_nameget_type_nameget_full_name 等。

2. uvm_component

对于 uvm_component 来说,有两大特点,一是它是一种树形组织结构中的一个结点,在其 new 的时候都要指定一个 parent,二是它有 phase 的概念。

3. 为什么在uvm_component 例化时需要指定一个parent?

假如不指定parent,compoent A 中有一个成员变量component B,在B例化的时候使用B=new(“B”),不添加parent,这样会导致在整体的环境框架中A 不知道B是他的孩子,因为没有指定,如果有些用户需要遍历整个UVM 树,那他是找不到的。所以我们一般会规范的加上parent,一旦加上parent,在A的m_children 数组中,会出现B 的指针。只有这样才能让 A 知道 B 是自己的孩子,同时也才能让B知道 A 是自己的父母。

4.uvm_component 的树形结构是如何组织起来的?

实现这样的功能当然离不开三个重要的变量他们分别是:

  1. m_parent, component类型,用于表示父类节点,在new 函数的源码里边有 m_parent= parent ; 主要目的是实现树形结构的父类定位,这样在子类进行例化的时候就能顺其自然的找到自己的父类;
  2. m_children, string类型关联数组,实际上在m_parent= parent后,会调用m_parent的m_add_child函数,将自己的孩子加入到自己的函数中,其中在m_add_child函数中就有这么一条语句m_children[child.get_name()] = child; 这里的child 就是变量实例化的时候赋值的string, 父类会将其加入到关联数组中。也就有了一个叫B的孩子;
  3. m_child_by_handle,component 类型的关联数组,在m_children[child.get_name()] = child后,会紧跟这这样一条命令m_children_by_handle[child] = child;表示其索引和内容都是child的指针。
5. 静态函数与非静态函数的区别:
  1. 静态函数必须要先例化,才可以调用其内部的方法,而非静态函数则不需要;
  2. 静态函数的调用使用点.进行,而非静态函数使用双冒号::
 6. uvm_root 的单实例实现思路:

我们知道uvm_root 作为uvm环境的根,具有唯一性,另外,uvm_root 作为一个根,它是开始,在new的时候,第一个new的调用也是我们在代码实现的过程中必须要考虑的问题,因为一般而言,只要先实例化才可以使用其内部的函数,就比如new().所以当前两个问题需要解决:

先解决第一个,如何在不实例化的前提下,调用其内部的new()函数,使用静态函数可以做到,这也是上边介绍静态函数和非静态函数的初衷,在uvm_component.new()中,对uvm_top::get()的调用目的就在于此,get()的内部会继续调用uvm_root.new(),因为root 在调用new()之前没有实例化,所以uvm_root 的方法必须声明为static,其类型的变量也一样;

第二个问题,uvm_root的唯一性如何实现,其实很简单,在调用函数是首先判断uvm_root 指针是否为null,如果不为null,就说明已经有一个root了.如果没有root,就应该对他调用new函数。当然uvm_root 的对象也应该是static类型,不然调用会出错哦。

在源码中,将这种执行方式封装到get函数里边,get是静态函数,所以在uvm_component.new函数的源码里边会看到uvm_root  top;  top = uvm_root::get();

在271行,提到了uvm_root::new(),其实在uvm_root::new()中不需要任何参数,它调用 super.new,传入的 name 参数为__top__, 而 parent 参数为 null

又回到uvm_component.new(),看一下下边关于uvm_root相关的代码:

在uvm_component 中,判断parent=null && name == __top__的时候,就知道这是uvm的根,直接返回。

但是,如果在分支的实例化中,将uvm_component 传入null有会发生什么?

在new函数中还有这样的一条判断:

如果传入的parent == null,默认该节点就是top。

7. run_test 的背后

我们知道在验证环境搭建好后,启动仿真的方式有两种:一种是直接使用run_test(“ ”), 直接将case名称写进去;另一种方法是在运行的时候输入控制命令+UVM_TESTNAME=“ ”;

这是我们能看到的,也是我们经常用到的,实际上背后是这样的:

在调用tun_test函数后,run_test 会调用 uvm_root 的 run_test,uvm_root::run_test的主要代码如下:

329行调用了uvm_cmdline_processsor的get_arg_values函数,对UVM_TESTNAME后边的字符进行统计,返回值是统计的个数,具体的字符是被放在test_names的队列中。下边有两个判断,第一个判断如果返回的test_name_count>0, 说明有传case名称进来,直接默认就为一个,拿队列index=0 的值(此处不是get,值还在),第二个判断如果发现test_name_count > 1,会报出warning,并打印。

拿到case名称之后,会进行创建实例,uvm_root会首先判断该实例是否已经被创建,如下363行,如果创建说明有问题。一般不会创建。

整个 run_test 关键的部分在于 368 和 369 行的 cast 函数中调用factory. create_ component_ by_name,这个函数将会根据输入的 case 的名字来创建这个 case 的一个实例。371 行用于判断实例创建是否成功,如果没有成功,说明这个 case 根本没有在 factory 中注册过,会给出出错提示。一般的,当我们在指定 case 的时候如果输错了名字就会给出这个错误提示。

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

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

相关文章

动态头:用注意力统一目标检测头

目标检测是回答计算机视觉应用中“哪些目标位于哪里”的问题。在深度学习时代,几乎所有现代目标检测器共享相同的范式——特征提取的主干和定位和分类任务的头部。如何提高目标检测头的性能已经成为现有目标检测工作中的一个关键问题。检测头应该是尺度感知&#xf…

modelscope适配昇腾NPU

注意 我只做了raner,raner-50cls,corom这三个模型的适配,不能保证其他模型同样好使。 我的环境信息 NPU: Atlas 300I Pro Modelsope: 1.9.4(最好要使用这个版本呀,因为后面要改一下源码) python: 3.8 torch: 2.0.1 内核以…

深度学习之基于YoloV5交通信号标志识别系统

欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 基于YoloV5交通信号标志识别系统介绍 基于YoloV5的交通信号标志识别系统是一种深度学习应用,旨在通过使…

《国产服务器操作系统发展报告(2023)》重磅发布

11月1日,《国产服务器操作系统发展报告(2023)》(以下简称“报告”)在 2023 云栖大会上正式发布,开放原子开源基金会理事长孙文龙、中国信息通信研究院副总工程师石友康、阿里云基础软件部副总裁马涛、浪潮信…

明御安全网关任意文件上传漏洞复现

简介 安恒信息明御安全网关(NGFW) 秉持安全可视、简单有效的理念,以资产为视角的全流程防御的下一代安全防护体系,并融合传统防火墙、入侵防御系统、防病毒网关、上网行为管控、VPN网关、威胁情报等安全模块于一体的智慧化安全网关。 较低版本的系统存…

享搭低代码平台:快速构建符合需求的会议室管理系统应用

本文介绍了享搭低代码平台如何赋予用户快速构建会议室管理系统应用的能力。通过在应用商店安装费用会议室管理模板,并通过拖拽方式对模板进行自定义扩充,用户可以快速搭建符合自身需求的会议室管理系统,从而提高会议室预订和管理的效率。 介绍…

华为eNSP实验-三层交换机的不同网段通信(通过OSPF路由方式)

1.拓扑图 2.过程如下 2.1 首先PC1和PC2配置好IP地址 2.2 在SW1上配置虚拟网关及VLAN <Huawei>system-view [Huawei]sysname SW1 [SW1]undo info-center enable [SW1] [SW1]vlan batch 10 20 [SW1]interface GigabitEthernet 0/0/1 [SW1-GigabitEthernet0/0/1]port li…

maven项目子类项目版本与父类版本不一致

项目的依赖关系 A项目的父pom是spring boot&#xff0c;A依赖pom B&#xff0c;B依赖hibernate B引用的hibernate版本为8.0.1 A引用的hibernate版本为6.2.0 maven helper插件显示无依赖冲突 这就很奇怪&#xff0c;为何依赖版本有问题呢&#xff1f;是在看不出来问题&#xff…

在线实用计算工具大全

在线实用计算工具大全 在线计算工具的实用&#xff0c;可以有效提高学习或工作效率&#xff0c;本博文介绍一个在线的实用计算工具大全&#xff08;https://tool.520101.com&#xff09;&#xff0c;作为一种辅助学习工具。 1. 在线排列组合计算 https://tool.520101.com/cal…

JS定时器实现页面N秒后跳转 实现每隔 1s 自动刷新页面并格式化的显示当前时间

1. 通过 setInterval 函数&#xff0c;来周期性的更新倒计时间&#xff0c;同时更新到页面。即通过设置页面可以显示 3 2 1&#xff0c;然后跳转。1000指的是每隔1秒执行一次。 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF…

LightDB23.4 GBK和UTF8转码失败的字符替换成空格

背景介绍 用户使用迁移工具从Oracle数据库迁移数据到LightDB的过程中发现&#xff0c;某些GBK编码转成UTF8编码后&#xff0c;在插入到LightDB中会报错。以GBK编码AAA1为例&#xff0c;LightDB的GBK和UTF8映射表中不支持AAA1这个GBK编码的转换。不支持的GBK编码都是处于GBK编码…

ifream标签中的子页面,操作父页面的元素

问题描述&#xff1a;子页面内容发生变化时&#xff0c;导航栏不会跟切换 解决办法&#xff1a; window.parent.document.getElementById demo html1 <html> <head><meta charset"UTF-8"><!-- import CSS --><link rel"stylesh…

使用VSCODE链接Anaconda

打代码还是在VSCODE里得劲 所以得想个办法在VSCODE里运行py文件 一开始在插件商店寻找插件 但是没有发现什么有效果的 幸运的是VSCODE支持自己选择Python的编译器 打开VSCODE 按住CtrlShiftP 输入Select Interpreter 如果电脑已经安装上了Python的环境 VSCODE会默认选择普通…

R语言实操记录——导出高清图片(矢量图)

R语言 R语言实操记录——导出高清图片&#xff08;矢量图&#xff09; 文章目录 R语言一、起因&#xff08;废话&#xff0c;可跳过&#xff09;二、如何在R中导出高清图片&#xff08;矢量图&#xff09;2.1、保存为EPS图片格式后转AI编辑2.2、保存为PDF格式&#xff08;推荐…

在直播系统中使用SRT协议传输视频

目录 1、简述 2、NDI、RTSP协议的优缺点 3、SRT协议简介 4、SRT协议链接地址URL格式 &#xff08;1&#xff09;listener&#xff1a; &#xff08;2&#xff09;caller&#xff1a; 5、手机发送SRT实时音视频 6、OBS中的设置 7、在vMix中的设置 8、写在最后 1、简述 …

财报解读:抢滩“睡眠经济”,麒盛科技如何制胜市场?

现代市场经济理论的鼻祖亚当斯密曾说&#xff0c;有需求就有市场&#xff0c;有市场才有发展。 调查研究显示&#xff0c;我国超3亿人存在睡眠障碍&#xff0c;其中超3/4的人晚11点以后入睡&#xff0c;近1/3的人熬到凌晨1点以后才能入睡。针对“睡个好觉”需求的“睡眠经济”…

GB28181学习(十五)——流传输方式

前言 基于GB/T28181-2022版本&#xff0c;实时流的传输方式包括3种&#xff1a; UDPTCP被动TCP主动 UDP 流程 注意&#xff1a; m字段指定传输方式为RTP/AVP&#xff1b; 抓包 SIP服务器发送INVITE请求&#xff1b; INVITE sip:xxx192.168.0.111:5060 SIP/2.0 Via: SIP…

Spring:常见的面试题和答案

1、什么是 Spring 框架&#xff1f;Spring 框架有哪些主要模块&#xff1f; Spring 框架是一个为 Java 应用程序的开发提供了综合、广泛的基础性支持的 Java 平台。 Spring 帮助开发者解决了开发中基础性的问题&#xff0c;使得开发人员可以专注于应用程序的开发。 Spring 框架…

掌动智能:UI自动化测试工具的五大功能

在现代软件开发中&#xff0c;保证应用程序的质量和性能至关重要。UI自动化测试工具是一种关键的资源&#xff0c;它们能够有效地检查应用程序的用户界面&#xff0c;确保它们在各种情况下都能正常运行。本文将探讨UI自动化测试工具的功能有哪些! UI自动化测试工具的五大功能&a…

科技云报道:不卷自研大模型,金山办公如何创新生成式AI?

科技云报道原创。 过去大半年里&#xff0c;很多人对大模型的前景寄予厚望。主流观点认为&#xff0c;每个行业、每款产品都可以通过大模型“重做一遍”。 “重做一遍”听起来想象空间很大&#xff0c;但实际上多数大模型产品需要漫长的训练周期和海量资源投入&#xff0c;落…