基于UVM搭验证环境
基于UVM搭验证环境基本思路:
首先,我们搭建环境时一般都有一个目标的DUT。此时,我们可以结合所要验证的的模块、是否需要VIP、验证侧重点等在典型的UVM验证环境的基础上做适当调整后形成一个大体的环境架构。比如,需要一个ahb_vip_agent、系统级还是模块级的DUT等等。这样,整个验证环境中需要几个in_agent、是否需要out_agent、reference model是否需要自己写就比较清楚了。基于这些考虑,我们的环境架构基本上就定下来了。
其次,当整个环境的架构确定好了之后,接下来就是具体的编写环境组件的过程了。这个是整个环境搭建最重要和工作量最大的部分。有的喜欢自上而下地先写顶层,env再agent,driver,transaction来编写各个组件;有的习惯自下而上地先写好每个driver,monitor再在agent或env中做组合连接。我的经验是,在搭建环境的过程中,认知就是一个从框架到编码的过程,所以自上而下的方式更符合这样一个认知的过程。另外,在真正工作中,我还是觉得我们搭建环境的第一步不要想着一次性把环境中所有的组件都写完,而是先写完除scoreboard和reference model之外的所有规划组件。至于testcase,可以先写好冒烟case(当然可能包括冒烟case需要的sequence)。这样做的目的是我们可以在最短的时间里调试环境并能够正常冒烟。之后再根据项目进度逐步添加reference model,scoreboard,sequence和case等,并不断完善。
基于UVM搭建验证环境的过程:
①编写uvm_env。首先根据确定的环境架构,编写env将整个环境的结构关系确定下来。
②如果环境中要用到vip,可以在env中把vip包进来。
③环境中可能会包含多个agent。其实agent可以理解为一个单一的env。所以还是从agent自顶向下的去编写,agent→interface→sequencer、sequence→driver→moitor。
④在编写agent的driver过程中可能需要同步进行transaction的编写。这样可以不断地调整transaction中的配置变量。
⑤编写top.sv。完成env和agent之后,环境的interface基本也确定下来了。这个时候可以编写顶层信号连接。
⑥编写base_test.sv。这个过程中可以同步编写顶层的transaction以及顶层的一些sequence和sequencer。
⑦待上述编写完成后,开始编写环境和代码的filelist以及仿真脚本。调试冒烟case。
以上7个小点是一个基本的环境搭建步骤。这个环境可以完成待测代码的冒烟测试。之后的工作,就是在这个环境的基础上补充reference model和scoreboard的功能,以及根据验证计划不断补充激励并完成验证工作。
《uvm实战》温习小记:
set与get函数的参数:
config_db机制用于uvm验证平台间传递参数(如int,virtual interface),set与get通常是成对出现的,set函数是寄信,get函数是收信,通常习惯在最顶层处(tb_top)处set,使用方式如下:
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_component实例的指针,第二个参数是相对于实例的路径。第三个参数表示一个记号,用于说明这个值是传给目标中的哪个成员的,第四个参数是要设置的值。
需要注意的是如果在顶层tb_top中set,用法为
uvm_config_db# (int) : : set (null, "uvm_test_top.env.i_agt.drv" , "pre_num" , 100);
set函数原型:
static function void set(
uvm_component context, // 上下文(作用域)
string inst_name, // 目标实例的路径(支持通配符)
string field_name, // 配置项的名称(字符串)
T value // 要设置的配置值(任意类型)
);
context
作用:定义配置的作用域(通常是一个组件的指针)。
规则:
如果
context设置为null,配置将全局可见。如果
context设置为某个组件(如this),配置的作用域将限定在该组件的层次结构下。子组件可以通过向上查找父组件的作用域来访问配置。
inst_name
作用:指定目标实例的路径(支持通配符
*或.*)。示例:
"uvm_test_top.env.agent": 精确匹配路径。
"uvm_test_top.env.*": 匹配env下所有组件。
"*.agent": 匹配所有名为agent的实例。
field_name
作用:配置项的唯一标识符(字符串),需与
get()中的名称一致。示例:
"vif","cfg","num_packets"。
value
作用:要传递的值,可以是任意类型(如接口、对象、整数等)。
示例:传递虚拟接口、配置对象、字符串等。
收信一般在组件中的build_phase收信,以driver为例,使用方式如下:
uvm_config_db# (int) : : get (this, "" , "pre_num" , p_num);
其中第一个参数和第二个参数用来组成收信地址,第一个也必须是uvm_component实例的指针,第二个参数则是相对于此实例的路径。一般的,如果第一个参数是this,第二个参数可以是一个空的字符串,第三个参数就是set中的参数,必须严格对应,第四个参数则是该实例中要设置的变量。
get函数原型:
static function bit get(
uvm_component context, // 上下文(作用域)
string inst_name, // 当前实例的路径
string field_name, // 配置项的名称
inout T value // 接收配置值的变量
);
context
作用:与
set()中的context对应,定义查找配置的作用域。规则:
通常设置为
this(当前组件),UVM 会从当前组件向上遍历父组件的作用域查找配置。如果设置为
null,则从全局作用域查找。
inst_name
作用:当前组件的完整路径名,通常通过
get_full_name()获取。自动获取:在组件内部使用时,可以直接用
uvm_root::get().get_full_name()或this.get_full_name()。
field_name
作用:与
set()中的field_name一致,用于匹配配置项。
value
作用:接收配置值的变量,类型必须与
set()中传递的类型一致。注意:如果未找到配置,
get()返回0,且value保持不变。
关键使用场景
1. 传递虚拟接口(Virtual Interface)
// 在顶层模块中设置接口
initial begin
uvm_config_db#(virtual apb_if)::set(null, "uvm_test_top.env.agent", "vif", apb_if);
end// 在 Agent 中获取接口
class my_agent extends uvm_agent;
virtual apb_if vif;
function void build_phase(uvm_phase phase);
if (!uvm_config_db#(virtual apb_if)::get(this, "", "vif", vif)) begin
`uvm_fatal("CFGERR", "Failed to get vif!")
end
endfunction
endclass
2. 传递配置对象
// 在测试用例中设置配置对象
class my_test extends uvm_test;
my_config cfg;
function void build_phase(uvm_phase phase);
cfg = my_config::type_id::create("cfg");
cfg.mode = FAST_MODE;
uvm_config_db#(my_config)::set(this, "env.agent", "cfg", cfg);
endfunction
endclass// 在 Agent 中获取配置对象
class my_agent extends uvm_agent;
my_config cfg;
function void build_phase(uvm_phase phase);
if (!uvm_config_db#(my_config)::get(this, "", "cfg", cfg)) begin
`uvm_fatal("CFGERR", "Failed to get cfg!")
end
endfunction
endclass
注意事项
-
作用域匹配
-
set()和get()的context和inst_name必须匹配,否则无法获取配置。 -
例如:
set(this, "env.agent", ...)和get(this, "env.agent", ...)。
-
-
通配符的使用
-
使用
*或.*可以简化路径匹配,但要避免过度使用导致配置冲突。
-
-
类型一致性
-
set()和get()的模板参数(如uvm_config_db#(int))必须完全一致。
-
-
时序问题
-
set()应在get()之前执行(通常在build_phase中设置)。
-
相关文章:
基于UVM搭验证环境
基于UVM搭验证环境基本思路: 首先,我们搭建环境时一般都有一个目标的DUT。此时,我们可以结合所要验证的的模块、是否需要VIP、验证侧重点等在典型的UVM验证环境的基础上做适当调整后形成一个大体的环境架构。比如,需要一个ahb_vip…...
【JavaWeb10】服务器渲染技术 --- JSP
文章目录 🌍一. JSP❄️1.JSP介绍❄️2.JSP 运行原理❄️3.page 指令(常用的)❄️ 4.JSP 三种常用脚本1.声明脚本2.表达式脚本3.代码脚本 ❄️5.JSP 内置对象❄️6.JSP 域对象 🌍二. EL❄️1.EL 表达式介绍❄️2.EL 运算操作❄️3.EL 的 11 个隐含对象 &…...
【Hadoop】大数据权限管理工具Ranger2.1.0编译
目录 编辑一、下载 ranger源码并编译 二、报错信息 报错1 报错2 报错3 报错4 一、下载 ranger源码并编译 ranger官网 https://ranger.apache.org/download.html 由于Ranger不提供二进制安装包,故需要maven编译。安装其它依赖: yum install gcc …...
微软AI研究团队推出LLaVA-Rad:轻量级开源基础模型,助力先进临床放射学报告生成
每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…...
06排序 + 查找(D2_查找(D1_基础学习))
目录 温故而知新 -------------------------------- 讲解一:基础理论 一、什么是查找 二、为什么需要查找 -------------------------------- 讲解二:代码学习 一、顺序查找 1. 算法原理 2. 算法步骤 3. Java代码实现 4. 适用场景 5. 知识小…...
网站快速收录的秘诀:关键词布局与优化
本文转自:百万收录网 原文链接:https://www.baiwanshoulu.com/107.html 网站快速收录的秘诀中,关键词布局与优化是至关重要的环节。以下是一些关于关键词布局与优化的建议,旨在帮助网站快速被搜索引擎收录并提高排名:…...
AI大语言模型
一、AIGC和生成式AI的概念 1-1、AIGC Al Generated Content:AI生成内容 1-2、生成式AI:generative ai AIGC是生成式 AI 技术在内容创作领域的具体应用成果。 目前有许多知名的生成式 AI: 文本生成领域 OpenAI GPT 系列百度文心一言阿里通…...
03-DevOps-安装并初始化Gitlab
Gitlab可以理解为是自己搭建的GitHub,也就是自己的代码仓库。 开启macvlan 在192.168.1.10服务器上,构建Macvlan网络,这种网络模式可以为每个容器独立分配ip。 docker network create -d macvlan \--subnet192.168.1.0/24 \--ip-range192.16…...
Mac重复文件,一键查找并清理的工具
不知果粉们,你们有没有过这样的经历:在翻找重要文件时,突然发现一大堆“孪生兄弟”——Mac重复文件?别担心,你不是一个人!今天,我们就来聊聊“Mac重复文件”,以及如何用几招轻松搞…...
Unity Mesh 切割算法详解
Mesh切割是游戏开发中实现物体断裂、破坏效果的核心技术。本教程将深入解析实时Mesh切割的数学原理,并提供完整的Unity实现方案。 一、切割原理分析 1.1 几何基础 切割平面方程:Ax By Cz D 0 顶点分类:每个顶点到平面的距离决定其位置…...
ASUS/华硕天选1 FA506I 原厂Win10 专业版系统 工厂文件 带ASUS Recovery恢复 教程
华硕工厂文件恢复系统 ,安装结束后带隐藏分区,带一键恢复,以及机器所有的驱动和软件。 支持型号:FA506IV FA506II FA506IU FA506IH 系统版本:Windows 10 专业版 文件: ycoemxt.cn/1205.html 文件格式:工…...
【计算机中级职称 信息安全工程师 备考】密码学知识,经典题目
2022年信息安全工程师下午题 题目 密码学技术也可以用于实现隐私保护,利用加密技术阻止非法用户对隐私数据的未授权访问和滥用。若某员工的用户名为“admin”,计划用RSA 对用户名进行加密,假设选取的两个素数 p47,q71,公钥加密指…...
期权帮|初识股指期货:股指期货的交割结算价是怎么来的?
锦鲤三三每日分享期权知识,帮助期权新手及时有效地掌握即市趋势与新资讯! 初识股指期货:股指期货的交割结算价是怎么来的? 股指期货的交割结算价是通过特定时间段内现货指数的算术平均价来确定的。 这一价格作为现金交割的基准…...
伺服使能的含义解析
前言: 大家好,我是上位机马工,硕士毕业4年年入40万,目前在一家自动化公司担任软件经理,从事C#上位机软件开发8年以上!我们在开发C#的运动控制程序的时候,一个必要的步骤就是对伺服上使能&#…...
数据集成实例分享:金蝶云星空对接旺店通实现库存管理自动化
拆卸父项出库:金蝶云星空数据集成到旺店通企业奇门 在现代企业的运营过程中,数据的高效流动和准确处理至关重要。本文将分享一个实际案例,展示如何通过轻易云数据集成平台,将金蝶云星空的数据无缝对接到旺店通企业奇门࿰…...
Android 常用设计模式和实例
一、什么是设计模式? 设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。 毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块…...
模拟(典型算法思想)—— OJ例题算法解析思路
目录 一、1576. 替换所有的问号 - 力扣(LeetCode) 运行代码: 1. 输入和输出 2. 变量初始化 3. 遍历字符串 4. 替换逻辑 5. 返回结果 整体分析 1. 思路总结 2. 为什么要这样设计 3. 时间复杂度与空间复杂度 4. 边界情况 二、495. 提莫攻击 - 力扣(LeetCode) …...
Nginx配置 ngx_http_proxy_connect_module 模块及安装
1、配置完互联网yum源后,安装相关依赖软件包 [root@server soft]# yum install -y patch pcre pcre-devel make gcc gcc-c++ openssl openssh [root@server soft]# yum install openssl* 2、解压缩软件,加载模块 [root@server soft]# ls nginx-1.20.2 nginx-1.20.2.tar.gz …...
项目质量管理体系及保证措施
项目质量管理体系的核心是建立标准化流程、强化全员参与意识、实施动态监控机制。其中,标准化流程是质量管理的基石。例如,某全球500强企业通过引入ISO 9001体系,将项目缺陷率降低了37%。标准化流程不仅能明确各环节的质量要求,还…...
php 实现 deepSeek聊天对话
deepSeek 在 2025年可以说是火热。它可以说是国内版真正义意上的chatgpt。那么,如果我要实现用php 接入 deepSeek 的api呢。其实,方法也很简单。下面的代码我是自己封装过的,大家可以直接拿来使用,记得自己修改下密钥。 function…...
stm32G473的flash模式是单bank还是双bank?
今天突然有人stm32G473的flash模式是单bank还是双bank?由于时间太久,我真忘记了。搜搜发现,还真有人和我一样。见下面的链接:https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...
python/java环境配置
环境变量放一起 python: 1.首先下载Python Python下载地址:Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个,然后自定义,全选 可以把前4个选上 3.环境配置 1)搜高级系统设置 2…...
Docker 运行 Kafka 带 SASL 认证教程
Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明:server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...
STM32F4基本定时器使用和原理详解
STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...
深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南
🚀 C extern 关键字深度解析:跨文件编程的终极指南 📅 更新时间:2025年6月5日 🏷️ 标签:C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言🔥一、extern 是什么?&…...
LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf
FTP 客服管理系统 实现kefu123登录,不允许匿名访问,kefu只能访问/data/kefu目录,不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...
力扣热题100 k个一组反转链表题解
题目: 代码: func reverseKGroup(head *ListNode, k int) *ListNode {cur : headfor i : 0; i < k; i {if cur nil {return head}cur cur.Next}newHead : reverse(head, cur)head.Next reverseKGroup(cur, k)return newHead }func reverse(start, end *ListNode) *ListN…...
C++ 设计模式 《小明的奶茶加料风波》
👨🎓 模式名称:装饰器模式(Decorator Pattern) 👦 小明最近上线了校园奶茶配送功能,业务火爆,大家都在加料: 有的同学要加波霸 🟤,有的要加椰果…...
Ubuntu系统多网卡多相机IP设置方法
目录 1、硬件情况 2、如何设置网卡和相机IP 2.1 万兆网卡连接交换机,交换机再连相机 2.1.1 网卡设置 2.1.2 相机设置 2.3 万兆网卡直连相机 1、硬件情况 2个网卡n个相机 电脑系统信息,系统版本:Ubuntu22.04.5 LTS;内核版本…...
