UVM_FATAL :: " Attempting to register a null object with the Factory "

In reply to MICRO_91:

(A1): Because your driver is parameterized twice you need an individual get_type function, returning the type of the 1st parameter.
(A2) Instead of running main_phase you should run run_phase. You can implement there the objection mechanism. But it is not he best place. The recommeded implementation is in the test.
(A3) why do you need a 2nd parameter in your driver implementation. What you are doing with it?

See the solution below:

`include "uvm_macros.svh"
`include "uvm_pkg.sv"
 
 import uvm_pkg::* ;
 
  class user_seq_item  extends uvm_sequence_item ;
 
      localparam  string  TYPE_NAME  =  "user_seq_item" ;
 
     `uvm_object_utils(user_seq_item)
 
     //  Std  3  line  Constructor
   function new(string name = "user_seq_item");
     super.new(name);
   endfunction : new
 
  endclass 
 
  class  my_driver #( type T = user_seq_item )  extends  uvm_driver #( T ) ; 
 
	typedef   uvm_component_registry  #( my_driver#( T ) , $sformatf("my_driver#(%0s)" , T::TYPE_NAME )  )   type_id  ;
 
        //  Std  3  line  Constructor 
 
   function new(string name = "my_driver", uvm_component parent = null);
     super.new(name, parent);
   endfunction : new
        task   run_phase(  uvm_phase phase ) ;
 
            `uvm_info(get_name() , $sformatf(" Within  driver of  Tname : %0s " , type_id::type_name ) , UVM_NONE )  //  'Tname'  of  uvm_component_registry  !!
 
            `uvm_info(get_name() , $sformatf(" Received request is  of  type_name : %0p " , req.get_type() ) , UVM_NONE )
 
 
       endtask
 
   endclass
 
   class  ext_driver #( type T = user_seq_item )  extends  my_driver #( T )  ;
 
        typedef   uvm_component_registry  #( ext_driver#( T ) , $sformatf("ext_driver#(%0s)" , T::TYPE_NAME )  )   type_id  ;
 
        //  Std  3  line  Constructor 
 
        //   main_phase()  Inherited  !!
   function new(string name = "ext_driver", uvm_component parent = null);
     super.new(name, parent);
   endfunction : new

   static function type_id get_type();
    return type_id::get();
  endfunction

   endclass
 
 
 class  env  extends  uvm_env  ;
 
      `uvm_component_utils( env ) 
 
   function new(string name = "env", uvm_component parent = null);
     super.new(name, parent);
   endfunction : new
 
   my_driver #( user_seq_item )       drvr_h  ;
 
   function  void  build_phase ( uvm_phase phase ) ;
 
          drvr_h  =  my_driver #( user_seq_item ) :: type_id :: create( "drvr_h" , this ) ;
 
   endfunction
 
 
 endclass
 
 class  my_test  extends  uvm_test  ;
 
   `uvm_component_utils( my_test ) 
 
   function new(string name = "my_test", uvm_component parent = null);
     super.new(name, parent);
   endfunction : new
 
   env  env_h  ;
 
   function  void  build_phase ( uvm_phase phase ) ;
 
        my_driver #( user_seq_item ) ::type_id :: set_type_override( ext_driver #( user_seq_item ) :: get_type() ) ;
 
        env_h  =  env  :: type_id  ::  create( "env_h" , this ) ;
 
   endfunction
 
 endclass
 
 
  module  TOP  ;
 
      initial  
         run_test("my_test") ;
 
  endmodule