目录
1.run_time phase和run_phase的objection
3.phase的参数列表中(uvm_phase phase)的作用
5.1 phase机制
1.两种执行顺序和两种类型phase
1.两种执行顺序
①不同phase的执行顺序
②归属不同compoent相同phase的执行顺序
2.两种类型phase
①不消耗仿真时间phase:function phase
②消耗仿真时间phase:task phase,task phase又分为run_phase和run_time phase
2.phase的执行顺序(phase核心意义:层次化顺序)
建议理解此处时结合实际的情景,否则容易被绕晕
1.同一compoent不同phase的执行顺序
1.整体function phase+task phase,自上而下
eg.图5-1左侧整体自上而下
2.单独task phase中,run_phase和run_time phase并行(两者全部完成才退出task phase,重新进入function phase),12个run_time phase顺序运行
eg.结合图5-4来看,run_phase和run_time phase会同时启动且并行,两者需要全部执行完.而run_time phase内部12个是顺序运行
2.归属不同compoent相同phase的执行顺序
1.依UVM树parent/child从上到下顺序联系起来的不同comp:
①function phase
a.build_phase--->自上而下依次执行
eg.先build agent 再 build driver
b.其余phase(例如connect_phase)--->自下而上
eg.先连接 driver 再 连接 agent
②task phase
自下而上启动,同步执行
eg.agent和driver自上而下启动run_phase,但是同步执行
2.在UVM树中同层次的不同comp
①function phase
按实例化指定name的字典顺序>深度优先
eg.两个driver实例化是分别命名为a_drv和b_drv,a_drv先于b_drv执行
执行完agent,先执行agent中的drv还是执行和agent同层的scb? 执行drv
②task phase
同步执行
eg.两个driver某一个phase两者都执行完才会去下一个phase,图5-4执行完一层去下一层
3.super.phase有什么作用?
其实就是继承在uvm_compoent中已经定义好的变量/方法,作者建议有的可以写有的可不写,但是我个人建议写上去,以免后续uvm库有更新,自己还要更改代码风格.
4.phase机制的意义
自动生成安全的层次化
建议5.1.8和2.3.4一起加深理解
5.2 objection机制
1.run_time phase和run_phase的objection
1.只要有一个comp中的run_time phase已经raise objection,其余comp就运行
2.run_phase只要run_time phase raise objection,就会运行
2.图5-4的大楼在讲什么?
本质讲的就是5.1中1和2以及5,2中的1.
1.run_phase和run_time phase并行
2.某一phase只需要拥有该phase的某一com raise objection便会运行,反之不会运行
3.run_phase可依靠run_time phase的objection运行,且先run_time phase后run_phase
3.phase的参数列表中(uvm_phase phase)的作用
参考我之前写的blogUVM phase机制中各个phase function/task 的参数列表(uvm_phase phase)怎么理解?_IC-V的博客-CSDN博客
4.objection放在哪里?
objection放在哪里也就意味着哪里控制着整个UVM平台的运行(可以再结合大楼理解一下).
1.scoreboard(需要改造无线循环,mon和drv便是因此而不发起objection)
2.在sequence中(详见2.4.3中代码2-73),利用uvm_sequence中的staring_phase.
提升一下,放在sequence中,也就意味着sequence和objection紧密连接在一起,类似意思作者在2.4.3引入default_sequence后也提及过.这里体现了UVM的设计哲学,作为验证平台数据流发生器sequence,sequence的启动与结束,也就代表了验证平台运行的启动与结束.
5.set_drain_time的引入
上一个问题已经决定由sequence和objection的联动来决定UVM平台phase的运行,但是从seq到sqr再到drv驱动至dut,同时其余comp也捕捉数据,这中间存在时间差.如果seq产生完数据直接drop,进入下一个phase,有可能其余comp该phase还未正常执行,因此需要给其他comp延时,也就是set_drain_time.
需求是: 保证seq在drop objection 时,全部comp执行完毕. 解决是:增加set_drain_time
5.3 domain的应用
1.domain是什么?
用于组织不同组件的概念
在5.1中我们提到,不同comp的function phase/run_phase/run_time phase的同步,引入domain,将不同comp置入不同domain,run_time phase便不再保持同步.