//driver class driver extends uvm_driver #(packet); `uvm_component_utils(driver) virtual axi_if vif; packet pkt; function new(string name="driver", uvm_component parent=null); super.new(name, parent); endfunction virtual function void build_phase(uvm_phase phase); super.build_phase(phase); pkt=packet::type_id::create("pkt"); if(!uvm_config_db#(virtual axi_if)::get(this,"","vif",vif)) `uvm_error("drv","Unable to access Interface"); endfunction task reset_dut(); repeat (2) begin //write address channel vif.awvalid <= 0; vif.awready <= 0; vif.awid <= 0; vif.awlen <= 0; vif.awsize <= 0; vif.awaddr <= 0; vif.awburst <= 0; //write data channel (w) vif.wvalid <= 0; vif.wready <= 0; vif.wid <= 0; vif.wdata <= 0; vif.wstrb <= 0; vif.wlast <= 0; //write response channel (b) vif.bready <= 0; vif.bvalid <= 0; vif.bid <= 0; vif.bresp <= 0; ///////////////read address channel (ar) vif.arvalid <= 0; vif.arready <= 0; vif.arid <= 0; vif.arlen <= 0; vif.arsize <= 0; vif.araddr <= 0; vif.arburst <= 0; /////////// read data channel (r) vif.rvalid <= 0; vif.rready <= 0; vif.rid <= 0; vif.rdata <= 0; vif.rstrb <= 0; vif.rlast <= 0; vif.rresp <= 0; //1 clk delay @(posedge vif.clk); `uvm_info(get_type_name(),"*** Reset Applied by driver ***",UVM_MEDIUM) end endtask task write(); if(pkt.op==WRITE) begin //write address channel vif.awvalid <= pkt.awvalid ; vif.awready <= pkt.awready ; vif.awid <= pkt.awid ; vif.awlen <= pkt.awlen ; vif.awsize <= pkt.awsize ; vif.awaddr <= pkt.awaddr ; vif.awburst <= pkt.awburst ; //write data channel (w) vif.wvalid <= pkt.wvalid ; vif.wready <= pkt.wready ; vif.wid <= pkt.wid ; vif.wdata <= pkt.wdata ; vif.wstrb <= pkt.wstrb ; vif.wlast <= pkt.wlast ; //write response channel (b) vif.bready <= pkt.bready ; vif.bvalid <= pkt.bvalid ; vif.bid <= pkt.bid ; //1 clk delay @(posedge vif.clk); `uvm_info(get_type_name(),"*** write signals are drived to DUT ***",UVM_MEDIUM) vif.bresp <= pkt.bresp ; end endtask task read(); if(pkt.op == READ)begin ///////////////read address channar) vif.arvalid <= pkt.arvalid ; vif.arready <= pkt.arready ; vif.arid <= pkt.arid ; vif.arlen <= pkt.arlen ; vif.arsize <= pkt.arsize ; vif.araddr <= pkt.araddr ; vif.arburst <= pkt.arburst ; /////////// read data channel (r) vif.rvalid <= pkt.rvalid ; vif.rready <= pkt.rready ; vif.rid <= pkt.rid ; vif.rdata <= pkt.rdata ; vif.rstrb <= pkt.rstrb ; vif.rlast <= pkt.rlast ; vif.rresp <= pkt.rresp ; //1 clk delay @(posedge vif.clk); `uvm_info(get_type_name(),"*** read signals are drived to DUT ***",UVM_MEDIUM) end endtask virtual task run_phase(uvm_phase phase); reset_dut(); forever begin seq_item_port.get_next_item(pkt); `uvm_info(get_type_name(),"*** Driver Received the transaction by sequencer ***",UVM_MEDIUM) if(pkt.op==RESET) begin reset_dut(); end //Write operation support else if(pkt.op == WRITE) begin write(); `uvm_info(get_type_name(),"*** WRITE packet is received in driver ***",UVM_MEDIUM) end else if(pkt.op == READ) begin read(); `uvm_info(get_type_name(),"*** READ packet is received in driver ***",UVM_MEDIUM) end //put read drive logic here seq_item_port.item_done(); end endtask endclass