[UVM源代码研究] 如何通俗易懂的理解UVM环境的运行机制

[UVM源代码研究] 我们每天都在用的uvm_tlm_analysis_fifo内部是如何工作的 uvm_tlm_analysis_fifo研究 阅读详情

[UVM源代码研究] 如何通俗易懂的理解UVM环境的运行机制

引言

一直想从宏观一点的角度讲讲UVM环境从启动到运行的完整过程而不必拘泥于一些细枝末节的源代码实现,由于工作上比较忙一直没有静下心来好好研究研究,今天正好有时间决定着手边研究边写,其实一切的动机还是源自于作者本身对于phase机制的一些实现还不甚了解,就比如一些基本概念:

  1. uvm_phase是个什么样的类?为什么我们实际搭建uvm环境的时候很少会用到,但是在实现phase方法的时候又需要传递一个uvm_phase类型的参数?这个参数究竟是做什么用的?

  2. phase机制我们虽然没有实例化uvm_phase实例,但是我们写的那些phase方法分别是在什么时候被调用的,uvm源代码是怎么实现phase机制的调度的?自顶向下、自下向上调用这些phase方法是如何实现的?

本文试图从宏观角度搭配一些简单的代码截图,浅显易懂的将上述几个问题讲述明白,想要具体了解实现机理,可以参考之前写过的一篇关于UVM的PHASE机制的文章:[UVM源代码研究] 浅谈UVM PHASE机制的运行

UVM源代码溯源

我们在 [UVM源代码研究] 当我们在tb里调用run_test()时uvm环境是如何启动的 一文中讲述了UVM验证环境是如何从run_test()任务启动的,其中关于下图1中的m_run_phases()这个任务并没有展开讲解,而UVM中的PHASE机制就是在m_run_phases()中实现的。

图1 src/base/uvm_root.svh中的代码截图

在这里插入图片描述

图1中截图可以看到,整个UVM环境的执行过程都是在m_run_phases()中完成的,run_test()后面做的只是在等待m_phase_all_done的值变为1,然后就是打印结果退出仿真了。而这个变量m_phase_all_done的赋值也是在所有phase的最后一个phase执行完之后赋值的(后面我们分析代码的时候还会讲到)。

m_run_phases()的代码如图2所示。

图2 src/base/uvm_phase.svh中的代码截图

在这里插入图片描述

在 [UVM源代码研究] 浅谈UVM PHASE机制的运行 一文中我们已经对get_common_domain有过具体的分析这里就不在赘述,m_run_phases()这个任务可以理解为将common_domain(这里简化问题起见,不考虑用户自定义的uvm_phase_domain)里添加的所有phase节点按照顺序分别调用他们的execute_phase()任务,由于使用的是fork … join_none,这些所有的phase节点的execute_phase()任务都会在同一时间被执行,但是execute_phase()中加了相关的控制,必须是common_domain中的所有phase节点组成的有向无环图中的前一个phase节点执行完才会执行后一个节点的excute_phase()中的内容,如图3所示,这样就实现了phase机制中的phase必须按照一定的顺序执行这一特点。

图3 src/base/uvm_phase.svh中的代码截图

在这里插入图片描述

等到前序节点都执行完就开始后续节点的执行,如图4所示。

图4 src/base/uvm_phase.svh中的代码截图

在这里插入图片描述

1147行的m_imp指向的是第一个phase节点即uvm_build_phase的单例,调用其中的traverse函数,由于uvm_build_phase是从uvm_topdown_phase继承而来,先执行其中的build_phase()函数才执行其children中的build_phase,而他的children是在其build_phase()函数中才会被创建的,这就是为什么uvm_build_phase必须是一个uvm_topdown_phase,否则连children都没有创建该如何去遍历traverse()其中的build_phase()函数。关于这个traverse()任务在uvm_phase类中并没有具体实现,在uvm_phase的子类(uvm_topdown_phase,uvm_bottomup_phase,uvm_task_phase等等)中才分别有具体的实现,如图5所示。

图5 src/base/uvm_topdown_phase.svh中的代码截图

在这里插入图片描述

traverse()中的核心函数是execute,execute中又会根据具体的phase类型调用对应的phase方法,相关代码截图如图6、图7所示。

图6 src/base/uvm_topdown_phase.svh中的代码截图

在这里插入图片描述

图7 src/base/uvm_common_phase.svh中的代码截图

在这里插入图片描述

至于其他phase节点的执行过程类似于uvm_build_phase类的分析方法,区别无非就是先执行父节点的phase方法还是先遍历执行子类的phase方法。

分析到这里,我们发现将phase机制跟最终执行的某个uvm_component中的phase方法关联起来的UVM源代码方法执行路径是:

run_test() -> m_run_phases() -> execute_phase() -> traverse() -> execute() -> execute_func(comp, phase)/execute_task(comp, phase)

最后我们再看下前文讲run_test()提到的m_phase_all_done变量是在哪里赋值的,如图8所示,即执行到最后一个phase节点(m_successor.size() == 0表明这是最后一个节点)的execute_phase()结束的时候赋值。

图8 src/base/uvm_phase.svh中的代码截图

在这里插入图片描述

总结

本文从run_test()任务作为切入点,循着m_run_phase()执行的轨迹找到了我们在各个uvm_component中定义的phase方法是如何被调用执行的,回答了引言中提出的几个问题,从宏观上更好地理解了PHASE机制运行的原理。

最后附一张UVM中的phase类的继承关系以及相应的方法调用关系图。
在这里插入图片描述

[UVM源代码研究] 谈谈寄存器模型中predict 谈谈寄存器模型中predict 阅读详情

相关推荐

[UVM源代码研究] 当我们在tb里调用run_test()时uvm环境是如何启动的

这个run_test()根源调用的还是uvm_root里定义的run_test()我们稍后再去分析,等于说uvm_globals将uvm_root里定义的run_test()通过单例模式获取uvm_root的唯一实例并将其封装成了一个全局可见的任务run_test(),那我们不禁要问:这个uvm_globals文件是如何实现里面的内容全局可见的呢?387-391就是在判断run_test()是否被调用过,调用过就会将uvm_test_top作为uvm_root的child存入到m_chilldren中。

sunstat的博客 1167

UVM极简教程

UVM(universal verification method)作为通用验证方法学,解决了什么问题? 验证平台的规范化 验证环境包括激励输入和输出数据的比对。UVM将激励、比对、reference model分别实现为不同的类。在子IP验证环境中使用的组件,可以在IP验证环境中复用。 对System Verilog的封装 System Verilog引入了类似C++,java的语法,可以实...

Keep Fighting! 2万+

基于python的uvm仿真脚本

声明:本文中的大多数代码都来源于 张强 编著的 《UVM实战》,这本书是初入职场时导师买的一本书,也引导我走上了验证工程师之路,在这里向作者表示感谢,也谢谢我的导师。作者书中提供了源代码的下载地址:http://www.hzcourse.com/web/refbook/detail/5651/229, 首先演示一个比较简单的例子:本文的仿真软件为vcs,在linux系统上运行 环境的结构如下: Dut里包含一个dut.sv,具体内容如下: Filelist里包含一个dut_sim.f, 内容如下: 1:

是木子啊~的博客 4748

[UVM源代码研究] 浅谈UVM PHASE机制的运行

浅谈UVM PHASE机制的运行

sunstat的博客 1607

UVM(二)MacOS+VCS 快速构建UVM验证环境:Hello World实战

本文详细介绍了如何在macOS系统上使用VCS快速搭建并运行首个UVM验证环境。从环境变量配置、License设置到编写Hello World测试用例,通过实战代码和Makefile脚本,手把手指导用户完成编译与仿真,成功打印出“Hello UVM”信息,为后续构建复杂验证平台奠定基础。

weixin_27791839的博客 521

[UVM源代码研究] 解密uvm_tlm_analysis_fifo:为何它既是uvm_component又无需phase机制(uvm-1.2版)

本文深入剖析了UVM-1.2中uvm_tlm_analysis_fifo的设计原理。它继承自uvm_component以获得TLM通信资格,但无需参与phase机制,因其作为通用数据缓冲器,功能固定且无需工厂注册。文章通过源代码解读,解释了其直接使用new创建、parent参数可省略的原因,并探讨了其在验证环境中解耦组件通信的实用价值。

weixin_29201933的博客 206

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

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

gitblog_06712的博客 971

UVM Class Reference: 深入理解UVM类参考手册

UVM提供了一套强大的类库,用于构建可重用、可扩展和可维护的验证环境。本文将深入探讨UVM类参考手册,介绍其中一些重要的类和其用法,并提供相应的源代码示例。它继承自uvm_object,并添加了一些用于管理组件生命周期的方法,如build、connect和end_of_elaboration。uvm_object是UVM类体系结构的基础类,所有UVM类都直接或间接地继承自uvm_object。通过深入理解UVM类参考手册中的这些重要类,我们可以更好地利用UVM的强大功能来构建高效、可靠的硬件验证环境。

DlqCoder的博客 491

《UVM实战》,一个简单实例的源代码理解

uvm树形结构图 uvm验证平台 uvm启动过程 源代码理解top_tbvuvm树形结构图uvm验证平台uvm启动过程源代码理解:top_tb.v`timescale 1ns/1ps/* * 1. uvm package. include all uvm classes and macros. * 2. uvm systemverilog 固定写法。 */ `include "uvm_macr

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

UVM1.1应用指南及源代码分析(注释)

本章第一节将大体介绍一下感性意义上的 UVM,这里不会讲的很详细,因为关 于 UVM 的历史在网上已经有太多的资料。 第二节讲述验证平台的组成,这里也只是介绍一个轮廓。 第三节开始则会教我们一步一步搭建一个UVM验证平台。或许有人会说这种方 式会不会是太激进了,毕竟前一节还在教大家什么是UVM,后一节就开始尝试着一 个能够运行起来的UVM验证平台。我自己最开始学习UVM是从ovm cookbook 1 在传统的程序语言的教材中,第一章要讲述的肯定是 hello world 程序。因为 hello world 可以让开发让人员第一次真真切切的感受到自己的存在,当看到电脑按照自己 的要求输出了东西的时候,那种喜悦感与成就感是无与伦比的。 开始 的,那个时候,当我把那本书看完的时候,都没有搞明白一个正常的testbench应该 怎么写法。其各章节之间各自为政,同时到最后也没有一章完整的把所讲述的东西 给整合起来。这种感觉让我在最开始学习的时候感觉相当的难受。基于这一点,本 书采取与ovm cookbook完全相反的策略,最开始的时候就给出一验证平台,之后的 章节详细讲解验证平台的各个部分。读者可以与ovm cookbook对照着来看。

UVM 1.2源码包-建议从官网下载不要钱

UVM Class Library Code for Release 1.2 UVM 1.2最新版本2014年6月release

【免费下载】 UVM标准库源代码及用户指南资源

本仓库提供了统一验证方法论(Universal Verification Methodology, UVM)的多个关键版本的源代码压缩包。UVM是一种用于电子设计验证的高级验证方法学,由Accellera Systems Initiative开发并标准化,极大地促进了芯片验证的效率和重用性。这里集结了从UVM-1.0到UVM-1.2的全面版本,适合硬件验证工程师进行学习、研究和应用。 ## 包含

gitblog_09783的博客 1028

Windows下用Docker部署RagFlow的5个常见错误及解决方法(附详细日志分析)

本文针对Windows系统下使用Docker部署RagFlow的常见难题,提供了详细的避坑指南。文章深度剖析了WSL2配置、端口冲突、文件权限、资源限制及网络通信这五个典型错误场景,并结合具体日志分析,给出了经过验证的解决方案,帮助开发者高效完成部署。

weixin_29233857的博客 178

【亲测免费】 UVM实战代码例子

UVM实战代码例子 【下载地址】UVM实战代码例子 本仓库提供了《UVM实战》一书中使用的源代码示例。《UVM实战》是国内目前唯一一本用研究的眼光解读如何基于UVM搭建验证平台的著作。作者历时3年钻研UVM源代码和使用UVM经验的系统总结。实例丰富,步步清晰地引导读者掌握UVM的精髓和实用技巧。本书脱胎于网络上广为流传的...

gitblog_09818的博客 1117

泛微ecology9二次开发-附件上传接口实战:从表单创建到数据库存储解析

本文详细解析了泛微ecology9二次开发中的附件上传接口实战,从测试环境搭建、数据库表结构解析到接口代码实现,提供了全面的开发指南。重点介绍了文件上传的核心逻辑、常见问题排查及高级应用场景,帮助开发者高效实现附件上传功能并优化系统性能。

weixin_30836759的博客 477

电力系统实时仿真技术:从硬件在环到主流平台实践

实时仿真是一种基于高性能计算硬件,在严格时间约束下模拟物理系统动态行为的关键技术。其核心原理在于通过硬实时计算,确保仿真步长内的模型求解与输出时间严格同步,从而构建高保真的虚拟测试环境。这项技术的核心价值在于为电力电子、新能源并网等复杂系统的研发提供了无风险的“数字沙盘”,能够安全地验证控制器逻辑、保护装置动作及系统稳定性。在工程实践中,硬件在环测试通过连接虚拟模型与真实硬件,形成了控制器硬件在环和功率硬件在环两大主流应用场景,广泛应用于设备研发、电网安全分析和人员培训。本文聚焦于电力系统领域,深入解析了实

weixin_30952479的博客 420

[UVM源代码研究] 解密寄存器模型后门访问的DPI实现机制

本文深入剖析了UVM寄存器模型中后门访问的DPI实现机制。通过追踪源代码,详细解读了从寄存器读写调用到DPI-C函数执行的全流程,包括路径管理、uvm_reg_backdoor基类作用以及如何通过DPI桥接直接访问硬件信号。文章还提供了后门访问的常见问题排查与实战指南,帮助验证工程师深入理解并高效使用这一关键功能。

sun99的博客 565

从AMBA到USB:手把手教你评估和选择Synopsys DesignWare里的免费商用IP

本文详细介绍了如何评估和选择Synopsys DesignWare中的免费商用IP,从AMBA到USB等关键模块。通过技术参数核对、验证环境评估和集成注意事项,帮助工程师高效利用这些经过硅验证的商业级IP,提升SoC设计效率。文章还探讨了免费IP与付费IP的边界策略,避免常见陷阱。

weixin_42683394的博客 293

UVM实战代码示例:掌握验证平台的利器

UVM实战代码示例:掌握验证平台的利器 【下载地址】UVM实战代码例子 本仓库提供了《UVM实战》一书中使用的源代码示例。《UVM实战》是国内目前唯一一本用研究的眼光解读如何基于UVM搭建验证平台的著作。作者历时3年钻研UVM源代码和使用UVM经验的系统总结。实例丰富,步步清晰地引导读者掌握UVM的精髓和实用技巧。本书脱...

gitblog_09705的博客 1237

国产FPGA高云GW1NSR-4C,集成ARM Cortex-M3硬核

从板子整体角度来看,这是一款国产化程度很高的板子,从主控FPGA,到JTAG芯片,存储芯片、电源芯片等,都是使用的国产半导体公司的产品。板子整体尺寸也比较迷你,属于小而美类型的,可以认为是一款FPGA核心板,当然也预留了排针接口,给用户足够的扩展空间。对于想了解高云小蜜蜂SoC软硬件开发,以及对云源软件、MCU开发环境做个深度评测来说足够了。JTAG调试器固件可以增加虚拟串口功能,对于板子本来来说面积不会有改动,只需要添加两根信号线即可。

whik1194的博客 6393

华为od 面试八股文_Android安卓_05_含答案

华为od 面试八股文_Android安卓_05_含答案

MISAYAONE的博客 948
上一篇: [UVM源代码研究] UVM中在使用field_automation时如果加入了条件控制时无法正常使用copy/clone
下一篇: [UVM源代码研究] 聊聊寄存器模型的后门访问
数字验证Kane陈
博客等级 码龄12年 662粉丝 48原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值