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 ??