Sequencer class hierarchy

I have a small question on the sequencer classes namely, ovm_sequencer_param_base #(REQ,RSP) and ovm_sequencer #(REQ,RSP)

Parameter specialization for ovm_sequencer results in specialization for ovm_sequencer_param_base also, shown in the following code:

class ovm_sequencer #(
type REQ = ovm_sequence_item,
type RSP = REQ
) extends ovm_sequencer_param_base #(REQ, RSP)

Assuming one passes a derived class of ovm_sequence_item while creating ovm_sequencer class object, why is it necessary to create specialization class based for ovm_sequencer_param_base also. It would still work even if in the above class definition, the parameters REQ, RSP are not passed to ovm_sequencer_param_base also.

I do understand that a derived class of ovm_sequence_item in ovm_sequencer_param_base can potentially behave differently than ovm_sequence_item. But looking at the
ovm_sequencer_param_base, I would not see such a possibility.

Passing the actual REQ and RSP types to the base class gives you

  1. Type safety - you will get compile time errors if you try to hook up drivers of the wrong type
  2. No need to $cast transactions through extra ovm_sequence_item variables. When you do a get(), the object will already be of your base transaction type.