What is uvm_object ?
All components and object classes in a UVM environment are derived from
uvm_object base class. The primary role of
uvm_object class is to define a set of common utility functions like print, copy, compare and record which can be availed by any other class in a UVM testbench to save effort.
virtual class uvm_object extends uvm_void; // Creates a new uvm_object with the given name, empty by default function new(string name=""); // Utility functions function void print (uvm_printer printer=null); function void copy (uvm_object rhs, uvm_copier copier=null); function bit compare (uvm_object rhs, uvm_comparer comparer=null); function void record (uvm_recorder recorder=null); ... // These two functions have to be redefined by child classes virtual function uvm_object create (string name=""); return null; endfunction virtual function string get_type_name (); return "
"; endfunction endclass
Classes that derive from
uvm_object must implement the pure virtual methods such as
get_type_name. These are taken care of by the inclusion of macros as set forth by the UVM coding guidelines.
create method allocates a new object of the same type as this object and returns it via the base
uvm_object handle. The difference between new and create is that the former allocates memory for the current object whereas the latter returns the handle for a different object allocated elsewhere.
class my_object extends uvm_object; ... // Implementation : Create an object of the new class type and return it virtual function uvm_object create(string name="my_object"); my_object obj = new(name); return obj; endfunction endclass
get_type_name function returns the class type name of the object and is used for debugging functions and by the UVM factory to create objects of a particular type.
class my_object extends uvm_object; // This static method is used to access via scope operator :: // without having to create an object of the class static function string type_name(); return "my_object"; endfunction virtual function string get_type_name(); return type_name; endfunction endclass
UVM employs a new concept called factory where all classes that are defined in the UVM environment are registered with this "factory", which can then return an object of any requested class type later on. User classes are expected to include certain macros within them that allow it to be registered with the factory.
// An object derived from uvm_object by itself does not get // registered with the UVM factory unless the macro is called // within the class definition class my_object extends uvm_object; // Register current object type with the factory `uvm_object_utils (my_object) ... endclass
Read more about UVM utility & field macros !
function void print(uvm_printer printer = null);
do_print to add custom information.
Read more on UVM Object Print !
function void uvm_object::copy (uvm_object rhs, uvm_copier copier=null);
Like the print method above,
copy cannot be overridden and to copy fields of a derived class, that class should override
do_copy method instead.
Read more on UVM Object Copy !
function bit compare (uvm_object rhs, uvm_comparer comparer=null);
This method performs a deep compare on members of this data object with those of the object provided as an argument to this method, returning a 1 on match and 0 otherwise. This method cannot be overridden and custom code can be added to the user-definable hook called
Read more on UVM Object Compare !
uvm_object class is the parent class for other fundamental UVM classes, such as
uvm_sequence_item (for transactions) and
uvm_component (for testbench components). By inheriting from
uvm_object, these classes inherit the essential functionalities and properties discussed above, making it a crucial building block for UVM verification environments.