[UVM源代码研究] 当我们调用uvm_config_db里的函数时uvm内部都是怎么工作的

uvm_config_db的set()与get()方法 1、set方法 1.1 方法原型: uvm_config_db#(T)::set(uvm_component cntxt, string inst_name, string filed_name, T value); 1.2 举个栗子: uvm_config_db#(int)::set(this, "c1", "val1", 100); 1.3 参数含义 1)#( )括号中是要传送的数据类型T,可以是: virtual interface; 单一变量值如:int,string,enum等 阅读详情

[UVM源代码研究] 当我们调用uvm_config_db里的函数时uvm内部都是怎么工作的

我们已知的uvm_config_db有4个静态方法(所以调用方法是uvm_config_db::):

  • set
  • get
  • exists
  • wait_modified
    今天我们就通过这四个method来一点点揭开uvm_config_db神秘的面纱。

首先我们最先有的疑惑就是,当我们调用set这个function的时候,我们所set的变量被存在了何处?
在这里插入图片描述

我们看到uvm_config_db是从uvm_resource_db继承而来的。
在这里插入图片描述

这个uvm_resource是个什么数据类型?
在这里插入图片描述

进一步挖下去看看uvm_resource_base是什么。
在这里插入图片描述

可以看到只是一个从uvm_object继承而来的virtual类而已,uvm_resource继承后增加了个参数化,而uvm_resource_db中定义(typedef)了一个跟其参数一致的参数化的uvm_resource类型rsrc_t。
在这里插入图片描述

后面用的一些函数的返回值或者中间数据都是rsrc_t类型的,本质上是uvm_resource类型。

现在我们回到最开始讨论的问题,set的数据究竟放在哪里了?那我们就需要看看uvm_config_db中关于set函数的定义。首先我们先来看看源代码中关于set这个函数的说明:
在这里插入图片描述

从这个函数描述中我们能得出以下结论:

1、在build阶段时,如果set的目的地相同,cntxt决定的hierarchy层次(uvm树形结构中的位置)高的会优先取代层次低的。如果cntxt对应相同的层次,那么后执行的会覆盖先执行的。

2、build完成后,遵循后执行覆盖先执行的原则,也就是说跟执行层次cntxt无关了。

3、set_config_int/set_config_string/set_config_object是参数固定后的uvm_config_db#(int)::set等的简写。

接下来我们再看set函数内的执行代码
在这里插入图片描述
在这里插入图片描述

我们还需要知道几个变量的来历:
在这里插入图片描述

m_rsc是一个key为string,value为uvm_resource#(T)的静态键值对(其他语言里也有叫字典等)(uvm里给之取名叫uvm_pool)组成的以uvm_component索引的数组(这数据类型真是让人一脸懵逼!),这个m_rsc数组可以理解为一个以uvm_pool为value以uvm_component为key的联合数组,只不过这里的value本身又是一个键值对uvm_pool而已。m_waiters讲wait_modified的时候再来分析,先搁置。

再回过头来看下set函数里的行为,173行之前是在做一些变量的声明以及获取一些全局变量包括uvm_top、phase、set的目标路径inst_name等等。174-178是在查看该发送路径(cntxt)是否发起过set,没有则创建,随后将创建完成的键值对赋给前面声明的uvm_pool(string, uvm_resource#(T))对象,这一步相当于把之前让人一脸懵逼的键值对数组的key产生了(即set的第一个参数cntxt),下一步就是产生联合数组的value,即uvm_pool。

这个uvm_pool本身还包含了key和value,key是string类型,value是一个uvm_resource#(T)类型,那下面的工作就是产生这两个类型的值。183行产生了key,185-192产生了value,其中还包含了个查看键值对是否已存在的检查(上面174-176对外层键值对也存在一个检查)。如果已存在了需要将变量exists赋值为1,后面判断替换关系201-208的时候会用到。210-218是在trigger一个event,目的是使得wait_modified的task能够顺利往下执行。220-223超纲了,暂时先不解读了,毕竟我们关心的是set到哪里。这里我们知道set的内容放到了一个键值对联合数组m_rsc里了,由于这个键值对联合数组是一个static类型,所以通过uvm_config_db类都可以访问,并且这个键值对联合数组在set函数里就已经做了优先级替换的判断了,于是这就回答了我们上面提出的第一个问题。

剩下的get函数无非就是到键值对联合数组里取值,就比较简单了。
在这里插入图片描述

至于exists和wait_modified无非也是对上面键值对联合数组的一些条件判断而已,这里只贴下代码,就不做具体解读了。
在这里插入图片描述
在这里插入图片描述

为了帮助大家理解config_db的set和get的过程,我们引用于cluelogic中的图示来结合我们上面的源代码再次帮大家巩固下这方面的知识

set过程的图示

我们首先在env的build_phase()中执行如下set

uvm_config_db#( jelly_bean_agent_config )::set( .cntxt ( this ),
.inst_name ( "jb_agent1*" ),
.field_name( "jb_agent_cfg" ),
.value( jb_env_cfg.jb_agent_cfg1 ) );
uvm_config_db#( jelly_bean_agent_config )::set( .cntxt ( this ),
.inst_name ( "jb_agent2*" ),
.field_name( "jb_agent_cfg" ),
.value( jb_env_cfg.jb_agent_cfg2 ) );

在UVM中执行过程如下图示
在这里插入图片描述

以上执行过程描述如下:

  1. The jelly_bean_env calls the set() function with this (jb_env) as the cntxt.
  2. An entry of an associative array (m_rsc) is created using the cntxt object as the key, if this entry does not exist.
  3. The entry of the associative array points to a uvm_pool, which has another associative array (pool).
  4. An entry of the associative array is created using the inst_name and the field_name as the key (lookup). Note that the inst_name and the field_name are concatenated with a string (“M_UVM“) when the lookup is created.
  5. If the lookup does not exist, a uvm_resource object is created. Unlike the virtual-interface case, the inst_name is not “” this time. In this case, the full name of the cntxt object concatenated with the inst_name is stored as the scope. The value passed to the set() function is also stored.
  6. The handle to the uvm_resource object is stored in two kinds of uvm_queues. The first kind of queues store the handles to the uvm_resource objects that have the common field_name. A uvm_queue is created for every unique field_name. In our case, one uvm_queue is created for the “jb_agent_cfg”.
  7. The second kind of queues store the handles to the uvm_resource objects that have the common type. A uvm_queue is created for every unique type. In our case, one uvm_queue is created for the jelly_bean_agent_config type.
  8. The queues are registered in the singleton uvm_resource_pool. The uvm_resouce_pool has two associative arrays. One array (rtab) uses the field_name as the key.
  9. The other array (ttab) uses the type of the uvm_resource as the key.

get

我们再看下在agent中的get的执行过程

uvm_config_db#( jelly_bean_agent_config )::get( .cntxt ( this ),
.inst_name ( "" ),
.field_name( "jb_agent_cfg" ),
.value ( jb_agent_cfg ) );

在UVM中执行过程如下图示
在这里插入图片描述

以上执行过程描述如下:

  1. Look up the name table of the uvm_resource_pool with the field_name as the key.
  2. If the name matched, get the handle of the uvm_queue.
  3. Traverse the entries of the queue.
  4. If the scope and the type of the object matches, that uvm_resource is stored in a newly created uvm_queue. Note that there are two uvm_resource objects, but their scopes are different. The full name of the cntxt object passed to the get() function distinguishes between the two.
  5. The uvm_resource with the highest precedence is retrieved.
  6. The value of the resource is returned.
    希望补充的上面引用的内容能够帮助大家更清晰地理解configure_db的set和get的过程。

参考资料

UVM Tutorial for Candy Lovers - 13. Configuration Database

UVM验证方法学_config_db机制 config_db机制是uvm中很重要的机制之一。由于验证平台的结构往往会比较复杂,其中的组件如果要进行互相通信和参数传递,则需要一种高效且稳妥的办法,这就是config_db机制的意义。正确地运用config_db机制,能够帮助我们灵活地对环境进行控制,实现不同的场景。 阅读详情

相关推荐

UVM初学篇 -(20)UVM config_db配置数据机制

UVM验证平台中通信的方式很多,但是由于验证平台的复杂性,使得平台的通信变得繁琐,UVM提供了一种简单高效的通讯方式,就是config_db。例如在DADD验证平台中,平台driver中是通过层次化的访问去驱动interface的,但是对于复杂的DUT来讲,例化层次比较多,改动起来比较繁琐,这种方法显然是不可行了,config_db是一种很好的方法。

u011164476的博客 2498

config机制 — UVM

文章目录概念1.interface的传递2.传递变量3.传递object 概念 uvm提供了uvm_config_db配置类以及几种方便的变量设置方法来实现仿真时的环境控制;uvm_config_db::set() 通过层次和变量名,将这些配置信息存放在uvm_package唯一的全局变量uvm_package::uvm_resource中。全局变量uvm_resource用来存储和释放配置资源信息。uvm_resource是uvm_resource_pool类的全局唯一实例,该实例有两个resource数

SummerXRT的博客 2428

[UVM源代码研究] 我们在使用UVM寄存器模型内建的sequence检查寄存器时UVM源代码都执行了些啥?

我们在使用UVM寄存器模型内建的sequence检查寄存器时UVM源代码都执行了些啥?

sunstat的博客 1743

#UVM# 浅析快递小哥:uvm_config_db

1. 功能 uvm_config_db#(T)是一个类,用于配置uvm_component实例的资源;uvm_config_db主要是提供了一种资源配置的简化方法。 2. 命令解析 class hierarchy uvm_config_db#(T) 或者 uvm_config_db T 就是待配置选项的type类型。 class定义 class uvm_config_db#( type T = int ) extends uvm_resource_db#(T) methods .

那么菜的博客 723

【UVM源码】sequence机制使用方法和源代码解析

UVM机制sequence的使用方法介绍,UVM机制sequence机制相关的源代码解析。

飓风_数字IC验证的博客 7955

【UVM源码】UVM Config_db机制使用总结与源码解析

在Systemverilog搭建的验证平台中,需要对各组件进行参数配置,但是配置各组件必须得在各组件实例化之后才能配置参数,例如test中必须得执行env = new();才能配置env.i_agt.drv.pen_num = 10;。再比如接口指针,需要就需要为每个组件设定设定set_interface();方法,非常繁琐。为解决此问题,UVM提出了解决办法,即UVM Config_db机制。

飓风_数字IC验证的博客 1947

[UVM源代码研究] 关于default_sequence和p_sequencer的一点思考

关于default_sequence和p_sequencer的一点思考

sunstat的博客 2130

UVM Config DB 示例及源代码解析

在 UVM 中,Config DB(配置数据库)是一个用于在测试环境中传递配置信息的重要组件。Config DB 是 UVM 中用于传递配置信息的重要机制,它可以方便地在测试环境中共享和访问配置数据。通过合理使用 Config DB,我们可以更加灵活地配置和管理测试环境,提高验证的效率和可重用性。第三个参数是要设置的配置项名称,最后一个参数是要设置的值。时,它将从 Config DB 中获取到正确的值,并继续执行后续的行为。的字符串型参数,用于存储从 Config DB 中获取的配置信息。

DlqCoder的博客 196

7.3 uvm_config_db in UVM

uvm_config_db类派生自uvm_resource_db类。它是uvm_resource_db顶部的另一层便利层,简化了用于uvm_component实例的基本接口(资源库的访问方法)。下面uvm_config_db类的代码段取自uvm源代码。

小邦是名小ICer的博客 1234

基于ProXmoX VE的虚拟化家庭服务器(篇一)—ProXmoX VE 安装及基础配置

ProxmoxVE是一款套开源的虚拟化管理软件,用户可通过网页的方式来管理服务器上使用kvm以及lxc技术运行的虚拟机。同时提供了一些先进功能的支持,如集群、HA等。PVE虽然是开源,却是由一个商业公司在运营、更新以及维护。...

隔壁老瓦的专栏 6320

拉曼光谱仪的原理与应用——TFN 7G F660手持式拉曼光谱识别仪

拉曼光谱仪的原理与应用——TFN 7G F660手持式拉曼光谱识别仪

TFN_yzgd的博客 926

数组流失 db单位_读UVM源代码(三)uvm_config_db与uvm_resource_db

弄UVM的验证工程的过程种,发现之前resource这块学得不到位,来这补充一下,先补充uvm_config_db,就拿我自己那个工程的代码来举例子说明uvm_config_db是怎么用的。我的工程中主要是对virtual interface用到了config_db,流程是这样的:1.在testbench中例化了interface,然后通过config_db::set来把interface这个样的...

weixin_30013175的博客 515

C++ muduo网络库知识分享01 - Linux平台下muduo网络库源码编译安装

Muduo is a multithreaded C++ network library based on the reactor pattern. muduo库的介绍就是:一个基于reactor反应堆模型的多线程C++网络库。 muduo网络库是C++语言开发的一个非常优秀的网络库,作者陈硕,muduo网络库在多线程环境下性能非常高,该系列文章会分享一些muduo库源码的知识,包括它的线程池源码...

大秦坑王的专栏 3万+

uvm_config_db——半个全局变量

  UVM中的配置机制uvm_config_db,uvm_config_db机制用于在UVM平台间传递参数。它们通常是成对出现的,set 寄信,而get函数是收信。config 机制大大提高了UVM的验证灵活性。例如module 和 class 连接通过config_db virtual interace. module tb_top initial begin ...

weixin_33774308的博客 928

RK3588嵌入式开发:从零构建Rockit多媒体处理引擎的实战指南

本文详细介绍了如何在RK3588嵌入式平台上从零构建Rockit多媒体处理引擎的实战指南。涵盖开发环境搭建、工具链配置、源码编译流程、硬件加速优化及典型问题解决方案,帮助开发者高效利用RK3588的NPU和VPU加速特性,实现高性能多媒体处理应用。

mango的博客 186

共聚焦显微镜的光源、工作原理与选型

共聚焦显微镜作为科研与工业领域中重要的微观成像工具,凭借光源的精准适配性、光学切片技术的三维成像能力,以及对不同工业场景的定制化适配潜力,为半导体检测、工业部件分析、智能制造升级提供了关键技术支撑。深入理解其光源特性、工作原理与选型逻辑,能帮助工程师与技术人员精准匹配设备与生产需求,既保障微观检测的精度与效率,又为产业优化、技术创新筑牢微观观测的基础。

PhotonixBay的博客 1536

uvm_config_db

功能意义 命令解析 class hierarchy class定义 methods get set exists wait_modified 细节注意功能意义uvm_config_db#(T) 是一个类,简化interface,用于配置uvm_component实例。命令解析class hierarchyuvm_config_db#(T) 或者 uvm_config_dbT就是待配置选项的type类

学而不思则罔,思而不学则殆 8144

C++ PCL点云处理实战专栏

工业级点云处理技术学习资源,涵盖电力、建筑、隧道等领域的实战案例。内容分为三阶段:代码原理(算法认知)、动态库(项目验证)和完整代码(定制开发)。

weixin_45196569的博客 1117

UVM实验2

req是通过uvm的type_id::create创建的,在创建时做了域的自动化的声明,所以可以直接用核心基类里的方法,比如clong。但需要注意的是,,所以赋值给子类rsp时需要转化,同时转化可以成功。:调用clong方法会新创建一个对象,复制req到新创建的对象中,并返回新创建对象的句柄)。许多函数都有返回值,比如$cast( ),在进行类型转化的同时会返回1,或者0,表示转化成功或者失败,此时使用void’( )可以把转化值变为空,告诉编译器不用理会返回值;

Dale_e的博客 1542

python实现Markowitz模型 (附完整源码)

python实现Markowitz模型 (附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 402

(十二)深入理解蓝牙BLE之“移植Bluez 5.18源码到嵌入式平台”

在某嵌入式平台进行蓝牙开发,发现上面居然没有btmon,hciattach,hcitool等蓝牙调试工具,无奈之下,只好移植bluez协议栈到目标嵌入式平台,建议移植5.18版本(最新的5.54版本居然hcitool等工具不是默认编译的,需要修改Makefile才可以)。 看到很多讲解移植过程的文章都是需要积分的,觉得写一篇免积分的文章还是有些意义的,欢迎同行来交流。 移植环境:Linux ubuntu 目标平台:sigmastar 星宸科技 配置交叉编译工具链:export PATH=$PATH:

2964

UVM 一文全概括

针对MCDF中sv 代码转换成 UVM 代码的比对,理解UVM代码,方便调试。

zhy07321517526的博客 6383

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

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

在Ver1版本中,我们解决了“谁来干活”和“何时干活”的问题。但还有一个关键问题悬而未决:Driver这个软件对象,到底如何拿到DUT这个硬件模块的“遥控器”(接口)?这个快递柜非常智能,它允许你给包裹贴上详细的“收件地址”,确保包裹能被正确的收件人精准取走。类,可以理解为**将DUT所有相关的接口信号,都装进一个标准化的“收纳盒”里**。值得注意的是,虽然底层实现机制变了,但从宏观的仿真流程来看,与Ver1完全一致,因为。现在,我们来看看如何通过“快递柜”来投递和取走这个装着接口的“收纳盒”。

qq_36143127的博客 722

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

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

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

gitblog_06712的博客 971

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

uvm_set/get_config_string

set/get_config_string和set/get_config_object。它们分别对应uvm_config_db#(string) ::set/get和uvm_config_db#(uvm_object) ::set/get config_db比set/get_config强大的地方在于,它设置的参数类型并不局限于以上三种。常见的枚举类型、virtual interface、bit类型、队列等都可以成为config_db设置的数据类型 UVM提供命令行参数来对它们进行设置 <sim

dong_learning的博客 1388

《UVM实战卷Ⅰ》学习笔记 第二章 一个简单的UVM验证平台(1)

写在前面:本章作者想通过一个极为简单的验证环境让读者初始UVM,因此该章学习有一些建议.第一点,有的细节暂时不用深究,因为后续章节会详细讲解.做好备忘,回头再温习即可.第二点,个人认为作者关于UVM中语法点或者说新机制的引入是从"需求--->解决方案"的思路来讲解的,所以可以从这个角度理解,抓大放小. 2.1 无 2.2 1.想要在使用UVM实现一个功能时,第一步应该做什么? 这里主要谈的是面向对象编程.从开始讲,UVM本质上是一个库,库中有各种各样已经定义好的类(class),这里的定义好

ICLC的博客 2857
上一篇: [UVM源代码研究] 我们每天都在用的uvm_tlm_analysis_fifo内部是如何工作的
下一篇: [UVM源代码研究] 浅谈UVM PHASE机制的运行
数字验证Kane陈
博客等级 码龄12年 662粉丝 48原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值