uvm存在phase机制,每个phase完成对应的功能。将所有的程序分解在不同的phase中执行,保证了验证环境的验证代码的执行顺序。并且每个phase完成对应的功能,使验证环境运行仿真层次化,让各种组件的例化次序正确,环境的执行顺序正确。
关于uvm phase的介绍分为两个部分:
1)phase的运行机制(也就是张强老师书中介绍部分)
2) 整个环境是如何将所有的phase运行起来的(phase 源码分析)
一、phase的运行机制
uvm phase 分为function phase和task phase。function phase不消耗仿真时间,在仿真时间=0时就开始执行。task phase消耗仿真时间,需要一段时间才能执行完成。在所有phase中只有run_phase和动态运行phase是task,其余为function。
这些phase分别为:
环境中的程序执行顺序是由图上的phase自上而下开始执行 从build_phase ---> connect_phase -----> …… ---->run_phase----->final_phase。最终完成整个环境的执行。只有所有component的build-phase执行完毕后才会执行connect_phase。当然这个build_phase是不消耗仿真时间的。所以看上去build_phase,connect_phase都是在0s进行仿真,但其实是有前后顺序的
build_phase: 实例化组件。自上而下执行。这里指的是对于所有component的build_phase,是从env---->in_agent/out_agent/rm/scb(此处按照实例名的字典序)---->driver/monitor。有一个简单记忆的方法,build_phase是用来建立env树的,树的生长都必须从根长到叶子。
connect_phase :连接各组件;从dut获得虚接口。除了build_phase,都是自下而上的执行。
run_phase:是task,仿真开始给出激励,rm转换,monitor采样,scb比较。所有组件的run_phase都是自下而上的启动,并行执行。
不同层次 | 同一层次 | 叔侄关系 | |
build_phase | 自上而下 | 按照同一层次组件的实例名字典顺序执行 | 深度优先 |
其余function phase | 自下而上 | 按照同一层次组件的实例名字典顺序执行 | 深度优先 |
run_run_phase | 自下而上启动,并行执行 | 按照同一层次组件的实例名字典顺序执行,并行启动 | 深度优先 |
表和文字描述通常比较抽象,举个例子,下面环境的执行
可以看到build_phase的组件执行顺序,其他phase则相反。 不同层次采用自顶向上,同一层次采用实例名的字典序,叔侄关系采用深度优先的原则。
以上是关于phase运行的粗略介绍,
1.2 下面就run_phase和12个动态运行的phase进行介绍
- 它们在所有组件中,自上而下启动,所有组建的每种phase并行执行fork-join_none)
- 两种同步
- 动态运行的12个phase,只有所有组件的这个phase执行完毕才可以执行下一个。
如图,A B在不同的phase中都存在一段空白,但是从系统层面看task phase没有空白。需要等到两个组件对应的phase都执行完成后,完成下一个。
2. run_phase和post_shutdown_phase的同步
同一个组件的run_phase和post_shutdown_phase全部完成后才会进入下一个phase(exact_phase)
这两种同步用这张图可以表示:
二、super.phase的内容
除build_phase外,在写其他phase时,完全可以不加super.xxx_phase (自己定义的类除外)