What is uvm_root ?

uvm_root is a singleton class that serves as the top-level container for all UVM components in a verification environment whose instance is called uvm_top. It is automatically created when UVM is initialized and is available throughout the entire simulation. Users should not create any other instance of uvm_root !

Class Hierarchy

uvm_root_class_hier

Implicit Top-Level

uvm_top is the implicit top-level component and any component whose parent is not specified becomes a child of uvm_top.



class my_env extends uvm_env;
	`uvm_component_utils (my_env)

	// Note that if parent is not explicitly passed during creation, it will be null
	function new(string name = "my_env", uvm_component parent = null);
		super.new(name, parent);
	endfunction

endclass

class my_test extends uvm_test;
	`uvm_component_utils (my_test)

	my_env 		m_env_1;
	my_env 		m_env_2;
	...

	virtual function void build_phase(uvm_phase phase);
		super.build_phase(phase);

		// Parent is set to my_test 
		m_env_1 = my_env::type_id::create("m_env_1", this);

		// Parent is null, and hence set to uvm_top
		m_env_2 = my_env::type_id::create("m_env_2");
	endfunction
endclass

Search Functionality

uvm_top instance can be used to search for components by their full hierarchical name in a testbench using wildcards. The component hierarchy will be searched in top to bottom fashion in alphanumeric order. The functions find() and findall() can be used to return component handles that match the provided wildcard pattern.


class my_test extends uvm_test;
	`uvm_component_utils (my_test)

	my_env 		m_env;

	virtual function void build_phase(uvm_phase phase);
		super.build_phase(phase);
	
		m_env = my_env::type_id::create("m_env", this);		
	endfunction

	virtual function void end_of_elaboration_phase(uvm_phase phase);
		uvm_component 	comp;
		uvm_component 	comp_q [$];

		super.end_of_elaboration_phase(phase);

		// Gets handle to the driver indicated by the path
		comp = uvm_top.find("m_env.m_agent.m_driver");

		// Gets the first handle to the driver that matches the pattern
		comp = uvm_top.find("*apb_driver*");
		
		// Gets queue of all handles that match the pattern
		comp_q = uvm_top.find_all("*apb_driver*");

		foreach (comp_q[i]) begin
			`uvm_info (get_type_name(), $sformatf("Found component %s", comp_q[i].get_full_name()), UVM_LOW)
		end

	endfunction
endclass

Report Configuration

uvm_top can set a global report verbosity which affects verbosity for all components in simulation. Its reporting mechanism is also accessible from anywhere outside uvm_component, like modules, sequences, etc.


class my_test extends uvm_test;
	
	...

	virtual function void build_phase(uvm_phase phase);
		super.build_phase(phase);

		uvm_top.set_report_verbosity_level_hier(UVM_HIGH);
	endfunction
endclass

Also note that the name of uvm_top is set to empty string "" so that it doesn't appear in the full hierarchical name of child components. Another common usage is while setting or getting an object in configuration database using uvm_config_db.



// Set m_cfg to the top level and let everything else beneath it have access
uvm_config_db #(my_cfg)::set(uvm_root::get(), "*", "my_cfg", m_cfg);

if (! uvm_config_db #(my_cfg)::get(uvm_root::get(), "*", "my_cfg", m_cfg))
	`uvm_fatal (get_type_name(), $sformatf("[ERROR] my_cfg not found in config_db !"))