UVM的phase数据结构

朴素思路

//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抽象
上图是一个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

uvm_phase相关调用图

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值