[Q] **I was wondering what if request Item is changed in Sequence body() after finish_item( req ) ?? Will the change be reflected in driver ??
If yes , is the REQ Item Passed by reference OR value**
`include "uvm_pkg.sv"
`include "uvm_macros.svh"
import uvm_pkg::*;
`define COMP_NEW function new ( string name , uvm_component parent ) ; \
super.new(name,parent);\
endfunction
`define OBJ_NEW function new ( string name = "" ) ; \
super.new(name);\
endfunction
class user_seq_item extends uvm_sequence_item ;
`uvm_object_utils(user_seq_item)
`OBJ_NEW
int value ;
endclass
typedef uvm_sequencer #(user_seq_item) user_sequencer ;
class my_driver extends uvm_driver #(user_seq_item) ;
`uvm_component_utils(my_driver)
`COMP_NEW
task main_phase( uvm_phase phase ) ;
forever
begin
#100 ;
seq_item_port.get(req) ;
`uvm_info(get_name(),$sformatf(" Received request"),UVM_NONE)
#10 ;
`uvm_info(get_name(),$sformatf(" After delay request.value == %0d " , req.value ),UVM_NONE)
end
endtask
endclass
class user_seq extends uvm_sequence#(user_seq_item) ;
`uvm_object_utils(user_seq)
`OBJ_NEW
task body() ;
user_seq_item req2 ;
req = user_seq_item::type_id::create("req") ;
repeat(2) begin
start_item( req );
finish_item( req );
req.value++ ; // NOTE :: To check if the Change in Request packet is Reflected in Driver !!
end
endtask
endclass
class user_test extends uvm_test ;
`uvm_component_utils(user_test)
`COMP_NEW
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 run_test("user_test") ;
endmodule
**OUTPUT ::**
**UVM_INFO @ 0: reporter [RNTST] Running test user_test...**
**UVM_INFO @ 100: uvm_test_top.drv [drv] Received request**
**UVM_INFO @ 110: uvm_test_top.drv [drv] After delay request.value == 1**
**UVM_INFO @ 210: uvm_test_top.drv [drv] Received request**
**NOTE :: REQ Item Change is Reflected in Driver !!**
//===========================================================================================
// My Thoughts ::
//===========================================================================================
finish_item( req ) sends Request Item to Sequencer .
The Sequencer consists of :: uvm_tlm_fifo #(REQ) m_req_fifo ;
TLM FIFO ( m_req_fifo ) is instantiated with Size of 1
( Internally TLM FIFO is a mailbox )
So essentially Request Items sent via Sequence are Stored in Bounded Mailbox ( of size 1 ) .
Pointer to the Object is stored in the mailbox , so when Driver retrieves
it via get( req ) , handle req points to Same Object .
Hence I believe the Request Item is Passed by value .
Have I missed out on anything ?