Part 2 · Phases & Lifecycle · Intermediate

phase.jump() Mechanism: Schedule Rewind Semantics

How phase.jump(target) rewinds the runtime schedule, which components participate, and API usage from task phases.

What jump does

Calling phase.jump(target_phase) from within a task phase tells the UVM scheduler to rewind the runtime schedule so all components re-enter from target_phase. The current phase is abandoned; reset through shutdown phases run again from the target. Simulation time continues — this is not a simulator restart.

diagram
[PHASE][UVM] jump rewind

before jump (in main_phase):
  ... pre_reset reset configure main ...

phase.jump(uvm_reset_phase::get())

after jump:
  schedule rewinds  reset_phase runs again for all components
  then configure  main  ...

API and usage

systemverilog
task main_phase(uvm_phase phase);
  phase.raise_objection(this, "main traffic");

  run_initial_traffic();

  if (cfg.test_soft_reset) begin
    `uvm_info("JUMP", "triggering soft reset — jumping to reset_phase", UVM_MEDIUM)
    drain_inflight();                          // project-specific
    phase.jump(uvm_reset_phase::get());
  end

  run_post_reset_traffic();
  phase.drop_objection(this, "main done");
endtask
systemverilog
// Common jump targets
phase.jump(uvm_reset_phase::get());      // full reset sequence
phase.jump(uvm_configure_phase::get());  // re-configure only
phase.jump(uvm_main_phase::get());       // re-run main (rare)
  • Jump is called from within a task phase on the phase handle.

  • All components in the domain participate in the re-entry.

  • Simulation time does not reset — only the phase schedule rewinds.

Key takeaways

  • phase.jump() rewinds runtime schedule to target_phase for all components.

  • Drain in-flight work before jumping to avoid corrupted state.

  • Most soft-reset tests jump to reset_phase, not directly to main.

Common pitfalls

  • Jumping with non-zero objection count from unrelated components.

  • Expecting simulation time or variables to reset — they do not.

  • Jumping to main_phase and skipping reset when DUT needs it.


Domain note

phase.jump affects the domain of the calling component. In multi-domain testbenches, jumping one domain does not rewind another — coordinate with sync or jump from a common ancestor.

diagram
[PHASE][UVM] jump scope

single domain:  jump rewinds entire TB runtime schedule
multi-domain:   jump is domain-local — verify peer domain state