[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进去),图的每一个节点引用一个实现类对象,节点之间的有向连接表示这些实现类对象被处

本文详细解析了UVM中的PHASE机制,包括UVM_PHASE的不同类型(如UVM_PHASE_IMP、UVM_PHASE_NODE、UVM_PHASE_DOMAIN等),以及其执行流程,如如何通过add方法构建Phase执行图,重点讲解了m_run_phases()方法和execute_phase函数的作用。作者还讨论了phase分类和执行顺序,以及一个潜在的问题——UVM_TASK_PHASE的execute函数调用exec_task任务的合规性。
最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



