Argument type for Sequence's get_response

Hi all ,

I have following code ::


  `include "uvm_pkg.sv"
  `include "uvm_macros.svh" 
  
   import  uvm_pkg::*;
  

   class user_seq_item  extends uvm_sequence_item ;
  
     //  Factory  Registration  N  Stad. 3 line  Object  Constructor
  
  endclass   

 `ifdef EXT
   class tp_rsp_seq_item  extends  user_seq_item ; 
 `else   
   class tp_rsp_seq_item  extends  uvm_sequence_item ;  //  Unrelatable  to  user_seq_item 
 `endif

     //  Factory  Registration  N  Stad. 3 line  Object  Constructor
  
  endclass   

  typedef  uvm_sequencer #(user_seq_item)  user_sequencer ;

  class  my_driver  extends  uvm_driver #(user_seq_item) ;

     //  Factory  Registration  N  Stad. 3 line  Component  Constructor
     
      task   main_phase(  uvm_phase phase ) ;

          seq_item_port.get_next_item(req) ;

          `uvm_info(get_name(),$sformatf(" Received request"),UVM_NONE)
           
           $cast( rsp , req.clone() ) ;
 
            rsp.set_id_info( req ) ;  

          seq_item_port.item_done( rsp ) ;

      endtask

  endclass

  class  user_seq  extends uvm_sequence#( user_seq_item ) ; 

      //  Both  'REQ' N  'RSP'  Type  Parameterization  of  type  'user_seq_item'  !!
                                                                             
      //  Factory  Registration  N  Stad. 3 line  Object  Constructor

     task  body() ;
        tp_rsp_seq_item  rsp_item ; 

                 req  =  user_seq_item::type_id::create("req") ;

            start_item(req); 
            
            finish_item(req);  

            get_response( rsp_item ) ; 
          
          `uvm_info(get_name(),$sformatf(" Received response"),UVM_NONE)

     endtask

  endclass   

  class  user_test extends  uvm_test ;

     //  Factory  Registration  N  Stad. 3 line  Component  Constructor

      my_driver        drv  ;
  
      user_sequencer   seqr ;

      function  void  build_phase ( uvm_phase phase ) ;      
              drv  =  my_driver::type_id::create("drv",this) ; 
             seqr  =  user_sequencer::type_id::create("seqr",this) ; 
      endfunction

      function  void  connect_phase ( uvm_phase phase ) ;
         drv.seq_item_port.connect( seqr.seq_item_export ) ;  
      endfunction
      
      task   main_phase(  uvm_phase phase ) ;
          user_seq   seq  ;

          phase.raise_objection(this);

                 seq  =  user_seq::type_id::create("seq");

                 seq.start(seqr);

          phase.drop_objection(this);

      endtask

  endclass

  module   Top_Tb ;
   
      initial  begin 

        $display(" Calling run_test() ") ;
        run_test("user_test") ;

      end
  
  endmodule


//========================================================================================
// OUTPUT with No +define / +define+EXT
//===========================================================================================
//
// Error-[ICTTFC] Incompatible complex type usage
//
// We Observe Elaboration Error ( as “Calling run_test” is not displayed ) in both cases !!
//
//===========================================================================================

   **In  class  ' uvm_sequence '  task  'get_response '  is  defined  as  ::                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          
                                                                                                                                                                                                                                                    
      virtual task get_response(output RSP response, input int transaction_id = -1);                                                                                                                                                                                                                                                         
        uvm_sequence_item rsp;
          get_base_response( rsp, transaction_id);
          $cast(response,rsp);
     endtask**                                                                                                                                                                                                                                       
                                                                                                                                                                                                                                                    
  For  +define+EXT  ::                                                                                                                                                                                                                             
                                                                                                                                                                                                                                                    
 As  user_seq :: RSP  is  of  type  ' user_seq_item '  i.e  base  type   whereas  the  argument  to  task  get_response  is  of  type  ' tp_rsp_seq_item '  i.e  extended  type  .                                                                                                                                                                                                                                                       

[Q] So why do we Observe the Elaboration Error ??

In reply to MICRO_91:

Because the response argument is an output. tp_rsp_seq_item is that target type, so you are trying to downcast from user_seq_item or uvm_sequence_item types without $cast.

In reply to dave_59:

Thanks Dave .

The elaboration error Occurs due to the Implicit assignment ::

   
  rsp_item    =   response  ; 
  
  where  ::  LHS  of  type  tp_rsp_seq_item     
             RHS  of  RSP  type  of  user_sequence  ALWAYS  i.e  type  user_seq_item   


As the LHS is either extended - type ( via +define+EXT ) OR Unrelated type ,
the assignment is Illegal and caught during Elaboration Time