SPI read data

In reply to Sandeep Gaur:

Few changes are need in your code:

  1. driver : driver need to send the response back
  2. sequence : sequence need to collect the response for each transaction

//Change in driver
forever
begin //{
spi_trans spi_seq_item;

seq_item_port.get_next_item(spi_seq_item);

/*...other code ... */

//Need to send the response back which have read data 
//seq_item_port.item_done();
seq_item_port.item_done(spi_seq_item);

end //}


//change in sequence
class spi_sequence extends uvm_sequence#(spi_trans);

/*...other code ... */

   task body();
        spi_trans spi_seq_item;

        for(int i=0; i<2; i=i+1)
        begin //{
            spi_seq_item = spi_trans::type_id::create("spi_seq_item");
            start_item(spi_seq_item);
            case(i)
              0 : begin //{
              void'(spi_seq_item.randomize() with {pkt_type == WRITE; bit_order == MSB; mode == MODE0; address == 'h01F0; write_data == 'hAAAA_5555; });
              end //}
              1 : begin //{
              void'(spi_seq_item.randomize() with {pkt_type == READ; bit_order == MSB; mode == MODE0; address == 'h01F0; });
              end //}
            endcase

            `uvm_info(get_type_name(),$sformatf("SEQ_0: Write and read spi_seq_item.write_data : %0h spi_seq_item.read_data : %0h spi_seq_item.address : %0h", spi_seq_item.write_data, spi_seq_item.read_data, spi_seq_item.address),UVM_LOW)

            finish_item(spi_seq_item);

            //#10000ns;
            //change : Need to collect the responce back for each transaction
            get_response(rsp);
            
            //This is not require if you use rsp.read_data, rsp.address etc. 
            $cast(spi_seq_item,rsp);


            `uvm_info(get_type_name(),$sformatf("SEQ_1: Write and read spi_seq_item.write_data : %0h spi_seq_item.read_data : %0h spi_seq_item.address : %0h", spi_seq_item.write_data, spi_seq_item.read_data, spi_seq_item.address),UVM_LOW)

        end //}

   endtask : body
endclass : spi_sequence