我是靠谱客的博主 可耐小伙,最近开发中收集的这篇文章主要介绍Phase机制,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

 

目录

 一.Phase机制的意义?

二.Phase图表

三.phase的执行顺序

1.UVM中不同phase的执行顺序

2.兄弟关系component的phase执行顺序

3.叔侄关系component的phase执行顺序

4. task phase的执行顺序

四.phase的其他知识

1.super.phase

2.uvm_error

3.phase的跳转

4.phase的调试

5.超时退出

五.objection机制

1.概述

2.run phase与动态运行的phase

        动态运行的phase中有objection提起,run phase可自动执行(受控)

        run phase主动提起objection,动态运行的phase不会自动执行(主控) 

        其实不用过分纠结phase的提起与落下,objection机制主要针对的是task phase,其他function phase没有必要提起或落下objection(但是不代表不可以,只是没有意义)。

3.set_drain_time

4.objection的调试

六.domain机制

概述


一.Phase机制的意义?

        在不同的时间做不同的事儿,是UVM中phase的设计哲学。phase的自动执行功能极大方便了用户,很大程度上解决了因代码顺序杂乱可能会引发的问题。引入phase机制,清晰地将UVM仿真阶段层次化引入phase机制,清晰地将UVM仿真阶段层次化

二.Phase图表

主要分为9大phase,其中run_phase又与其他12个小phase并行执行。

常用的phase有build_phase,connect_phase,run_phase,report_phase.

除了run_phase,其他都是function,不消耗时间;

除了build_phase和final_phase,其余function phase都是自底向上的执行顺序;

引入12个小phase是为了实现更精细的控制;

reset                        复位、初始化

config                      DUT配置

main                        DUT运行

shutdown                断电 

(背就完事了,多看几遍就记住了)

三.phase的执行顺序

1.UVM中不同phase的执行顺序

        从时间上讲,各个phase严格按照图表中的顺序,自上而下执行;

example:先执行build_phase,再执行connect_phase;

        从空间来看,按照UVM树形结构,一层层往下执行;

example:先执行my_case的build_phase,再执行env的build_phase。

2.兄弟关系component的phase执行顺序

        执行顺序按照字典序;

example:

        agent下的driver与monitor属于同一层次,若monitor在new时指定名字“aaa”,driver指定名字“bbb”,则先执行monitor的build_phase,再执行driver的build_phase。

3.叔侄关系component的phase执行顺序

         执行顺序为深度优先;

example:

         此处结合第2点。env下的agent与scoreboard属于同一层次,若agent在new时指定名字“aaa”,scoreboard指定名字“bbb”,则先执行agent的build_phase,然后执行agent下driver及monitor的build_phase,最后再执行scoreboard的build_phase。

4. task phase的执行顺序

        (1).task phase会消耗时间。对于父子关系的run_phase,启动顺序仍然是自下而上,但是同时以fork_join none的形式在运行;

        (2).对同一个component的12个小phase,虽然是顺序执行,但是以main_phase为例,A的main_phase结束后,不会马上跳转到post_main_phase,而会等整个验证平台的其他component的main_phase都结束之后,才会统一跳转到下一个phase;

四.phase的其他知识

1.super.phase

        对于uvm_component类,除了build_phase,其他phase书写时完全不必加super。

        利用super.build_phase自动获取config_db::set设置的参数。

2.uvm_error

        通常利用uvm_fatal直接退出仿真;

        但在end_of_elaboration_phase及之前的phase中出现uvm_error,仿真也会自动结束。

3.phase的跳转

        只有uvm_pre_reset之后的所有phase才可以跳转。

        向前跳转只能到该phase之前的动态运行的phase,向后跳转可以到final phase。

4.phase的调试

        UVM_PHASE_TRACCE 

5.超时退出

        uvm_root.set_timeout(延迟时间,是否可以被后续的延时覆盖(0/1))

默认时间为9200s,若到时间测试用例未结束,会生成uvm_fatal结束仿真。

五.objection机制

1.概述

        在进入某一phase时,UVM会收集此phase提出的所有objection,当所有objection都被撤销后,就会关闭此phase,进入下一个phase。当所有phase都执行完毕后,会调用$finish来将整个验证平台关闭。

        objection机制就是为了控制仿真结束,一般情况只在sequence中控制objection。

2.run phase与动态运行的phase

        动态运行的phase中有objection提起,run phase可自动执行(受控)

        run phase主动提起objection,动态运行的phase不会自动执行(主控) 

         

        其实不用过分纠结phase的提起与落下,objection机制主要针对的是task phase,其他function phase没有必要提起或落下objection(但是不代表不可以,只是没有意义)。

3.set_drain_time

        phase.phase_done.set_drain_time(this,200)

当检测到没有objection提起时,经过延时再进入下一个phase。

一个phase对应一个drain_time,默认为0。

4.objection的调试

        UVM_OBJECTION_TRACCE (和phase的有点像)

六.domain机制

概述

       domain是UVM中一个用于组织不同组件的概念。

默认情况下,所有的component组件都位于一个common_domain的domain中。

 图左为common_domain,图右为两个不同的domain

        domain把两个时钟域隔开,之后两个domain的各个动态运行的phase 就可以不同步,只能隔离run-time phase,run_phase 和其它function phase 是同步的。(重点!!!)

        domain隔开后,phase的跳转只能在当前的domain中跳转。

最后

以上就是可耐小伙为你收集整理的Phase机制的全部内容,希望文章能够帮你解决Phase机制所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(61)

评论列表共有 0 条评论

立即
投稿
返回
顶部