Confusion About uvm_void in UVM Hierarchy

I am a beginner in UVM and trying to understand the purpose of uvm_void.

From the hierarchy, I see:


uvm_void
   ↓
uvm_object
   ↓
other UVM classes

But I am confused because uvm_void is an empty class with no methods or variables.

So my questions are:

  • If uvm_void is completely empty, then why was it needed?

  • Why didn’t UVM architects directly make uvm_object the top/base class?

  • What is the actual difference between uvm_void and uvm_object apart from one being empty and the other having methods?

  • What real problem does uvm_void solve?

  • In what situation would uvm_void work differently from uvm_object?

  • Is this only for framework architecture flexibility, or is there an actual practical use case?

As a beginner, it feels like uvm_object could also work everywhere, so I am unable to relate the need for uvm_void.

As a beginner or even average user, there’s no need to comprehend uvm_void. It’s worth noting that many people criticized the creation of the uvm_void class, considering it unnecessary overhead. This UVM class was introduced to address the limitation of SystemVerilog OOP, which originated from Java, in casting a pointer to a void* type, unlike in C/C++. This ensures that objects remain type-safe.

Java does have a root class java.lang.Object from which everything extends. uvm_void was designed to mimic this structure. It would primarily be used when integrating two different base class methodologies.