uvm_object_registry and uvm_component_registry implements following methods [IEEE 1800.2-2020, section 8.2.4 and 8.2.3 respectivelly]:
create_object/componentget_type_namegetcreateset_type_overrideset_inst_overrideinitialize
However, only create_* and get_type_name are part of uvm_object_wrapper, which serves as the abstract interface for factory registries [8.3.2].
My question is: what is the architectural reason for this separation?
Are the remaining methods intended to be a syntactic sugar over the global uvm_factory singleton, allowing usage such as:
base_trans::type_id::set_type_override(child_trans::get_type());
instead of directly accessing the factory:
uvm_factory::get().set_type_override_by_type(
base_trans::get_type(),
child_trans::get_type()
);
Or is there a deeper design reason why these methods are not part of uvm_object_wrapper despite being implemented by all registry classes?