Title: 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 method: | my_schedule.add(my_PHASE_class::get());