In reply to sanjeevs:
Using templates would be more efficient (in theory), but this usually brings along other problems. For example, the callbacks on registers are intended to work with the uvm_reg_field and uvm_reg classes. If these were parameterized, then we’d need to propagate the parameters to the callback classes that use them. The same applies to other classes that collaborate with them (predictor, map, etc.).