M_common_domain also contains run-time phases

In uvm_domain, there are 4 static local data members:


  static local uvm_domain m_common_domain;
  static local uvm_domain m_uvm_domain; // run-time phases
  static local uvm_domain m_domains[string];
  static local uvm_phase m_uvm_schedule;

As the names suggest (also some paper claims), m_common_domain contains 9 “common” phases. And m_uvm_domain contains 12 run-time phases through m_uvm_schedule. m_domains[string] is an associate array with two members “common” and “uvm”, corresponding to m_common_domain and m_uvm_domain.

Is this understanding correct? Assuming standard way of phasing.

However, I do see m_uvm_domain gets added to m_common_domain, which means m_common_domain is a superset and contains 9 “common” phases and 12 run-time phases?


  static function uvm_domain get_common_domain();

    uvm_domain domain;
    uvm_phase schedule;

    if (m_common_domain != null)
      return m_common_domain;

    domain = new("common");
    domain.add(uvm_build_phase::get());
    domain.add(uvm_connect_phase::get());
    domain.add(uvm_end_of_elaboration_phase::get());
    domain.add(uvm_start_of_simulation_phase::get());
    domain.add(uvm_run_phase::get());
    domain.add(uvm_extract_phase::get());
    domain.add(uvm_check_phase::get());
    domain.add(uvm_report_phase::get());
    domain.add(uvm_final_phase::get());
    m_domains["common"] = domain;
    m_common_domain = domain;

    **domain = get_uvm_domain();
    m_common_domain.add(domain,
                     .with_phase(m_common_domain.find(uvm_run_phase::get())));**

    return m_common_domain;

  endfunction

In reply to eda2k4:

Yes, the 12 UVM run-time phases are in a parallel path to the single run_phase. We do not recommend using them and instead use layers of sequences for synchronization.

Seems reasonable. Don’t understand why those 12 run-time phases are not part of “common” domain though.

0: full_name = common, type = UVM_PHASE_DOMAIN, state = UVM_PHASE_DORMANT, domain = common, schedule =
0: full_name = common.build, type = UVM_PHASE_NODE, state = UVM_PHASE_SCHEDULED, domain = common, schedule =
0: full_name = common.connect, type = UVM_PHASE_NODE, state = UVM_PHASE_SCHEDULED, domain = common, schedule =
0: full_name = common.end_of_elaboration, type = UVM_PHASE_NODE, state = UVM_PHASE_SCHEDULED, domain = common, schedule =
0: full_name = common.start_of_simulation, type = UVM_PHASE_NODE, state = UVM_PHASE_SCHEDULED, domain = common, schedule =
0: full_name = common.run, type = UVM_PHASE_NODE, state = UVM_PHASE_SCHEDULED, domain = common, schedule =
0: full_name = uvm, type = UVM_PHASE_DOMAIN, state = UVM_PHASE_SCHEDULED, domain = uvm, schedule =
0: full_name = uvm.uvm_sched, type = UVM_PHASE_SCHEDULE, state = UVM_PHASE_SCHEDULED, domain = uvm, schedule = uvm_sched
0: full_name = uvm.uvm_sched.pre_reset, type = UVM_PHASE_NODE, state = UVM_PHASE_SCHEDULED, domain = uvm, schedule = uvm_sched
52455: full_name = uvm.uvm_sched.reset, type = UVM_PHASE_NODE, state = UVM_PHASE_SCHEDULED, domain = uvm, schedule = uvm_sched
52455: full_name = uvm.uvm_sched.post_reset, type = UVM_PHASE_NODE, state = UVM_PHASE_SCHEDULED, domain = uvm, schedule = uvm_sched
536455: full_name = uvm.uvm_sched.pre_configure, type = UVM_PHASE_NODE, state = UVM_PHASE_SCHEDULED, domain = uvm, schedule = uvm_sched
536455: full_name = uvm.uvm_sched.configure, type = UVM_PHASE_NODE, state = UVM_PHASE_SCHEDULED, domain = uvm, schedule = uvm_sched
646455: full_name = uvm.uvm_sched.post_configure, type = UVM_PHASE_NODE, state = UVM_PHASE_SCHEDULED, domain = uvm, schedule = uvm_sched
1129839: full_name = uvm.uvm_sched.pre_main, type = UVM_PHASE_NODE, state = UVM_PHASE_SCHEDULED, domain = uvm, schedule = uvm_sched
1129839: full_name = uvm.uvm_sched.main, type = UVM_PHASE_NODE, state = UVM_PHASE_SCHEDULED, domain = uvm, schedule = uvm_sched
6144839: full_name = uvm.uvm_sched.post_main, type = UVM_PHASE_NODE, state = UVM_PHASE_SCHEDULED, domain = uvm, schedule = uvm_sched
6144839: full_name = uvm.uvm_sched.pre_shutdown, type = UVM_PHASE_NODE, state = UVM_PHASE_SCHEDULED, domain = uvm, schedule = uvm_sched
6644839: full_name = uvm.uvm_sched.shutdown, type = UVM_PHASE_NODE, state = UVM_PHASE_SCHEDULED, domain = uvm, schedule = uvm_sched
6644839: full_name = uvm.uvm_sched.post_shutdown, type = UVM_PHASE_NODE, state = UVM_PHASE_SCHEDULED, domain = uvm, schedule = uvm_sched
6644839: full_name = common.extract, type = UVM_PHASE_NODE, state = UVM_PHASE_SCHEDULED, domain = common, schedule =
6644839: full_name = uvm.uvm_sched_end, type = UVM_PHASE_TERMINAL, state = UVM_PHASE_SCHEDULED, domain = uvm, schedule =
6644839: full_name = uvm.uvm_end, type = UVM_PHASE_TERMINAL, state = UVM_PHASE_SCHEDULED, domain = uvm, schedule =
6644839: full_name = common.check, type = UVM_PHASE_NODE, state = UVM_PHASE_SCHEDULED, domain = common, schedule =
6644839: full_name = common.report, type = UVM_PHASE_NODE, state = UVM_PHASE_SCHEDULED, domain = common, schedule =
6644839: full_name = common.final, type = UVM_PHASE_NODE, state = UVM_PHASE_SCHEDULED, domain = common, schedule =
6644839: full_name = common.common_end, type = UVM_PHASE_TERMINAL, state = UVM_PHASE_SCHEDULED, domain = common, schedule =

In reply to dave_59: