User-Defined Phases

To define your own custom phase, use the following pattern.

1.  Extend the appropriate base class for your phase type.

class my_PHASE_phase extends uvm_task_phase;
class my_PHASE_phase extends uvm_topdown_phase;
class my_PHASE_phase extends uvm_bottomup_phase;

2.  Optionally, implement your exec_task or exec_func method.

task exec_task(uvm_component comp, uvm_phase schedule);
function void exec_func(uvm_component comp, uvm_phase schedule);

If implemented, these methods usually call the related method on the component

comp.PHASE_phase(uvm_phase phase);

3.  Since the phase class is a singleton, providing an accessor method allows for easy global use, and protecting the constructor prevents misuse.

class my_PHASE_phase extends uvm_topdown_phase;  or uvm_task_phase/uvm_bottomum_phase
  static local my_PHASE_phase m_inst;      Local reference to global IMP
  protected function new(string name="PHASE");    Protected constructor for singleton
    super.new(name);
  endfunction : new
  static function my_PHASE_phase get();   Static method for accessing singleton
    if (m_imp == null)
      m_imp = new();
    return m_imp;
  endfunction : get
   Optionally implement exec_func/exec_task
endclass : my_PHASE_phase

4.  Insert the phase in a phase schedule or domain using the uvm_phase::add method:

my_schedule.add(my_PHASE_class::get());
Summary
User-Defined Phases
To define your own custom phase, use the following pattern.
function void add( uvm_phase  phase,   
uvm_phase  with_phase  =  null,
uvm_phase  after_phase  =  null,
uvm_phase  before_phase  =  null )
Build up a schedule structure inserting phase by phase, specifying linkage