UVM中phase和objection机制

phase机制:

  uvm中根据是否消耗时间将phase分为function phase和task phase; uvm中所有的Phase的会按照自上而下的顺序执行;对于function phase, 比如build_phase, connect_phase等,在同一时间只有一个phase在执行;但是对于task phase, run_phase和reset_phase, main_phase等12个Phase是并行进行的,此12个phase称为动态运行的Phase;

  动态运行的Phase有12个,其中reset, configure, main, shutdown四个phase是核心;

objection机制:

  在验证平台中,可以通过drop_objection通知系统可以关闭验证平台,在drop_objection之前一定要raise_objection;当进入某一phase时,UVM会收集此phase提出的所有的objection,并实时监测objection是否已经被撤销了,当发现所有都已经撤销后,会关闭此phase,开始进入下一个phase, 当所有的phase执行完毕后,会调用$finish来将整个的验证平台关掉;

  如果UVM发现此Phase中没有提起任何objection,那将会直接跳转到下一个Phase。假如验证平台对于main_phase, 只有driver中提起objection,其他的monitor等组件没有提起objection,所有的代码都会执行,但是执行到driver中的drop_objection时,会关掉其他所有组件的main_phase。因此在执行一些消耗时间的代码时,在此Phase下任意一个component中至少提起objection一次;

  上述关于objection机制的结论只适用于12个run_time的phase, 对于run_phase不适用,由于run_phase与动态运行的Phase并行运行的,如果12个phase中有objection被提起,run_phase不需要raise_objection就可以自动执行;

  objection机制的引入是为了解决何时结束仿真的问题,是面向task phase, 而不是function phase, 因此在function phase中一般不会用,用了也不会报错;

super.phase的用处:

  在phase中看到有时用super.phase,有时不用,有什么用处呢?对于build_phase来说,uvm_component对其做的最重要的事情是自动获取通过config_db::set设置的参数,如果要关闭这个功能,可以在自己的build_phase中不调用super.build_phase;

  除了build_phase外,UVM在其他的Phase中几乎没有做任何相关的事情。因此,除了build_phase外,在写其他的Phase时,完全可以不必加上super.xxx_phase语句,当然这个结论只适用于扩展自uvm_component的类。如果是扩展自用户自定义的类,如base_test类,且在某个phase,比如connect_phase中定义了一些重要内容,在具体的测试用例的connect_phase中不应该省略super.connect_phase;

posted @ 2021-01-20 11:55  Pine1  阅读(1514)  评论(0编辑  收藏  举报