UVM-config_db机制和用法

1.用途

        config_db机制用于在UVM验证平台间传递参数,通常成对出现,其中set相当于寄信,get相当于收信。UVM提供的config_db机制可在组件实例化前就设定好配置信息,这样就可在tb的initial块中就进行设定了。真正将这些配置信息落实在各component,是在testbench运行过程build_phase中。

2.config_db参数

        用法很简单,先使用uvm_config_db::set()将配置信息写好,相应的component使用uvm_config_db::get()获取配置信息,整个过程类似寄信"和“收信”。例如:

class uvm_config_db#(type T=int) extends uvm_resource_db#(T);...static function bit get(uvm_component cntxt,					string inst_name,string field_name,inout T value);...static function void set(uvm_component cntxt,string inst_name,string field_name,T value);static function bit exists(uvm_component cntxt, string inst_name,string field_name, bit spell_chk=0);...
endclass

        那么它的几个参数具体指的是什么呢?

        Type T:要配置的成员类型,默认为int;

        uvm_component cntxt : set或get方法的发起者component,必须是一个component实例的指针;

        string inst_name:从发起者component到要配置的目标component,在UVM树中的索引路径,这和上面一个参数联合构成了目标路径;

        string field_name:域名称,一种标记,但一般为要配置的成员变量名;

        T value: set方法中,表示将要为field_name成员设定的值。在get方法中,表示要赋值的成员。

来看一个例子:

function void my_test::build_phase(uvm_phase phase);super.build_phase(phase);env = my_env::type_id_create("env",this);uvm_config_db#(int)::set(this,"env.i_agt.drv","pre_num",100);//以下均是为目标drv的pre_num配置100//uvm_config_db#(int)::set(this.env,"i_agt_drv","pre_num",100);//uvm_config_db#(int)::set(this.env.i_agt.drv,"","pre_num",100);//uvm_config_db#(int)::set(uvm_root::get(),"uvm_test_top.env.i_agt.drv","pre_num",100);...
endfunctionfunction void my_driver::build_phase(uvm_phase phase);super.build_phase(phase);if(!uvm_config_db#(int)::get(this,"","pre_num",pre_num))uvm_report_info("CONFIG","PRE_NUM CONFIG FAILED!",UVM_LOW);//uvm_config_db#(int)::get(uvm_root::get(),"uvm_test_top.env.i_agt.drv","pre_num",pre_num);//uvm_config_db#(int)::get(uvm_test_top,"env.i_agt.drv","pre_num",pre_num);...
endfunction

        对于几个不同的set语句,均是对pre_num进行100的配值,区别在于发起的component不同;而对不同的get来说 uvm_config_db#(int)::get(this,"","pre_num",pre_num)表示每创建一个my_driver对象都要为自己的pre_num成员get一个配值;而后两句get语句则表示只会为my_driver类对象drv的pre_num成员get一个配值。

3.多重设定

        上面的代码引申出一个问题,当有多个set配值时,应该听谁的话呢?原则为:发起者层次越高,优先级越高;发起时间越晚,优先级越高。

function void my_driver::build_phase(uvm_phase phase);super.build_phase(phase);uvm_config_db#(int)::get(this,"","pre_num",pre_num);...
endfunctionfunction void my_test::build_phase(uvm_phase phase);super.build_phase(phase);uvm_config_db#(int)::set(uvm_root::get(),"uvm_test_top.env.i_agt.drv","pre_num",500);	uvm_config_db#(int)::set(this,"env.i_agt.drv","pre_num",100);							uvm_config_db#(int)::set(this.env,"i_agt.drv","pre_num",999);							...
endfunctionfunction void my_env::build_phase(uvm_phase phase);super.build_phase(phase);uvm_config_db#(int)::set(uvm_root::get(),"uvm_test_top.env.i_agt.drv","pre_num",200);...
endfunction

        在上面的代码中pre_num成员最终会被赋值为200,这是因为:发起者中层次最高的是第一句和最后一句的uvm_top(第二句是uvm_test_top,第三句是env,对层次了解不清楚可查阅uvm component树),而第四句的赋值时间晚于第一句,因此具有最高优先级,将pre_num成员最终会赋值为200。

        如果是多次get呢?config机制允许set一次然后多次get,也就是说并不是get之后UVM就删除了该记录。

4.推荐用法

        虽然set可以有多种多样的写法,一般来说,我们还是推荐固定写法:将发起者直接定为this。

uvm_config_db#(int)::set(this,"env.i_agt.drv","pre_num",100);
uvm_config_db#(int)::get(this,"","pre_num",pre_num);

        这样对我们来说也简单省事,直接一个this搞定,让uvm_test_top在build_phase中完成所有的参数配置。

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

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

相关文章

RK3568 Linux 平台开发系列讲解(内核入门篇):如何高效地阅读 Linux 内核设备驱动

在嵌入式 Linux 开发中,设备驱动是实现操作系统与硬件之间交互的关键。对于 RK3568 这样的平台,理解和阅读 Linux 内核中的设备驱动程序至关重要。 1. 理解内核架构 在阅读设备驱动之前,首先要了解 Linux 内核的基本架构。内核主要由以下几个部分组成: 内核核心:处理系…

【word转pdf】【最新版本jar】Java使用aspose-words实现word文档转pdf

【aspose-words-22.12-jdk17.jar】word文档转pdf 前置工作1、下载依赖2、安装依赖到本地仓库 项目1、配置pom.xml2、配置许可码文件(不配置会有水印)3、工具类4、效果 踩坑1、pdf乱码2、word中带有图片转换 前置工作 1、下载依赖 通过百度网盘分享的文…

Golang实现免费天气预报获取(OpenWeatherMap)

最近接到公司的一个小需求,需要天气数据,所以就做了一个小接口,供前端调用 这些数据包括六个元素,如降水、风、大气压力、云量和温度。有了这些,你可以分析趋势,知道明天的数据来预测天气。 1.1 工具简介 …

《Java8函数式编程》学习笔记汇总

前言 见证了java8的多层排序,为此想系统学习下java8的用法。 目录 简介Lambda表达式流高级集合类和收集器数据并行化测试、调试和重构设计和架构的原则使用Lambda表达式编写并发程序下一步改怎么办 后记

tinyxml2的入门教程

tinyxml2的入门教程 前言一、tinyxml2 创建xml 文件二、tinyxml2 添加数据三、tinyxml2 更改数据四、tinyxml2 删除数据五、tinyxml2 打印总结 前言 xml 是一种标记型文档,有两种基本解析方式:DOM(Document Object Model,文档对象模型)和SAX…

尚品汇-sku存入Redis缓存(二十三)

目录: (1)分布式锁改造获取sku信息 (2)使用Redisson 分布式锁 AOP实现缓存 (3)定义缓存aop注解 (1)分布式锁改造获取sku信息 前面学习了本地锁的弊端,…

NFTScan 浏览器现已支持 .mint 域名搜索功能!

近日,NFT 数据基础设施 NFTScan 浏览器现已支持用户输入 .mint 域名进行 Mint Blockchain 网络钱包地址的搜索查询, NFTScan 用户能够轻松地使用域名追踪 NFT 交易,为 NFT 钱包地址相关的搜索查询功能增加透明度和便利性。 NFTScan explorer…

MATLAB算法实战应用案例精讲-【数模应用】Poisson 回归分析(附R语言、python和MATLAB代码实现)

目录 前言 知识储备 常见回归方法 一、 回归分析方法概述 二、 分类 1.应用领域分类 (1)通用型 (2)统计学角度 (3)计量角度 (4)社科学角度 (5)医学角度 (6)数学建模 (7)专业型 Poisson回归和负二项回归 1.前提条件 2.分析流程图 3.案例分析 算…

通讯规约协议

通讯规约协议(Communication Protocol),又称为通信规程,是随着现代通信技术和计算机网络技术的发展而发展的规约。它是通信双方对数据传送控制的一种约定,包括对数据格式、同步方式、传送速度、传送步骤、检纠错方式以…

Java8-求两个集合取交集

在Java8中,求两个集合的交集可以使用不同的三种方式:传统的循环遍历、使用Stream API的filter操作和使用Stream API的Collection操作。 方法一:传统的循环遍历 首先,我们创建两个集合list1和list2,并给它们添加一些元…

vue + xterm 前端终端terminal

引入 import {Terminal} from "xterm"; import {FitAddon} from "xterm-addon-fit"; import "xterm/css/xterm.css";html <div id"terminal"></div>vue onMounted(() > {nextTick(() > {initTerm();}) })const i…

规划决策算法(四)---Frenet坐标系

知乎&#xff1a;坐标系转换 1.Frenet 坐标系 什么是 Frenet 坐标系&#xff1a; 为什么使用 Frenet 坐标系&#xff1a; 通常情况&#xff0c;我们只会关注车辆当前距离左右车道线的距离&#xff0c;来判断是否偏离车道&#xff0c;是否需要打方向盘进行方向微调。而不是基于…

腾讯云k8s相关

1.某个服务腾讯云内网地址&#xff1f; 比如&#xff1a;spiderflow-web正式环境&#xff1a;http://spiderflow-web.sd-backend:30001 试一试&#xff1a;

python实现批量化查询耗时SQL

python实现批量化查询耗时SQL 今天发现最近多了一些耗时SQL的查询&#xff0c;例如我去数据库一张千万级表查询一天的数据需要耗时20分钟&#xff0c;我总共需要查询一年的数据&#xff0c;我总不能一条一条的手动执行吧&#xff0c;这样也太伤身体&#xff0c;属实难崩啊。就…

笔记——C语言

C语言是一种结构化的程序设计语言 空格的ASCII码值是32&#xff0c;空格是属于可打印字符 \0是字符串结束的标志&#xff0c;字符串的末尾隐藏了一个\0 printf()在打印字符串或者strlen在计算字符串长度的时候&#xff0c;遇到\0的时候就自动停止。 strlen返回的值是size_t…

flutter开发实战-AssetBundle读取指定packagename的文件

flutter开发实战-AssetBundle读取指定packagename的文件 在Flutter中&#xff0c;如果你想从特定的包名中读取资源文件&#xff0c;你可以使用rootBundle类来访问packages目录下的资源。下面使用rootBundle来读取包名为my_package的资源文件user.json 一、pubspec.yaml配置 …

MongoDB教程(二十二):MongoDB固定集合

&#x1f49d;&#x1f49d;&#x1f49d;首先&#xff0c;欢迎各位来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里不仅可以有所收获&#xff0c;同时也能感受到一份轻松欢乐的氛围&#xff0c;祝你生活愉快&#xff01; 文章目录 引言一、固定集…

FastGPT 源码调试配置

目录 一、添加 launch.json 文件 二、调试 本文简单介绍如何通过 vscode 对 FastGPT 进行调试。 这里假设已经安装 vsocde 和 FastGPT本地部署。 一、添加 launch.json 文件 vscode 打开 FastGPT 项目,点击 调试 -> 显示所有自动调试配置 -> 添加配置 -> Node.j…

笔记分类的烦恼

前言 你是否为笔记的分类而苦恼&#xff0c;是否迷失在市面上纷繁复杂的笔记分类法&#xff1f; 不用再烦恼了&#xff0c;本文将介绍一个适用于个人笔记的终极分类办法&#xff0c;只需三刀&#xff0c;尘埃落定。 &#x1f52a; 第一刀 笔记场景 &#x1f370; 也就是笔记…

通用网络验证系统,承载能力强,支持高并发、高承载、多线路

这个网络验证系统基于PhpMySql数据库架构的网络验证系统&#xff0c;安全稳定、性能强悍、 承载能力强&#xff0c;支持高并发、高承载、多线路&#xff0c;支持服务器集群架设,高性能设计&#xff0c;速度非常快&#xff0c;效率非常高。 客户端支持VC、VB、DELPHI、易语言、…