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