blob: 8fa9d2c4f361039ca331617401eea0dc3e676e90 [file] [log] [blame]
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
<uvm_phase::add> method:
| my_schedule.add(my_PHASE_class::get());