朴素思路
//pseudocode
task create_and_run_test()
uvm_component uvm_test_top;
uvm_test_top = factory.create(test_name); //pseudocode, need $cast
foreach demo_phase in phase_collection:
foreach demo_component in uvm_test_top:
demo_component.demo_phase() //invoke phase process of component
endtask
PHASE GRAPH
phase有向无环图–介绍
UVM phase机制借助了有向无环图(DAG)来表示用例的执行过程中各个阶段之间的依赖关系。在这个DAG中,每个阶段都被表示为一个节点,节点之间的有向边表示了阶段之间的依赖关系,例如某些阶段必须在其他阶段完成执行之后才能开始。
phase有向无环图–抽象
上图是一个uvm phase DAG图的抽象,横轴是时间维度,代表执行的不同的phase;纵轴是component的维度,代表不同的component。可以看到,phase0阶段,comp1执行最慢,在comp1的phase0执行完后,phase0才算执行完毕,即只有当所有component(comp0/1/2)的phase(x)执行完毕后,phase(x)才算执行完毕。
进入phase1阶段时,所有component的phase0阶段必须全部完成,这种机制便于管理。
就像开发一个项目时,只有芯片中所有的模块100%结项,才能流片。只有手机使用的所有器件100% 完备,手机才能卖给客户。
phase有向无环图–建立
节点和边
在UVM中,每个生命周期阶段都是通过UVM phase类来实现的。UVM phase类提供了一些方法来控制生命周期阶段的执行流程,并且可以与其他生命周期阶段建立依赖关系。这种依赖关系可以使用add_predecessor()和add_successor()方法来建立,这些方法会在phase对象之间添加有向边,从而构成一个DAG。
phase有向无环图–遍历
开始&结束
当测试用例开始执行时,UVM会按照DAG的拓扑顺序逐个执行各个生命周期阶段,并确保所有必要的依赖关系得到满足。如果某个阶段的前置阶段还未完成,则该阶段的执行会被暂停,直至其前置阶段完成执行。在整个执行过程中,UVM会自动跟踪各个生命周期阶段的状态,并在必要时执行回调函数或触发事件,以帮助测试工程师更好地管理测试用例的执行过程。
问题
- build/connect/xxx phase()的函数名不一样,如何归一化?
schedule队列,放了各个phase的单例,(各个phase通过继承已经归一化)。
exec 屏蔽了各个xxx_phase的名字,以此归一化。
为什么main_phase(uvm_phase phase),在接口中需要phase?
参考资料
https://zhuanlan.zhihu.com/p/124910481
https://www.cnblogs.com/jyaray/p/4829050.html
https://zhuanlan.zhihu.com/p/412956948
UVM源码,继承关系,合作关系 展示。
http://www.studio-muzzi.com/project/docs/UVMdocs_smu/uvm-1.1d/classuvm__phase.html