The uvm_object class is the base class for all UVM classes. From it, all the rest of classes are extended. It provides basic functionalities such as print, compare, copy and similar methods.
This class can be used when defining reusable parts of a sequence items. For example, in a packet like uvm_sequence_item, we could define a uvm_object extended object for defining the header. This would be:
class packet_header extends uvm_object;
rand bit [2:0] len;
rand bit [2:0] addr;
`uvm_object_utils_begin(packet_header)
`uvm_field_int(len, UVM_DEFAULT)
`uvm_field_int(addr, UVM_DEFAULT)
`uvm_object_utils_end
function new (string name="packet_header");
super.new(name);
endfunction : new
endclass : packet_header
This packet_header could be included in a packet class for conforming the uvm_sequence_item (the transaction) which will compose the sequences:
class simple_packet extends uvm_sequence_item;
rand packet_header header;
rand bit [4:0] payload;
`uvm_object_utils_begin(simple_packet)
`uvm_field_object(header, UVM_DEFAULT)
`uvm_field_int(payload, UVM_DEFAULT)
`uvm_object_utils_end
function new (string name = "simple_packet");
super.new(name);
header = packet_header::type_id::create("header");
endfunction : new
endclass : packet