UVM学习笔记--phase机制

    xiaoxiao2022-07-03  153

    1.UVM phase 概览

    UVM采用phase机制来自动化运行testbench各个仿真过程。UVM phase支持显示或隐式的同步方案,运行过程中的线程控制和跳转。用户只要把代码填入对应的phase,这些代码就会自动在正确的时间执行。各个phase执行顺序如下图所示:

    相较于OVM,UVM新增了12个小的task phase,如下图:

    其中run_phase和uvm新增加的12个小phase是并行执行的。 

    2 按是否消耗仿真时间,所有phase可以分成两大类

        <1>  function phase:不消耗仿真时间,而其也可分成两大类:           a. 继承自uvm_bottomup_phase, 在UVM component树中,自下而上的执行, 如connect_phase           b. 继承自uvm_topdown_phase, 在UVM component树中,自上而下执行, 如build_phase     <2>  task phase:消耗仿真时间的,也称动态运行(run-time)phase. 

    下图是各个phase的继承关系,从中可以看出

     

    自上而下(top-down) function phase:build和final phase。

    自下而上(bottom-up)f unction phase:  connect, end_of_elaboration,start_of_simulation, extract, check, report。

    task phase: run_phase以及其他12个小phase: pre_reset, reset_phase, post_reset, pre_configure, configure, post_configure,  pre_main, main, post_main, pre_shutdown, shutdown, post_shutdown, 如下图:

     

    3 task phase的同步

    一个UVM验证平台有许多component组成,每个component都有自己的run_phase,以及从pre_reset 到post_shuddown的12个小phase。只有所有component的一个小task phase 完成,整个仿真平台才开始下一个小task phase的执行。 各个component的run_phase之间,以及run_phase于最后一个小phase--post_shutdown_phase之间,都有这样的同步。

    4. super.xxx_phase

    除了super.build_phase,其他super.xxx_phase几乎没做任何事情,因此,除了build_phase,其他phase可不必加super.xxx_phase.

    在super.build_phase中,主要完成自动获取config_db中参数的功能,如果自定义的component无需获取任何参数,也可省略。

    5. phase的跳转

    默认情况下各phase是从上到下按时间顺序执行,但可以自定义做必要的跳转,如在main_phase执行过程中,突然遇到reset信号被置起,可以用jump()实现从mian_phase到reset_phase的跳转:

    phase.jump(uvm_reset_phase::get())

    task my_driver::main_phase(uvm_phase phase); `uvm_info("driver", "main phase", UVM_LOW) fork while(1) begin seq_item_port.get_next_item(req); drive_one_pkt(req); seq_item_port.item_done(); end begin @(negedge vif.rst_n); phase.jump(uvm_reset_phase::get()); end join endtask

    跳转的限制

    不能跳转到build到start_of_function的function phase, 也不能跳转到run_phase. 从pre_reset_phase后的所有phase都可以作为jump()的参数。 除了向前跳转,也可向后跳转。除了向run-time phase跳转,甚至可以向final_phase等function phase跳转。

    phase的调试

    在命令行加UVM_PHASE_TRACE,可以将进入和退出个phase的信息打印到log中。

            <sim command> +UVM_PHASE_TRACE

    在指定phase设置verbosity:

           <sim command> +uvm_set_verbosity=<comp>,<id>,<verbosity>,<phase> 

          例如:simv   +uvm_set_verbosity=uvm_test_top.env.mdl,my_model,UVM_NONE,main  +UVM_TESTNAME=my_case0 +UVM_PHASE_TRACE  -l tmp.log

           注意,其中参数<phase> 不需要phase后缀,如上面例子将uvm_test_top.env.mdl的main_phase中打印的信息屏蔽掉,命令行里用的是+uvm_set_verbosity=uvm_test_top.env.mdl,my_model,UVM_NONE,main 。

    设置timeout时间

          1. 通过命令行:<sim command> +UVM_TIMEOUT=<timeout>,<overridable>              如<sim command> +UVM_TIMEOUT="300ns, YES" 

          2.通过在base test中使用set_timeout(): uvm_top.set_timeout(500ns,0);

              必要时需要修改宏定义:`define UVM_DEFAULT_TIMEOUT 9200s

       


    参考: UVM实战(卷1) (张强 著)

    UVM基础之------uvm phases机制

    UVM Phases

    UVM Phasing page from www.learnuvmverification.com

    UVM Tutorial for Candy Lovers – 22. Phasing

    UVM_Presentation_DAC2011_Final

    最新回复(0)