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

UVM-phase机制 文章目录1.UVM Phase2.phase的执行3.仿真开始4.仿真结束4.1 objection机制 1.UVM Phase uvm利用phase机制实现了各个组件之间的同步。因为每个组件都包括一些预定义的同名phase,在没有执行完所有组件的当前phase之前绝对不会去执行所有组件的下一个phase。 phase机制存在的意义: 传统的硬件设计模型在仿真开始之前就已经完成了例化和连接,而SV的软件部分对象例化则在仿真开始之后执行 只通过new()函数对对象例化,无法解决一个重要问题,就是验证环境在实 阅读详情

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

PHASE机制作为UVM最为强大的功能之一,本人的理解可能只有冰山一角,今天也只敢抱着边学习边写便理解的态度来研究研究其内部实现,所以这里只敢用“浅谈”一词,可能还存在很多理解不到位或者“标为超纲”的内容。

开始分析之前我们先看一些PHASE相关的基本概念(全局类型)phase可以分为以下几种类型
在这里插入图片描述

  • UVM_PHASE_IMP:下图中所有phase都属于Phase实现类,这些phase只拥有单一对象,且都会实现exec_func或exec_task的方法用来调用用户定义在环境组件(uvm_component)中的各种xxxx_phase函数或者任务。它的含义就是说它所代表的就是具体干什么活,UVM_PHASE_NODE就是会指向某一个具体的UVM_PHASE_IMP。
    在这里插入图片描述

  • UVM_PHASE_DOMAIN:Phase域的概念比较抽象,它用来表示整个由节点(node)构成的有向无环图(graph)。如果有一组环境组件属于某个Phase域,那么这些组件中定义的各个phase函数/任务的执行就会遵循其所属Phase域的图。它的含义是从我开始,到后面的某个节点为止,这期间经过的所有节点都是我的管辖范围。

  • UVM_PHASE_SCHEDULE:Schedule对象包含了一组节点,以及这些节点的连接关系,所以它也可以看成是Phase域的子集。Schedule对象通过这些节点和连接关系来表征Phase的执行顺序。它的含义和UVM_PHASE_DOMAIN相同,唯一的区别就是它不具有独立行动的权利,它的外面至少需要套一层UVM_PHASE_DOMAIN;形象点说,UVM_PHASE_DOMAIN可以代表整个图形结构或者代表某个子图结构,但是,UVM_PHASE_SCHEDULE则只能代表某个子图结构,它必须属于某个DOMAIN,也就是它必须被某个DOMAIN wrap起来!例如我们源代码中run_time phase相关的12个节点就被调用add_uvm_phases()添加到了m_uvm_schedule中,然后m_uvm_schedule又被添加到了m_uvm_domain中,m_uvm_domain又被添加到了m_common_domain中。

  • UVM_PHASE_NODE:Node节点对象跟实现类比较容易混淆。节点是用来构成有向无环图的基本元素。节点对象包含一个重要的成员变量m_imp,该成员变量引用某一个实现类对象(IMP object)。也就是说,如果你有多个Phase域,那么在每个Phase域中都可以存在指向同一个实现类对象的节点。它的含义是图形结构中的某一个节点,它是一个句柄,它自己不干具体的活(比如main phase具体要干什么)。

  • UVM_PHASE_TERMINAL:这是一个比较特殊的类别,专门用来表示图中最末尾的节点,它没有什么其他大的作用。在代码实现上,在构造有向无环图的过程中,可以通过识别该节点来插入前序需要执行的节点。它是用来标定UVM_PHASE_DOMAIN和UVM_PHASE_SCHEDULE的势力范围的!就是说我后面的节点就不是你们的管辖范围了,只有一个domain或者schedule才有这个东西。

UVM_PHASE_NODE和UVM_PHASE_IMP的关系如果不好理解的话,你可以对照TLM中的port、export、和imp来理解,这样就容易些了;像port、export只负责传话或者发号施令,而imp才比较苦逼,是真正干活的。

将上面的这些概念跟Phase机制串起来:UVM中Phase机制的执行遵循一张图。这里的“图”,就是图论中的有向无环图,有节点有连接有方向。每一个Phase域拥有一张图(图中的节点需要add进去),图的每一个节点引用一个实现类对象,节点之间的有向连接表示这些实现类对象被处理的顺序。这里的“处理”指的是完成一轮Phase状态的跳转,在不同Phase状态下调用该节点m_imp引用的实现类对象中对应的函数。参与仿真的环境组件都会属于某一个Phase域,默认的Phase域为common_domain,其中的节点会在调用get_common_domain的时候自动添加。

Domian节点图的构造 通过uvm_phase::add方法来构造用于指导phase执行的有向无环图。
在这里插入图片描述

这里有必要对singleton(单例)做一下解释,这是设计模式的常用方法,我们在UVM种经常使用,例如uvm_root、uvm_factory,单例模式的使用特点就是定义的类都会提供一个get方法来获取类的实例,并且是唯一实例,如下图所示。
在这里插入图片描述
在这里插入图片描述

uvm_root的单例模式
在这里插入图片描述
在这里插入图片描述

uvm_factory的单例模式
使用单例模式的类一般不需要实例化,它只是提供了一些需要全局使用的方法、字段等等。这样我们就清楚了uvm_phase继承出来的UVM_PHASE_IMP类型的这些phase(uvm_build_phase等等)都是单例模式的应用。
在这里插入图片描述

接着我们从之前研究run_test()时uvm_phase里的m_run_phases()这个静态方法作为phase机制运行的入口开始说起。

该静态方法在uvm_phase里的定义如下
在这里插入图片描述

m_run_phases()主要干这么两件事情:

  1. 创建UVM默认的所有phases,即我们熟知的build phase、connect phase、run phase、main phase等等,并将其组织成我们前面会提到的有向无环图结构;实现这一步主要是靠调用uvm_domain中的get_common_domain

  2. 开始运行1中创建组织好的phases,当然如果有用户自定义的phase,也会在规定的点运行起来;实现这一步主要是靠调用对应的phase的execute_phase方法和一个无限循环的监控进程

uvm_domain的定义如下图所示
在这里插入图片描述

首先我们注意到uvm_domain是从uvm_phase继承而来的。这里对uvm_domain的理解可以认为是用来隔离不同的uvm_component在run-time phase的phase域(很多文章用的是时钟域,个人觉得这里用phase域更为准确,即统一domain的run-time phase是同步的),而run_phase和各个function phase在不同的uvm_component始终是保持同步的。如下图所示两个不同的domain中的driver的run-time phase是可以不同步的。
在这里插入图片描述

而我们看到uvm_domain里充斥了大量的static变量和方法,目的是为了存放全局性的domain信息,这样全局都可以通过uvm_domain类来直接获取这些static信息。

下面看看get_common_domain里都在做些什么
在这里插入图片描述

关于common_domain,指的是除run-time phases之外的phase域,根据我们上面的分析,这部分phase在所有的domain里都是同步执行的。

uvm_domain中的get_common_domain主要是干这么三件事情:

  1. 创建我上述phase有向图结构的第一部分,即
    build->connect->end_of_elaboration->start_of_simulation->run->extract->check->report->final。
    很自然的实现这个功能需要用到两个函数:创建它们用new函数,组织它们让它们有如此先后顺序用add函数

  2. 创建我上述phase有向图结构的第二部分,即
    pre_reset->reset->post_reset->pre_configure->configure->post_configure->pre_main->main->post_main->pre_shutdown->shutdown->post_shutdown。
    很自然的实现这个功能需也要用到两个函数:创建它们用new函数,组织它们让它们有如此先后顺序用add函数

  3. 正如phase有向图结构所示,(2)搞出来的东西是作为一个子图呈现在(1)所搞出来的结构中的;那么怎嘛让(2)搞出来的东西就成了(1)所搞出来的东西的一部分了呢?而且还要和run phase并行的运行呢?还是要靠这个add函数!只不过需要用到add函数形参表中一个叫做with_phase的东西,显而易见,这个定义在uvm phase class中的add函数真是无比的重要,正式它让我们可以根据需要把一个个phase节点组织成一个任意的被UVM 规则所允许的图形结构

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

以上的add函数可以理解为把相应的phase节点添加到common_domain中,随后再对uvm_domain中的一些static变量做了赋值方便全局引用,用到了find等方法以及其他一些变量如下图所示
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

以上内容完成了对common_domain的创建,接着继续回到m_run_phases()里看后续执行内容。

这里的m_phase_hopper是一个mailbox,定义如下
在这里插入图片描述

1848行将common_domain添加到该mailbox中随后1856行执行commain_domain里添加的各个phase节点。,这里用的是fork…joine,如果有自定的domain此时也可以同步进行。

关于这个excute_phase就是phase机制运行的核心代码,phase的execute_phase函数主要干哪些事情呢?

简单点说就是按照phase的有向图结构一个一个节点的走下去,直到结束;它会调用每个节点所拥有的traverse函数!正是通过这个函数,我们在各个phase中所写的自己的代码才得意被调用、执行!traverse函数主要干的事情就是根据每个节点的属性来调用我们自己重载的各个phase方法。主要是两个函数一个是exec_func(uvm_component comp, uvm_phase phase),

一个是exec_task(uvm_component comp, uvm_phase phase)。

很自然的我们想到,执行build phase这种function性质的就会调用exec_func,执行如main phase这种task性质的就会调用exec_task,没错,的确如此!这两个方法的形参列表里的comp对应该方法所被调用的uvm_component实参,phase对应phase运行阶段的UVM_PHASE_IMP(如uvm_build_phase对应的单例等)。

这里需要介绍下phase各个状态的跳转顺序,涉及到uvm_state的枚举类型
在这里插入图片描述
在这里插入图片描述

各个phase_state的跳转描述如下图所示
在这里插入图片描述

上面简单介绍了phase机制的运行过程,下面再介绍下phase的分类。

uvm_phase衍生的phase分成了三大类:uvm_topdown_phase、uvm_bottomup_phase和uvm_task_phase。

uvm_topdown_phase作为所有需要自顶向下执行的phase的父类,例如uvm_build_phase,uvm_final_phase。
在这里插入图片描述
在这里插入图片描述

uvm_bottomup_phase作为所有需要自下而上执行的phase的父类,包括所有除uvm_build_phase和uvm_final_phase之外的所有的function phase,如uvm_connect_phase等。
在这里插入图片描述
在这里插入图片描述

uvm_task_phase顾名思义是task相关的phase的父类,包括uvm_run_phase以及12个分解的runtime_phase
在这里插入图片描述
在这里插入图片描述

仔细看下源代码可以发现,以上几个父类的核心函数在于traverse方法,它递归调用UVM树形结构上每个组件的traverse方法。

uvm_topdown_phase跟uvm_bottomup_phase的区别在于traverse childen放在execute前执行还是后执行,先traverse的话那就是先执行children里的execute再执行自己的execute,对应的就是bottomup,反之则是topdown,如下图所示

在这里插入图片描述
在这里插入图片描述

这就是我们在学习function phase时所谓phase执行顺序的同一层次按照字母顺序、不同层次深度优先执行的具体实现原理,具体的一个例子见下图
在这里插入图片描述

这里还发现UVM源代码里其实是有问题的,就是uvm_task_phase的execute这么个function调用了exec_task这样一个task,虽然说execute里用了fork…join_none来保证不消耗时间,但是我记得systemverilog语法有规定function是不能调用task的,这里提出一个小小的疑问。
在这里插入图片描述
在这里插入图片描述

以上就是关于uvm_phase源代码的一些个人理解与解读,有些函数、类的解读只是蜻蜓点水不仅详细,有些执行过程也没有具体深究,花了两天左右的时间研究还只是分析了冰山一角,后面有深入理解后继续补充,讲的有问题的也欢迎评论区留言指正。

【小白】UVM入门——phase机制 SV的验证环境构建中,发现传统的硬件设计模型在仿真开始前,已经完成例化和连接了,而SV的软件部分对象例化则需要在仿真开始后执行。构建new()函数可以实现对象例化,但是仅仅通过new()函数如何保证例化的先后顺序,以及各个组件在例化后的连接?在顶层到底层的配置时,SV也无法在底层组件例化之前完成对底层的配置逻辑;因此,引入phase机制。各个phase的先后执行顺序;处于同一phase中的层次化组件之间的phase也有先后关系;在不同时间做不同的事情,这就是UVM中phase的设计哲学。 阅读详情

相关推荐

[UVM源代码研究] 聊聊UVM中的callback机制

本文通过一个具体的例子引出对UVM源代码中callback的实现机制进行了粗浅的分析,虽说不能让大家看完后对UVM中的callback机制有醍醐灌顶的感觉,但相信同学们看完在后面使用uvm_callback的时候应该会有一个更为立体的理解。

sunstat的博客 1944

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

如何通俗易懂的理解UVM环境的运行机制

sunstat的博客 1489

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

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

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

UVM Phase

UVM Phases 所有testbench的组件都是继承uvm_component来的,每一个组件都包括一些预定义的同名phase,在没有执行完所有组件的当前phase之前绝对不会去执行所有组件的下一个phase,这就保证了所有组件之间是同步的!UVM就是利用phase机制实现了各个组件之间的同步! 因为所有的phase都被定义为回调(callback)方法,因此各个组件可以自动执行回调p...

bleauchat的博客 7915

[UVM源代码研究] 聊聊uvm_sequence中常用的宏以及方法

聊聊uvm_sequence中常用的宏以及方法

sunstat的博客 2237

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

聊聊uvm_tlm_analysis_fifo这个特殊的uvm_component

sunstat的博客 2565

芯片验证 | UVM的phase机制

如base_test类,且在其某个phase,如connect_phase中定义了一些重要内容,那么在具体测试用例的connect_phase中就不应该省略super.connect_phase。

叫好与叫座虽然不是对立面,但想在同一个作品中达到双重效果很难。 1万+

[UVM源代码研究] UVM report机制分析(uvm-1.2版)

UVM report机制分析

sunstat的博客 1930

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

关于default_sequence和p_sequencer的一点思考

sunstat的博客 2130

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

谈谈寄存器模型中predict

sunstat的博客 3773

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

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

sunstat的博客 1743

[UVM源代码研究] 如何控制UVM环境所有phase都执行完后仿真不立即结束(uvm-1.2版)

如何控制UVM环境所有phase都执行完后仿真不立即结束

sunstat的博客 1557

UVM仿真的启动(三)—— execute_phase()

execute_phase的详细内容,根据图结构中的phase顺序执行,phase node的状态跟随特定事件进行变更,并执行相应的内容。比如,执行某个节点的imp对应的父类的traverse方法,调用其中execute,再执行imp的exec_func。traverse中递归component中分为topdown,bottomup两种形式,task的execute是通过fork join_none进行,所以执行run_phase的component不分先后。

Future Chaser的博客 455

UVM phase的用法研究

立志爱上科研 Smart is the new Sexy UVM phase的用法研究【zz】 原文地址:http://bbs.eetop.cn/viewthread.php?tid=383872&extra=&authorid=828160&page=1 我相信很多朋友都在坛子里下载过一份《UVM1.1应用指南和源代码分析》的资料,我很佩服这位前辈,我也从中收益...

crazybird1984的专栏 1430

行为验证码 AJ-Captcha 使用文档

AJ-Captcha验证码系统集成指南:需添加captcha-spring-boot-starter和Redis依赖,配置Redis连接。核心实现包括Redis缓存服务类CaptchaCacheRedisImpl(含设置、查询、删除验证码等方法)、SPI配置文件及Spring Boot配置类(配置验证码属性和Redis模板)。系统支持验证码生成、校验、防刷等安全功能,适用于Web应用安全验证场景。

千层冷面的博客 2112

铭飞MCMS源码部署

文章目录前言一、下载铭飞源码二、部署源码1.使用IDEA打开源码2.配置tomcat环境2.1下载tomcat并测试是否可以成功启动(此处不赘述)2.2在IDEA中安装tomcat环境并配置3.添加数据库,并配置3.1新建数据库3.2 导入sql配置三、启动测试 前言 铭飞MCMS基于IDEA、tomcat和mysql的环境搭建。 提示:以下是本篇文章正文内容,下面案例可供参考 一、下载铭飞源码 gitee:https://gitee.com/mingSoft/MCMS/releases(各种版本按需下

MARS_ZORO的博客 4064

uvm_phase的运行机制

uvm_phase的运行机制可以保证在执行的时候不发生执行顺序的错误,保证程序按照正确的执行顺序运行

lavah的博客 1253

物理机centos7系统重启后直接进入dracut

Warning: /dev/centos/root does not exist Warning: /dev/mapper/centos-root does not exist 在shell命令行执行以下: dracut:/# lvm vgscan dracut:/# lvm vgchange -ay dracut:/# exit 之后可以正常进入系统(测试正常)。 但是重启之后依然会进入dracut模式,永久解决如下: 查看kernel文件 [root@ecs ~]# ls -ltrh /boot

魏志标的博客 1万+

UVM面试题1-36

1、什么是UVM?它的优势是什么? **UVM(Universal Verification Methodology)**是一个标准化的用于验证设计的方法学。其优势包括: 重用性、VIP即插即用、通用性、独立于仿真器、支持CDV(coverage driven verification)、支持CRV(constraint random verification)等等 2、uvm_component和uvm_object有什么区别? **uvm_component:**在build_phase之后就一直存在于

weixin_44582960的博客 6596

Haystack框架实战:从零构建企业级智能问答系统

自然语言处理(NLP)技术通过让计算机理解和生成人类语言,正在深刻改变信息检索与交互方式。其核心原理在于将文本转化为机器可处理的向量表示,并通过语义相似度计算实现精准匹配。这一技术价值在于能够从海量非结构化数据中快速提取精准信息,大幅提升知识获取效率。在工程实践中,检索增强生成(RAG)架构结合了密集向量检索与大语言模型生成能力,成为构建智能问答、知识库助手等应用的主流方案。该架构通过将用户查询与文档库进行语义匹配,并为大语言模型提供精准上下文,有效提升了回答的准确性与可追溯性。本文以Haystack这一生

weixin_42521032的博客 577

ARM和FPGA之间的通信(硬件原理图篇)

设计该开发板的初衷是为了学习,但也希望今后能扩展其功能,看到大家都在diy示波器,自己也非常冲动的想DIY一把,于是呼选了arm+fpga的方案,fpga主要用来实现数据的高速采样,而ARM则提供数据的显示,以及一些人机交互的功能。那么该方案中最重要的地方就是ARM和FPGA之间的通信如何实现了。在网上查了很多的资料,有说将FPGA作为ARM的一个外设,可以通过DMA的方式来直接访问;也有说把FP

屌yy的博客 5万+

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

聊聊uvm_component与uvm_root(uvm-1.2版)

sunstat的博客 1514

迈创cameralink采集卡安装操作说明

迈创cameralink采集卡安装操作说明MIL软件安装MIL软件下载获取MIL软件安装MIL软件安装常见问题 MIL软件安装 MIL软件下载获取 MIL软件安装 解压MIL安装包,点击MilSetup.exe开始安装,如下图所示; 备注:64位系统MIL软件可以同时安装32位和64位客户端,本文档默认安装64位客户端,64位系统安装32位MIL方法后续再展开讲(不建议这样用,很麻烦) 点击Launch Installation开始安装,64位系统,默认只安装64位MIL客户端 根据采集卡驱动,选择M

qq_23107577的博客 9350
上一篇: [UVM源代码研究] 当我们调用uvm_config_db里的函数时uvm内部都是怎么工作的
下一篇: [UVM源代码研究] 谈谈uvm中的浅拷贝(shallow copy)与深拷贝(deep copy)
数字验证Kane陈
博客等级 码龄12年 662粉丝 48原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值