[UVM源代码研究] 浅谈UVM factory机制的实现原理

[UVM源代码研究] uvm中的factory机制(uvm-1.2版) uvm中的factory机制(uvm-1.2版) 阅读详情

[UVM源代码研究] 浅谈UVM factory机制的实现原理

我们对UVM的factory机制有基本了解的同学都知道,要想实现factory,必须满足的条件该类必须使用uvm_object/component_utils系列进行注册,我们先来看看这个用来注册的宏都做了什么(以下都以uvm_object_utils_begin/end为例),相关的宏和方法递归展开截图如下
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

根据上面宏展开后的结果,我们可以将我们自定义的uvm_object进行展开,例如我们定义了如下的class
在这里插入图片描述

我们将8-10行的宏按照我们之前的分析进行展开,得到实际的等效代码如下图所示
在这里插入图片描述

这里我们并没有将宏uvm_field_*进行展开,关于uvm_field_*系列宏的展开分析我们在[UVM源代码研究] 谈谈uvm中的浅拷贝(shallow copy)与深拷贝(deep copy) 有过深入的解读,这里就不展开了。

于是我们可以粗略的认为uvm_object_utils_begin/end宏刨去中间uvm_field_*就相当于增加了如下内容:

  1. 声明了一个type_id类型

  2. 定义了静态函数get_type,返回值为type_id类型

  3. 定义了函数get_object_type,返回值为实际指向type_id类型的uvm_object_wrapper类型

  4. 定义了create函数,返回值为实际指向apb_transfer类型的uvm_object类型

  5. 定义了静态字符串常量type_name

  6. 定义了函数get_type_name返回type_name

于是当我们执行如下代码时
在这里插入图片描述

我们实际是调用的声明在apb_transfer中的type_id类中的静态create()方法,所以说只有通过`uvm_object_*注册过的类,才能使用type_id::create创建就是这么来的。
在这里插入图片描述

我们再看看参数化的类uvm_object_registery中的create方法的定义
在这里插入图片描述

这里245行通过uvm_factory中的静态函数get()获取了uvm_factory的唯一实例,这就是我们在前面的文章中反复提及的单例模式的使用,例如uvm_root的唯一实例是uvm_top,uvm_factory的唯一实例是factory,这里在uvm源代码中都已经做成了全局变量,如下图所示
在这里插入图片描述
在这里插入图片描述

248行执行uvm_factory中定义的create_object_by_type()如下图所示
在这里插入图片描述

这里的find_override_by_type()就是查看某个具体hierarchy下requested_type类型是否有override过,这个过程可以简单理解为遍历一个类uvm_factory_override队列m_type_overrides[$],而我们在调用factory.set_type_override_by_type()的时候实际操作的也是这个队列。只有当某个类在调用create之前被override过,该类队列才会有值,并且队列override遵循的一定的覆盖规则,所以遍历的时候也会有相应的替换规则,这样通过调用find_override_by_type()就获取了我们实际创建需要用到的type类型。

然后上面的1192行调用create_object()就会调用实际requested_type类型中的new函数进行最终的对象创建行为。

经过如上这么一个过程,我们便实现了最基本的factory机制里的override功能,上文中我们偷懒省去m_type_overrides这个队列相关内容的讨论,感兴趣的同学可以自行研究哈。

至于uvm_component的factory机制实现与上面类似,这里就不展开描述了。

[UVM源代码研究] 聊聊uvm_tlm_analysis_fifo这个特殊的uvm_component(uvm-1.2版) 聊聊uvm_tlm_analysis_fifo这个特殊的uvm_component 阅读详情

相关推荐

UVM 工厂 Factory 与 Override:复用与灵活性的基石

假设我们有一个基础的my_driver,现在要创建一个带错误注入的派生类。// 基础 driver...endclass// 错误注入 driver...// 在发送正常事务后,偶尔插入错误事务endtaskendclass。

Getting Stronger的博客 690

UVM基础-Factory机制

回顾整个过程,总结起来就是:factory机制进行实例化的过程,会先对component进行注册,即调用f.registory,然后查询是否有重载记录,即调用find_override_by_type,如果有重载记录,则返回重载后的类,最后调用registory中的create_component函数,这个函数最终会调用重载后的类的构造函数new,如果没有重载记录,则调用当前实例化组件的构造函数(new)。这个函数有三个参数,第一个为被重载的类,第二个为重载的类,第三个为是否可以被后面的重载覆盖。

qq_36955425的博客 3758

#C8# UVM中的factory机制 #S8.1.3# UVM实战代码再剖析

前面文章,实际还没有完全剖析完整代码。今天我们自己捋一遍。完整代码如下:而代码第74行,因为实参 bird_inst, 与 参数形参 bird b_ptr 属于同一类型,不需要做转换。而第75行代码,因为实参为parrot_inst , 与 参数形参 bird b_ptr 不属于同一类型,需要做转换。那么具体是向上转换,还是向下转换呢?(自动完成,安全)向上转换后,只能访问父类的属性和方法(color),无法访问子类独有的内容(size(需显式$cast$cast会检查类型是否兼容。

那么菜的博客 118

UVM-factory机制

UVM_factory整理。

Nie_You的博客 3103

【信息科学与工程学】【产品体系】第三十三篇 DPU/smartinic芯片中的学科知识03

需求实现DMA 与流边界检测优化​分级超时状态机(短/中/长)+ 积压计数 + 批量触发DMA 控制器优化​描述符预取(深度 4)+ 中断合并(阈值 8)Fence 语义正确性验证​RTL 断言 + C 语言序列号检测 + 性能对比 + 硬件计数器所有代码均为可综合 Verilog,已在仿真器中通过基本功能测试。在 FPGA 原型上运行上述 RTL,配合 ChipScope 观察 fence 时序在 BlueField-3 上运行 DOCA DPA 测试程序,对比加/不加 fence 的结果。

weixin_49199313的博客 267

J-SCOPE实战:除了看波形,如何用它和JLink-RTT模式高效调试你的STM32变量?

本文详细介绍了如何利用J-SCOPE和JLink-RTT模式高效调试STM32变量,实现实时数据可视化。通过对比HSS和RTT模式的优劣,提供固件端配置、J-SCOPE设置及实战应用案例,帮助开发者快速掌握这一高效调试技术,特别适用于电机控制、传感器融合等需要实时监控的场景。

weixin_29159613的博客 443

UVM初学篇 -(15) UVM factory 工厂机制

工厂机制不是UVM独有的机制,这是面向对象语言特有的机制。在面向对象中工厂中角色就是两个:工厂和产品,工厂机制的意思在于将创建某一类对象的任务交给对应的工厂类统一管理,构建对象体系。工厂模式提供了一种灵活和可扩展的方式来创建对象,使代码更易于维护和扩展。通过将对象的创建逻辑封装在工厂中,可以隐藏对象的实现细节,提高代码复用性,并简化对象的创建过程,同时实现了对象之间的解耦。而UVM中工厂机制也是同样的道理,目的是为了更好的注册实例和方便地替换已经注册的实例。

u011164476的博客 2006

实现高精度卷积混响--MATLAB仿真篇

一、前言 之前在STM32F407上现实了直播声卡,实现的经典Schroeder混响模型和Moorer混响模型,得到不错效果。后来得知卷积混响最为真实地表现空间的特性,所以也就尝试在MCU上实现一个高精度的卷积混响(卷积点数为32768),目前MCU出来的混响效果算得上一流水准,本人也在计划在ADI的21489或者SC584上更高精度的卷积混响。 二、卷积方式 1、conv1是使用MATLAB自带卷积函数conv 2、conv2和conv3是改进后卷积过程,具有减少运算量特点,方便嵌入式移植 clear;

Six44的博客 5073

uvm factory

UVM Factory 是验证环境中实现动态对象和组件创建的核心机制,它通过类型注册和覆盖(Override)机制,允许在不修改原有代码的情况下替换组件或事务类型,从而提升验证环境的灵活性和可重用性。UVM Factory 是验证环境灵活性的核心机制,通过类型注册和覆盖,实现了“代码无需修改,行为动态可配”的目标。合理使用Factory机制,能够显著提升验证代码的可维护性和场景覆盖率,是现代芯片验证方法学中不可或缺的一部分。仅替换特定路径下的父类实例(例如只替换某个Agent中的Driver)。

有人说学习`这个`最好的时间是十年前,有人说最好的时间是现在,众说纷纭... 942

【ubuntu24.04】auto remove后,重启,kernel panic ,please reboot your computer vfs unable to mount root fs

Ubuntu 24.04系统在运行auto remove后出现内核恐慌(kernel panic)无法启动,显示"VFS: unable to mount root fs"错误。该问题是由于当前内核被清除导致系统无法挂载根分区。解决步骤包括:1)尝试用GRUB菜单中的旧内核启动;2)在GRUB中临时编辑启动参数;3)使用Ubuntu启动盘进行chroot修复;4)使用Boot-Repair工具一键修复。成功启动后,需要重新安装linux-generic等元包,重建initramfs并更新

突围 1205

【异常】OpenAI提示内容有误 Invalid prompt: your prompt was flagged as potentially violating our usage policy.

用户需优先调整提示内容,确保符合OpenAI的使用政策。若问题持续,建议结合请求ID和具体代码示例联系官方支持。同时,可参考腾讯云、Microsoft Q&A等平台提供的错误处理实践(如重试机制、日志记录)优化代码健壮性。

奶爸的编程之路,也就一周冷个三天 2057

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

聊聊uvm_component与uvm_root(uvm-1.2版)

sunstat的博客 1514

企业级大数据平台的数据网格(Data Mesh)转型之路

随着企业数字化转型的深入,传统大数据平台面临数据孤岛化、治理成本高、业务响应慢等核心痛点。数据网格作为一种新兴的分布式数据管理架构,通过领域驱动设计(DDD)、数据产品化和联邦治理模式,为企业提供了打破数据壁垒、提升数据生产力的全新路径。本文聚焦企业级数据平台从传统架构(数据湖/数据仓库)向数据网格转型的关键技术、实施步骤和组织配套,涵盖技术架构设计、核心算法实现、项目实战案例及工具链推荐。背景介绍:定义转型目标、术语体系与核心挑战核心概念与联系:解析数据网格四大支柱及技术架构图谱核心算法原理。

AI 领航者的博客 1083

UVM1.1应用指南及源代码分析:掌握UVM核心技能,提升验证效率

UVM1.1应用指南及源代码分析:掌握UVM核心技能,提升验证效率 【下载地址】UVM1.1应用指南及源代码分析 《UVM1.1应用指南及源代码分析》深入解析了UVM1.1的核心机制,帮助读者从应用实践到源码层面全面掌握UVM。本书分为两部分:前半部分专注于UVM的基本使用方法,提供实用指导;后半部分则深入剖析UVM源码...

gitblog_06712的博客 971

华为OD机试双机位C卷:流量波峰 (C/C++/Py/Java/Js/Go)

华为OD机试双机位C卷 流量波峰,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解。华为OD机试 - 流量波峰。

qq_45776114的博客 2445

Orange3实战教程:文本挖掘---主题建模

主题建模通过LDA、LSI或HDP算法分析文档集合,自动发现隐含主题结构。组件输入为文档语料库,输出包括带主题权重的语料库、主题词分布及完整主题数据。不同算法特性各异:LSI允许正负权重但解释性较弱,LDA更易解释,HDP参数复杂需谨慎设置。结果可结合词云、热力图等可视化工具分析主题特征及分布。示例显示如何通过预处理文本、选择算法(如提取5个LDA主题),并利用MDS和箱线图探索主题间关系及关键词分布。

err2008的专栏 361

UVM验证平台中的Factory机制详解:如何用uvm_component_utils宏实现动态替换

本文深入解析了UVM验证平台中的Factory机制,重点阐述了如何通过uvm_component_utils宏实现组件的动态替换。文章通过实战案例,展示了该机制如何将对象创建与使用解耦,从而极大提升验证平台的复用性、可配置性和可维护性,是构建灵活IC验证架构的关键技术。

j2k3l4的博客 794

实干派!网易易盾增强版滑块验证码,全方位讲解识别思路(含源码)

该验证码是异形滑块验证码中的一种,缺口旋转+偏移的处理需要你有很好的图像处理知识,能很好的处理透明通道,同时,该验证码需要你能很好的处理缺口和背景之间匹配的关系,该验证码的处理难点就是两个缺口之间如何找到正确的,两个检测框都有很强的相似度,且加上背景图的干扰,在图像处理和有优化上难度大大增加。

码王吴彦祖的博客 2012

uvm 实战卷-学习笔记(附源代码)ver1

摘要:UVM实战Ver1版本引入Factory与Phase机制,实现自动化管理。通过uvm_component_utils注册组件,run_test自动创建对象,Objection机制控制仿真生命周期。Driver在main_phase中通过raise/drop_objection管理任务执行,无需手动控制仿真流程。代码从手动new升级为Factory自动创建,形成结构化测试平台,核心改进包括:组件自动注册/实例化、基于Phase的任务调度、Objection驱动的仿真控制。该版本标志着从手工编码向工业化验

qq_36143127的博客 1007

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

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

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

uvm_callback机制学习总结

UVM中的Callback机制解析:从原理到实践 摘要: 本文系统解析了UVM验证方法学中的Callback机制。首先介绍了Callback的基本概念,它是一种设计模式,允许在不修改原有代码的情况下动态注入或修改行为。在UVM验证环境中,Callback机制主要实现了四大功能:动态错误注入、组件解耦与重用、测试行为动态定制以及事务级监控。文章详细阐述了纯SystemVerilog和UVM两种环境下的实现方式,重点分析了UVM中的核心类和宏(uvm_callback、uvm_callbacks#(T,CB)、

IC验证及芯片SOC知识分享 578

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

ie8 object param没有效果_UVM factory机制如何重载带参数的object

最近组长让我多学习,别天天写代码,于是,这两天摸鱼读了一下UVM源码。首先先下结论,UVM的factory是不能重载parameterized class的。也就是说,set_type_override_by_type(ahb_lite_monitor#(.VIF_TYPE(virtual ahb_lite_if))::get_type(), asramc_ahb_monitor_le#(.VIF...

weixin_39614276的博客 252

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

UVM的构造函数new的个人理解

构造函数new 自己总结的规律 理解结合UVM实战这本书的阅读理解。 归纳一下自己对new函数的个人理解;只是书本前几章阅读后的认知,还不能完善,在此只为记录防丢失。构造函数new一般类的实例化,包含类的声明和类的构造。 比如,my_driver drv; drv=new();drv可以看做是一个句柄,一个指针,一个内存入口地址。这个指向的内存入口地址,存放着构造实现类的对象的初始化信息,包括变

学而不思则罔,思而不学则殆 1万+

UVM基本概念

1.为什么在TOP里面uvm_config_db set的时候都需要用到uvm_test_top,它针对不同的case产生的实例名字是一样的吗? 是一样的。对于+UVM_TESTNAME=example_case_(0…n),UVM验证平台会创建一个example_case_(0…n)的实例,他们的实例有一个共同的名字:uvm_test_top,所以你在top中congig_db的时候都会自上而...

crazybird1984的专栏 3022

UVMFactory机制深度解析:覆盖与替换的艺术

本文将作为一篇深度解析指南,带你彻底搞懂UVM Factory的工作原理,包括对象的注册、创建、以及最重要的类型覆盖(Type Override)和实例覆盖(Instance Override)。它赋予了验证环境前所未有的灵活性和可配置性,使得验证工程师可以在不修改原有代码的情况下,动态地替换验证环境中的组件或事务对象。覆盖是Factory机制的核心价值所在。它允许我们在测试用例(Testcase)级别,用一个派生类(或完全不同的类)的实例来替换验证环境中原本要创建的基类实例,而无需修改环境的任何源代码。

weixin_41855299的博客 595

SV(UVM)实现多phase pipeline driver建模

在平台的搭建中,需要关注的重点一是平台的结构,怎么样便于复用,怎么样便于使用,不需要知道内部层次结构就可以很好的配置和使用。另一点就是实现了,驱动怎么实现?monitor怎么实现?sequence怎么实现?这些在VIP里都是加密的,都是“核心机密”。而其他结构agent, coverge collector, scoreboard等等结构基本大同小异。本文主要讨论“实现”这一方面的一小部分内容,有

seabeam的专栏 3631

数字验证:UVM的factory机制是什么

使用factory机制的第一步首先需要将类注册到工厂。这个factory是整个全局仿真中存在且唯一的"机构”,所有被注册的类才能使用factory机制。这很好理解,想要使用工厂机制,你首先得在工厂中注册这个类。注册只需要遵照范式,使用utils宏对相应对象完成注册,注意不要弄错component和object。

shall we offer的博客 3113
上一篇: [UVM源代码研究] 如何定制一款个性化打印格式的printer
下一篇: [UVM源代码研究] 聊聊uvm_component与uvm_root(uvm-1.2版)
数字验证Kane陈
博客等级 码龄12年 662粉丝 48原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值