class driver extends uvm_driver #(wrap_txn); `uvm_component_utils(driver) virtual axi_if vif; wrap_txn txn; function new(string name ="driver",uvm_component parent); suoer.new(name,parent); endfunction function void build_phase(uvm_phase phase); super.build_phase(phase); txn = wrap_txn::type_id::create("txn",this); if(!uvm_config_db #(axi_if)::get(this,"","vif",vif)) `uvm_error("build phase","driver virtual interface failed") endfunction task run_phase(uvm_phase phase); forever begin seq_item_port.get_next_item(txn); drive_logic(txn); seq_item_port.item_done(); end endtask task drve_logic(wrap_txn txn); begin `uvm_info("AXI_DRIVER",$sformatf("driver started"),UVM_LOW); @(vif.drv_cb); vif.arst<=1; @(vif.drv_cb); vif.arst<=0; if(wr_rd <= 1) begin vif.awid <= txn.awid; vif.awaddr<= txn.awaddr; vif.awburst <= txn.awburst; vif.awsize <= txn.awsize; vif.awlen <= txn.awlen; vif.awlock <= txn.awlen; vif.awprot <= txn.awprot; vif.awcache<= txn.awcache; vif.awvalid <= 1; wait(vif.drv_cb.awready == 1); vif.awvalid <= 0; @(vif.drv_cb); for(int i =1;i<=vif.awlen+1;i++) begin vif.wid <= txn.wid; vif.wdata<= txn.wdata.pop_front(); vif.wstrb <= txn.wstrb; vif.awvalid <= 1; if(i == vif.awlen+1) vif.wlast <= txn.wlast; else vif.wlast <= 0; wait(vif.wready == 1); vif.wvalid <= 0; end @(vif.drv_cb); vif.bid <= txn.bid; vif.bresp <= txn.bresp; vif.bvalid <= 1; wait(vif.bready == 1); vif.bvalid <= 0; end else begin vif.arid <= txn.arid; vif.araddr<= txn.araddr; vif.arburst <= txn.arburst; vif.arsize <= txn.arsize; vif.arlen <= txn.arlen; vif.arlock <= txn.arlen; vif.arprot <= txn.arprot; vif.arcache<= txn.arcache; vif.arvalid <= 1; wait(vif.drv_cb.arready == 1); vif.arvalid <= 0; @(vif.drv_cb); end end endtask