Hi , i developed uvm tb for spi master core, when i am running tb with single test case , it was went up to master monitor and it is looping there it self due to forever in monitor run task,how to overcome this?

In reply to chr_sue:

this my sequence
class sl_seq1 extends slave_sequence;

`uvm_object_utils(sl_seq1)

function new (string name=“sl_seq1”);
super.new(name);
endfunction

spi_seq_item seq;

virtual task body();

seq=spi_seq_item::type_id::create("seq"); //create the seq item

start_item(seq);

	assert (seq.randomize() with {spi_miso inside {[0:1000]};})
	`uvm_info("seq1","seq1 was randomised in between 0 to 1000",UVM_MEDIUM)
finish_item(seq);

endtask :body

endclass :sl_seq1

this is my monitor code

`define MON spi_mon.spi_mon_cb
class spi_monitor extends uvm_monitor;

`uvm_component_utils(spi_monitor)
virtual wb_intf vif;
spi_seq_item txn;

uvm_analysis_port #(spi_seq_item) spi_port;

function new(string name=“spi_monitor”,uvm_component parent);
super.new(name,parent);
endfunction

virtual function void build_phase(uvm_phase phase);
//super.build_phase(phase);
spi_port = new(“spi_port”,this);
if (! uvm_config_db #(virtual wb_intf) :: get (this, “”, “vif”, vif))
`uvm_fatal (get_type_name (), “Didn’t get handle to virtual spi interface in monitor”)
endfunction

virtual task run_phase(uvm_phase phase);
super.run_phase(phase);
txn=spi_seq_item::type_id::create(“txn”,this);
uvm_info( get_type_name(), "Going to collect spi seq item sample in monitor", UVM_MEDIUM) forever begin collect_data(); uvm_info( get_type_name(), “spi seq item sample collected in monitor”, UVM_MEDIUM)
spi_port.write(txn);
end
endtask

task collect_data();
//#20;
txn.ss_pad_o=vif.`MON.ss_pad_o;

wait(vif.MON.wb_adr_i=='h10) //CTRL REGISTER ADDRESS begin if(vif.MON.wb_dat_i[8]) //GO_BSY==1
begin

//for lsb=1
if (vif.`MON.wb_dat_i[11]==1) //LSB will go first from miso
begin

	//tx_neg=0 [10](mosi=rising edge) rx_neg=1 [9](miso falling edge)

		if(vif.`MON.wb_dat_i[9]==1 && vif.`MON.wb_dat_i[10]==0)
		begin
			if(vif.`MON.wb_dat_i[6:0]==0)  //CHAR LEN==0
			begin
			int x=0;
				repeat(128)
				begin
				@(negedge vif.`MON.sclk_pad_o)
				txn.spi_miso[x]=vif.`MON.miso_pad_i;
				@(posedge vif.`MON.sclk_pad_o)
				txn.spi_mosi[x]=vif.`MON.mosi_pad_o;
				x++;
				end
			end
			
			if(!vif.`MON.wb_dat_i[6:0]==0) //CHAR LEN !=0
			begin
				for(int i=0;i<vif.`MON.wb_dat_i[6:0];i++)
				begin
				@(negedge vif.`MON.sclk_pad_o)
				txn.spi_miso[i]=vif.`MON.miso_pad_i;
				@(posedge vif.`MON.sclk_pad_o)
				txn.spi_mosi[i]=vif.`MON.mosi_pad_o;
				end
				
			end
		end
	
	//tx_neg=1 [10](mosi= negedge) rx_neg=0 [9](miso posedge)
	
	if(vif.`MON.wb_dat_i[9]==0 && vif.`MON.wb_dat_i[10]==1) 
		begin
			if(vif.`MON.wb_dat_i[6:0]==0)  //CHAR LEN==0
			begin
			int x=0;
				repeat(128)
				begin
				@(posedge vif.`MON.sclk_pad_o)
				txn.spi_miso[x]=vif.`MON.miso_pad_i;
				@(negedge vif.`MON.sclk_pad_o)
				txn.spi_mosi[x]=vif.`MON.mosi_pad_o;	
				x++;
				end
			end
			
			if(!vif.`MON.wb_dat_i[6:0]==0) //CHAR LEN !=0
			begin
				for(int i=0;i<vif.`MON.wb_dat_i[6:0];i++)
				begin
				@(posedge vif.`MON.sclk_pad_o)
				txn.spi_miso[i]=vif.`MON.miso_pad_i;
				@(negedge vif.`MON.sclk_pad_o)
				txn.spi_mosi[i]=vif.`MON.mosi_pad_o;	
				end
			end
		end

end //LSB=1 end

//if LSB=0

if (vif.`MON.wb_dat_i[11]==0) //MSB will go first from miso
begin

	//tx_neg=0 [10](mosi=posedge) rx_neg=1 [9](miso negedge)
	if(vif.`MON.wb_dat_i[9]==1 && vif.`MON.wb_dat_i[10]==0) 
		begin
			if(vif.`MON.wb_dat_i[6:0]==0)  //CHAR LEN==0
			begin
			int x=127;
				repeat(128)
				begin	
				@(negedge vif.`MON.sclk_pad_o)
				txn.spi_miso[x]=vif.`MON.miso_pad_i;
				@(posedge vif.`MON.sclk_pad_o)
				txn.spi_mosi[x]=vif.`MON.mosi_pad_o;	
				x--;
				end
			end
			
			if(!vif.`MON.wb_dat_i[6:0]==0) //CHAR LEN !=0
			begin

				for(int i=vif.`MON.wb_dat_i[6:0];i>0;i--)
				begin
				@(negedge vif.`MON.sclk_pad_o)
				txn.spi_miso[i]=vif.`MON.miso_pad_i;
				@(posedge vif.`MON.sclk_pad_o)
				txn.spi_mosi[i]=vif.`MON.mosi_pad_o;	
				end
			end
		end
	
	//tx_neg=1 [10](mosi= posedge) rx_neg=0 [9](miso negedge)
	if(vif.`MON.wb_dat_i[9]==0 && vif.`MON.wb_dat_i[10]==1)
		begin
			if(vif.`MON.wb_dat_i[6:0]==0)  //CHAR LEN==0
			begin
			int x=127;
				repeat(128)
				begin
				@(negedge vif.`MON.sclk_pad_o)
				txn.spi_miso[x]=vif.`MON.miso_pad_i;
				@(posedge vif.`MON.sclk_pad_o)
				txn.spi_mosi[x]=vif.`MON.mosi_pad_o;	
				x--;
				end
			end
			
			if(!vif.`MON.wb_dat_i[6:0]==0) //CHAR LEN !=0
			begin

				for(int i=vif.`MON.wb_dat_i[6:0];i>0;i--)
				begin
				@(negedge vif.`MON.sclk_pad_o)
				txn.spi_miso[i]=vif.`MON.miso_pad_i;
				@(posedge vif.`MON.sclk_pad_o)
				txn.spi_mosi[i]=vif.`MON.mosi_pad_o;	
				end
			end
		end

end //LSB=0 end
end //GO BSY end
end //CTRL end
endtask

endclass