Friday, April 20, 2018

SPI UVM Adapter


class spi_reg_adapter extends uvm_reg_adapter;
   const string REPORT_TAG = "SPI_REG_ADAPTER";
  `uvm_object_utils(spi_reg_adapter)
function new (string name = "spi_reg_adapter");
     super.new(name);
    `uvm_info(REPORT_TAG, $sformatf("%m", UVM_NONE)
      provides_responses =1;
 endfunction

virtual function uvm_sequence_item reg2bus (cont ref uvm_reg_bus_op rw);
spi_seq_item spi_req;
spi_req = spi_seq_item::type_id::create("spi_reg");
spi_req.inc=0;
spi_req.data_size = 1;
spi_req.address = rw.addr;
if(rw.kind == UVM_READ) begin
    spi_req.cmd_val = 0;
 end
else begin
 spi_req.cmd_val = 1;
 spi_req.data_wr[0] = rw.data;
end
return spi_req;

endfunction

   

virtual function void bus2reg (uvm_sequence_item bus_item, cont ref uvm_reg_bus_op rw);
spi_seq_item spi_req;
spi_req = spi_seq_item::type_id::create("spi_reg");

if(!$cast(spi_req, bus_item)) begin
 `uvm_fatal()

 rw.addr = spi_req.address ;
rw.kind = spi_req.cmd_val? UVM_WRITE: UVM_READ;

if(rw.kind == UVM_READ) begin
    rw.data = spi_req.data_rd[0];
 end

if(rw.kind == UVM_WRITE) begin
    rw.data = spi_req.data_wr[0];
 end
   
rw.status = UVM_IS_OK;

endfunction


endclass

No comments: