[UVM源代码研究] 聊聊uvm_component与uvm_root(uvm-1.2版)

UVM:uvm_component与uvm_object 阅读详情

[UVM源代码研究] 聊聊uvm_component与uvm_root(uvm-1.2版)

​
源代码截图都来自uvm-1.2的版本

uvm_component

uvm_component 的派生关系

uvm_component 派生自 uvm_object,而且并不是直接派生,在两者之间还有一个uvm_report_object。

uvm_component类派生关系图

uvm_object 是一个相对简单的类,它主要提供了两大类的方法接口:

  • 用于field_automation 机制的方法,如print, copy, pack 等;
  • 用于鉴别身份的方法,如 get_name, get_type_name, get_full_name 等。
    其中关于 field_automation 机制的一些代码相对比较复杂。这个留在后面讲述 field_automation 机制时再仔细研究。

uvm_report_object 用于提供了UVM 中信息报告机制的一系列方法接口,如uvm_report_info, uvm_report_error, set_report_verbosity_level等,即我们在基础课程中学习的message机制相关方法都是在这里定义的(具体实现有些是在另外的类中完成的,如uvm_report_handler,这里只是做了一层封装而已),后面会专门介绍这种信息报告机制。

无论是 uvm_object 还是uvm_report_object,更多的只是提供一些方法接口,并不涉及什么高深的UVM处理机制,相对来说,uvm_component 里面的内容才更具有实质性意义的。

对于uvm_component 来说,有两大特点:

  • 它的每个实例都是UVM树形结构的节点,每个节点创建时都需要指定parent
  • 它有 phase 的概念

关于phase的部分将会放在phase 机制中讲述,本章中重点讲述 uvm_component 的树形组织结构。

uvm_component 树形结构的实现

src/base/uvm_component.svh中的源代码

在这里插入图片描述

上图uvm_component中1650-1652行定义的父节点和子节点构成了UVM的树形结构,从中我们

看到父节点和子节点有两点不同:

  • 节点访问权限,m_parent的访问权限是public(缺省权限),而m_children/m_children_by_handle则是protected,即任何uvm_component的父节点都是可以从外部获取的,但是他所包含的子节点只有它和它的派生类中才可以访问。
  • 节点数量,任何uvm_component都有且只有一个父节点m_parent,但是可以有多个子节点,子节点可以用两个联合数组表示,分别以string和uvm_component类型(类类型寻址实例)进行索引。

1653行声明的m_add_child,代码实现在1925-1947行,作用就是将子节点添加到父节点中定义的两个联合数组中,并且我们可以到该函数是在该uvm_component的构造函数new()中1900行调用的,这就是为什么我们在创建uvm_component的派生类时必须要指定parent的原因,因为它会将该类的实例添加到该parent中的子节点联合数组中,并且还会检查是否出现同名子节点重复添加的情况。

通过在每一个节点指定其父节点,就实现了UVM树形结构从数根树干、树叶的树形生长,并且同一层次的节点不允许同名,每个节点可以有多个子节点但只有一个父节点。

uvm_root

uvm_root的单例模式

src/base/uvm_root.svh中的源代码

在这里插入图片描述

src/base/uvm_coreservoce.svh中的源代码

在这里插入图片描述

单例模式(目的是让某个类有且只有一个实例)的实现步骤:

  1. 该类中声明一个static本类型的对象m_inst (242行)

  2. 需要将该类的构造函数new声明为protected类型(226行),即无法在类外部访问,只有通过该类中定义的get 函数中才能调用其构造函数new(334-337行),get函数必须是static类型的(90行),方便以uvm_root类调用,而不是通过实例调用。

  3. get 函数中记录被调用的次数,如果这是第一次调用,那么就执行new函数,并将该实例赋值给步骤1中定义的m_inst并返回该实例;如果不是第一次调用,则直接将第一次创建的实例m_inst返回。(280-281行)

可以看到uvm_root具备了单例模式的所有因素,所以调用uvm_root在整个UVM环境运行时有且只有一个实例,并且在uvm_root的325行还定义了一个全局可见的uvm_root的实例常量uvm_top,这就是为什么我们可以直接使用uvm_top来调用uvm_root中定义的诸如print_topology()之类的函数的原因。

uvm_root在树形结构中的位置

src/base/uvm_root.svh中的源代码

在这里插入图片描述

src/base/uvm_component.svh中的源代码

在这里插入图片描述

从上文uvm_component的学习中我们知道uvm_root的父类是uvm_component,因而其创建的时候必须指定parent,但是我们看到uvm_root的构造函数new并未传递任何参数(不仅没有parent,甚至连name都没用),只是调用了父类中的new函数,传入参数name=“top”,parent=null,我们在回头看uvm_component中的new函数时发现1818-1821行对专门针对uvm_root这种构造函数new的特殊处理,这里并没有像其他uvm_component创建时调用m_add_child()将uvm_root添加到其父节点的子节点联合数组中,而是直接返回,因而uvm_root不存在父节点,显而易见,对于一个不存在父节点的节点,在树形结构中只能是处于最顶层的树根。

1823-1824行指定将uvm_root的实例赋值给了top,1853-1854、1896以及1900-1901行的作用是将任何指定parent为NULL的uvm_component实例的parent都指定为uvm_root的唯一实例,这样就保证了UVM有且只有一个树形结构,且树根为uvm_root的实例。1853行其实还暗含了name != “top”,否则函数在1820行就返回了,所以说虽然parent都是NULL,但是uvm_root是树根,其他的uvm_component只能按照1854行所做的作为uvm_root单例的子节点,1900-1901行就实现了添加为子节点的操作。

run_test()

src/base/uvm_globals.svh中的源代码

在这里插入图片描述

UVM基础课程中我们知道tb中调用run_test()可以启动UVM的验证环境,是如何做到的呢?

首先,我们在tb里调用的run_test()其实是UVM源代码封装在uvm_globals.svh中的一个全局函数,其内部实现如上图所示,本质上还是通过获取uvm_root的单例进而调用了uvm_root中的run_test()任务。

src/base/uvm_root.svh中的源代码

在这里插入图片描述

我们挑run_test()中比较重要的几个知识点讲下:

  1. 410行表明,run_test()是可以传递参数的(允许缺省为空字符串),437和462-465行(分别对应是否define宏UVM_NO_DPI的两个分支)表明如果运行时命令行通过UVM_TESTNAME传进的参数会覆盖run_test()调用时传进来的参数。

src/base/uvm_root.svh中的源代码

在这里插入图片描述

  1. 470行判断是否有传入参数给test_name,471-472获取uvm_factory的单例方便后续调用其中的函数。474-478判断uvm_root是否已经添加了名为”uvm_test_top”的子节点,如果有,则报错退出仿真。419、479-480行是利用前面产生的uvm_factory的单例调用其中的create_component_by_name()函数产生一个指向uvm_component的uvm_object_wrapper类型的指针并downcast给uvm_test_top,factory机制我们后面会有专门的章节来讲,这里可以简单理解为根据我们传进来的testcase的名字产生了一个实例名为uvm_test_top的uvm_component类型的句柄,该实例在UVM树形结构中的路径为uvm_test_top,并且父节点为NULL,由前面的分析我们可以知道,虽然父节点声明为NULL,但实际父节点会是一个不体现在树形结构路径上的uvm_root单例,所以我们传进来的这个testcase就是我们打印topology时的树根uvm_test_top,而其数据类型则是传进来的testcase所对应的数据类型(uvm_test的派生类)。482-487行则是判断上面生成uvm_test_top是否为NULL,为NULL表明传递参数有误,仿真终止。

src/base/uvm_root.svh中的源代码

在这里插入图片描述

  1. 490-498是判断uvm_root的m_children是否为空,为空则强制报错退出仿真。根据我们前面对uvm_component以及uvm_root的分析,上面创建uvm_test_top这个实例的同时,其实隐含着一个信息,就是会将该uvm_test_top实例添加为uvm_root单例的子节点,这样uvm_root里的m_children必然就不为空了,所以这里才有这么一个判断。

src/base/uvm_root.svh中的源代码

在这里插入图片描述

  1. 500-507行是打印要允许的case的信息。

src/base/uvm_root.svh中的源代码

在这里插入图片描述

  1. 510-521行可以理解为将phase机制运行起来,并等待所有phase执行结束然后kill上面开启的进程,我们后面会有专门的章节介绍phase机制,这里就不细说了。

  2. 523-527行执行的就是打印最终的report信息,包括UVM_INFO、UVM_ERROR等的统计信息,随后结束仿真。

通过以上对run_test()任务的分析,我们对于tb里面调用run_test()就能将UVM环境中具体的testcase跑起来,并最终在执行完所有的phase后结束仿真就有了一个比较清晰的认识,并且对于UVM树形结构的树根也有了比较全面的了解,即uvm_root的单例是树形结构的树根,但是该单例不会显示在topology上,topology上的树形结构的树根是uvm_test_top,它是所有testcase的实例名。

UVM实战 卷I学习笔记5——UVM基础(1)uvm_component与uvm_object uvm_component与uvm_object uvm_component派生自uvm_object uvm_object是UVM中最基本的类,几乎所有类都继承自uvm_object,包括uvm_component。说明它拥有uvm_object的特性,同时又有自己的一些特质。但是uvm_component的一些特性,uvm_object则不一定具有。这是面向对象编程中常用到的一条规律。 uvm_component有两大特性是uvm_object所没有的:一是通过在new时指定parent参数来形成一种 阅读详情

相关推荐

UVM(六):验证环境的组成:UVM组件家族——uvm_component

1.概述 UVM的组建类(uvm_component)是验证环境的骨架,用于验证环境的结构的创建。主要包括uvm_driver、uvm_monitor、uvm_sequencer、uvm_agent、uvm_scoreboard、uvm_env、uvm_test等。 在对组件类进行工厂机制的注册时,需使用宏`uvm_component_utils()。而对于组件的构建函数,其固定形式为: function new(string name, uvm_component ...

weixin_43701504的博客 4879

UVM学习整理——UVM结构(component派生类)

目录 二、UVM结构 2.1UVM组件 2.1.1uvm_driver 2.1.2uvm_monitor 2.1.3uvm_sequencer 2.1.4uvm_agent 2.1.5uvm_scoreboard 2.1.6reference model 2.1.7uvm_env 2.1.8uvm_test 2.1.9uvm_component相关宏 2.2UVM验证平台的树形结构 二、UVM结构 2.1UVM组件 UVM的组件(uvm_component类)继承于UVM的

lizhao_yang_的博客 7915

UVM系列—uvm_component&uvm_object

很久没写文了,决定把之前学习的UVM白皮书做一个总结,系列会持续更新本文主要介绍uvm_component 和 uvm_object的基本概念,以及区别和联系。

weixin_62355917的博客 1546

UVM源码--uvm_component 浅析(一)

浅析uvm_component 源码背后的故事

创芯人--fly的博客 1014

UVM中工厂机制详解(上):UVM源码下载、目录结构、学习网站

本篇主要记录在学习UVM工厂机制中的问题和自己的理解,上篇主要介绍工厂注册与创建源码中的基础语法知识,帮助后续更快理解代码逻辑。

weixin_42711149的博客 982

IC验证09--uvm_component和uvm_object是两个核心基类(附源码)

在UVM验证环境中,uvm_component和uvm_object是两个核心基类,分别用于构建验证环境的不同部分。uvm_object是所有UVM类的基础,提供通用功能如复制、克隆、比较和打印,适用于临时数据对象(如transaction、sequence_item)。uvm_component则派生自uvm_object,用于构建树形结构的验证组件(如driver、monitor、env等),具有明确的物理含义和功能,生命周期由UVM的phase机制自动管理。uvm_component必须通过creat

Open 1460

3.1 学习UVM中的uvm_component类分为几步?

联想到UVM的组件化思想,uvm_component作为基类,肯定承载着构建组件树和管理组件生命周期的重要职责。意识到uvm_component的树形结构和phase自动执行特性是其独特之处。一些常用的方法,如get_full_name、get_parent等,这些方法在组件操作和调试中经常用到。需要通过继承uvm_component来创建自定义组件,并在测试平台中实例化这些组件。

啄缘之间的博客 966

uvm1.2源码

最新的uvm1.2源代码,深入学习uvm验证最佳的资料。

手把手教你跑一个UVM_demo(含源码)(一键复现)

手把手教你跑一个UVM demo,内含自动化脚本,可在window下一键运行。

qq_42816434的博客 2228

【JS】自定义上传组件,文件上传与回显,自定义进度条显示(基于element-plus与axios)

公司是做B 端产品的,有sass平台也有源码交付的项目,最近开发了很多小系统,这里记录一下开发遇到的问题。 需要定制一个上传组件,要求可以自定义文件存储路径,自定义可上传的文件类型,限制文件大小等,并且提供基础的文件回显功能,例如上传一张图片到服务器指定目录的`/file`文件夹下面,并且实现可以查看预览的功能。

余浩的博客 1162

【UE5】多用户协同编辑实战:从配置到实时协作

本文详细介绍了在虚幻引擎5中配置和使用多用户协同编辑功能的完整流程。从启用Multi-User Editing插件、配置UDP Messaging网络通信,到启动服务器、创建会话并实现实时协作,提供了从环境准备到实战协作的清晰指南。文章还分享了资产同步、场景分批、对象锁定等实用技巧,并强调了网络配置与版本一致性等关键避坑点,旨在帮助中小型团队提升关卡设计和原型开发的协作效率。

weixin_29001683的博客 267

UVM1.2究竟在UVM1.1上做了哪些升级

本文总结了UVM1.2在UVM1.1上做的主要改动,这些改动对我们会有什么影响,以及如何适配这些改动。

W1Z1Q的专栏 4634

图学习——04.HAN(异构图注意力网络)

什么是异构图,什么是元路径,什么是HAN,怎么计算attention,节点级别的attention和语义级别的attention

m0_51474171的博客 2999

UVM常用类及树形结构

本文介绍了UVM常用类及其一般用法,并给出了代码案例;讲述了UVM树形结构和一些常用方法

weixin_44377626的博客 1623

学习笔记——神经科学的数学基础

m%3D2X_%7Bi%7DiNy%3DAxW%3DABx_%7Bj%7Dy_%7Bi%7Dy%3DWxt=N7T8卷积神经网络(CNN)详细介绍及其原理详解_IronmanJay的博客-优快云博客https://blog.csdn.net/IronmanJay/article/details/128689946?

zxyopenstar的博客 1374

SAP成本控制范围配置全流程:从货币参数到标准层次(附2024最新SPRO路径)

本文详细拆解了SAP成本控制范围(Controlling Area)的完整配置流程,涵盖从货币与估价参数文件定义、参数文件分配到控制范围,再到成本中心标准层次创建等核心步骤。文章提供了2024年最新的SPRO导航路径和实战配置要点,帮助顾问构建稳健、可扩展的管理会计基础架构,并附有常见问题排查指南。

java5的博客 940

UVMphase机制

UVM有一套属于自己的运行机制,名为phase机制,但是对于phase机制由谁产生,phase机制如何运行,经常让大家迷惑,接下来我将介绍一下phase机制UVM世界从一个run_test创建。

LSC0311的博客 375

YOLOv9分割改进 ,YOLOv9分割改进主干网络为华为EfficientNet,助力涨点

EfficientNet论文中研究了卷积网络的缩放和,并证明对深度,宽度和分辨率复合缩放的重要性,因此精度和效率更好。为了阐述相关的原理,我们提出了简单有效的复合缩放方法,使得模型缩放具有一定设计准则,同时兼顾了模型的效率。我下文将 YOLOv9 分割模型改进主干网络为 EfficientNet 融合网络结构。论文地址代码地址下文都是手把手教程,跟着操作即可添加成功把环境配置好,数据集处理好,训练基本能成功,创作不易,请帮忙点一个爱心,关注我,带你不挂科!

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 938

5.uvm_component

摘要:UVM验证环境的核心构建块uvm_component为验证组件提供四大关键功能:1) 层级结构管理,通过父子关系形成树形拓扑;2) 相位流程控制,标准化build/connect/run/report等阶段;3) 工厂机制集成,支持组件热替换;4) 配置与报告功能。组件必须使用uvm_component_utils注册,在build_phase中通过工厂创建子组件,并遵循严格的相位调用顺序。理解get_parent()、get_children()和lookup()等层级操作方法对构建可维护的验证环境

啄缘之间的博客 1403

网络工程师教程第6版(2024年最新版)

本书 根据《网络工程师考试大纲》(2024年审定通过)编写,对网络工程师岗位所要求的主要知 识及应用技术进行了阐述。本书主要内容包括数据通信、局域网、无线通信网、网络互连、网络安全、网络操作系统与应用服务器、组网技术、网络管理、网络规划和设计。本书是参加网络工程师考试的必备教材,也可作为网络工程从业人员学习网络技术的教材或日常工作的参考用书。王涛和严体华编写了第2章、第3章和第4章;网络工程师教程(第6版)由清华大学出版社出版,由工业和信息化部教育与考试中心组编,张永刚、王涛、高振江任主编,具体介绍如下。

鹿鸣天涯 6906

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

uvm1.1和1.2区别汇总

uvm_event不一样,可以传递不同类型参数。uvm_1.1只能传递 uvm_object 类型。

m0_56876193的博客 1784

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

【UVM】UVM源码解析-uvm_component源代码分析

uvm_component源代码解析

qq_41654814的博客 1299

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

UVM学习整理——UVM通信(component类)

三、UVM通信(component类) UVM验证平台的特点是验证环境整体基于面向对象的开发方式,组件之间的通信也是基于TLM通信方式,但在driver与硬件的接口之间,需要将TLM抽象事务降解到基于时钟的信号驱动级别。 3.1UVM TLM基本概念 TLM是一个基于事务(transaction)的通信方式,TLM通信两个对象根据通信动作分为initiator object(通信请求动作发起方)和target object(通信的响应方);根据事务传输方向分为produ...

lizhao_yang_的博客 2380

【学习记录丨UVM】2.1uvm_component 与uvm_object

看看了解一下就欧了,都是文字介绍。可以注意一下clone函数就好了。

qazWSX 1727

modelsim的TCL脚本的define incdir命令解析

(1) +incdir+: 如:vlog +incdir+YOUR_SOURCE_PATH  foo.v   +incdir+YOUR_SOURCE_PATH 选项是指在verilog文件中出现`include "xxx.v" 时,包含文件的搜索路径。 缺省是搜索当前路径,然后是YOUR_SOURCE_PATH 指定的路径。 (1) +define+:  +define+

limanjihe的专栏 1万+
上一篇: [UVM源代码研究] 浅谈UVM factory机制的实现原理
下一篇: [UVM源代码研究] UVM report机制分析(uvm-1.2版)
数字验证Kane陈
博客等级 码龄12年 662粉丝 48原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值