UVM is a tree of components walked by a phase schedule. You do not call run yourself — the factory + run_test does.
flowchart TB test[uvm_test] --> env[uvm_env] env --> ag[uvm_agent] ag --> drv[driver] ag --> mon[monitor] ag --> sqr[sequencer]
Common phases: build_phase (new children), connect_phase (TLM binds), run_phase (time-consuming), report_phase.
Wrong vs right
Wrong — construct children in run_phase or connect ports in build_phase before the other side exists.
Right — build then connect then run. Log with uvm_info, not $display, so verbosity filters work.