I have a very interesting problem here, image a multiple lanes (changeable) communication system, since some relationship maybe exist across those lanes, in order to model it, I just use a parameterized driver/sequencer in a verification environment, which looks like as:
class driver #(parameter LANES = 4) extends uvm_driver #(transaction #(LANES));
class sequencer #(parameter LANES = 4) extends uvm_sequencer #(transaction #(LANES));
Simultaneously, I want to use following Macro in my sequence providing a handle pointed to the sequencer, as we know, called p_sequencer.
class pma_base_sequence #(parameter LANES = 4) extends uvm_sequence;
`uvm_declare_p_sequencer(sequencer #(LANES))
However, I got following runtime uvm_fatal error:
UVM_FATAL …/src/uvc/PMA/pma_sequence_lib.sv(15) @ 0: uvm_test_top.pma_agt.pma_seqr@@pma_base_seq [DCLPSQ] testbench_top.pma_base_sequence.m_set_p_sequencer uvm
est_top.pma_agt.pma_seqr.pma_base_seq Error casting p_sequencer, please verify that this sequence/sequence item is intended to execute on this type of sequencer
It looks like the casting from my parameterized sequencer above to specific p_sequencer failed, i.e. this statement failed:
$cast(p_sequencer, sequencer#(LANES))
I have no idea what’s going on here, does anyone knew it ? I really appreciate if you can help me, thanks in advance !
The issue seems like in your sequencer’s type. You should create your sequencer extends from uvm_sequencer. I am not sure why you extends from uvm_driver class.
Is there a specific reason you are creating a specialized sequencer instead of using the generic uvm_sequencer? Also, is there a specific reason you are trying to declare p_sequencer?
For portability and reuse, it is recommended to just use the uvm_object_utils() macro in a sequence and not use the uvm_declare_p_sequencer() macro. Additionally, you should instantiate a parameterized uvm_sequencer in your agent instead of creating a new component.
I just declare a model inside my sequencer, it could be thought as kind of reference model, the model itself is parameterized, to pass the parameter into the reference model, I have to declare the sequencer as parameterized sequencer.
When you utilize p_sequencer in a sequence, you are requiring that sequence to run on a specific sequencer type. By not using p_sequencer, your sequences are more portable and can be utilized on any sequencer that is type’d appropriately (i.e. creates the appropriate sequence_item).
If your lane_model is interface specific, then I would include it as part of the Agent’s configuration object. Your sequence would have a handle to the Agent’s configuration object that would be assigned when the sequence is created. The sequence can then make direct use of the lane_model from the configuration object.
In reply to caowangyang:
I do not understand why you are doing simple things so complicated. You can avoid any paramerization by putting your parameter into a package and importing this package in any place where needed.