`timescale1ns/1ps`include"uvm_macros.svh"importuvm_pkg::*;classpush_itemextendsuvm_sequence_item;intvalue;functionnew(stringname="item");super.new(name);endfunctionendclassclasspush_catcherextendsuvm_report_catcher;intfull_errors;functionnew();super.new("push_catcher");endfunctionfunctionaction_ecatch();if(get_id()=="SQRSNDREQGNI")beginfull_errors++;// Keep observing after the known fatal; this is test instrumentation only.returnCAUGHT;endreturnTHROW;endfunctionendclassclasspush_sequenceextendsuvm_sequence#(push_item);bitcompleted;functionnew(stringname="seq");super.new(name);endfunctiontaskbody();for(inti=1;i<=2;i++)beginreq=new();req.value=i;start_item(req);finish_item(req);endcompleted=1;endtaskendclassclasspush_sinkextendsuvm_component;uvm_blocking_put_imp#(push_item,push_sink)input_port;intvalues[$];functionnew(stringname,uvm_componentparent);super.new(name,parent);input_port=new("input_port",this);endfunctiontaskput(push_itemitem);values.push_back(item.value);#1;endtaskendclassclassrepaired_push_sequencerextendsuvm_push_sequencer#(push_item);functionnew(stringname,uvm_componentparent);super.new(name,parent);endfunctiontaskrun_phase(uvm_phasephase);push_itemitem;if(!$test$plusargs("MIGRATED"))super.run_phase(phase);elseforeverbegin`ifdefREVIEW_UVM20m_safe_select_item(0,item);sequence_item_requested=0;// Consume the request peeked by m_safe_select_item before selecting again.if(!m_req_fifo.try_get(item))`uvm_fatal("PUSH_DRAIN","No selected item")`elsem_select_sequence();m_req_fifo.get(item);`endifreq_port.put(item);m_wait_for_item_sequence_id=item.get_sequence_id();m_wait_for_item_transaction_id=item.get_transaction_id();endendtaskendclassclasspush_testextendsuvm_test;`uvm_component_utils(push_test)repaired_push_sequencersqr;push_sinksink;functionnew(stringname,uvm_componentparent);super.new(name,parent);endfunctionfunctionvoidbuild_phase(uvm_phasephase);super.build_phase(phase);sqr=new("sqr",this);sink=new("sink",this);endfunctionfunctionvoidconnect_phase(uvm_phasephase);sqr.req_port.connect(sink.input_port);endfunctiontaskrun_phase(uvm_phasephase);push_sequencesequence_value=new();push_catchercatcher=new();uvm_report_cb::add(sqr,catcher);phase.raise_objection(this);forksequence_value.start(sqr);join_none#10;$display("REVIEW|push_count|%0d",sink.values.size());$display("REVIEW|push_first|%0d",sink.values.size()>0?sink.values[0]:-1);$display("REVIEW|push_second|%0d",sink.values.size()>1?sink.values[1]:-1);$display("REVIEW|sequence_completed|%0d",sequence_value.completed);$display("REVIEW|request_fifo_full_errors|%0d",catcher.full_errors);sequence_value.kill();$display("REVIEW|done|1");phase.drop_objection(this);endtaskendclassmodulepush_probe;initialrun_test("push_test");endmodule