class axi_driver extends uvm_driver; `uvm_component_utils(axi_driver) seq_item s; virtual interface vif; int lower_boundary; int upper_boundary; function new(string name="driver",uvm_component parent); super.new(name,parent); endfunction function void build_phase(uvm_component phase); super.build_phase(phase); if(!uvm_config_db(virtual intf)::get(this," ","vif",vif); `uvm_fatal("driver interface failed"); endfunction task run_phase(uvm_phase phase); forever begin s = seq_item::type_id::create("s"); seq_item_port.get_next_item(s); drive_logic(s); seq_item_port.item_done(); end endtask task drive_logic(); reset(); fork write_address(); write_data(); write_response(); read_address(); read_data(); join endtask task reset(); @(posedge vif.clk) vif.awid <= 0; vif.awaddr <= 0; vif.awlen <= 0; vif.awsize <= 0; vif.awburst <= 0; vif.awvalid <= 0; vif.awready<=0 vif.wid <= 0; vif.wdata <= 0; vif.wstrobe <= 0; vif.wlast <= 0; vif.wvalid <= 0; vif.wready<=0; vif.bid <= 0; vif.bresp <= 0; vif.bvalid <=0; vif.bready <=0; vif.arid <= 0; vif.araddress <= 0; vif.arlen <= 0; vif.arsize <= 0; vif.arburst <= 0; vif.arvalid <= 0; vif.arready<=0 vif.rid <= 0; vif.rdata <= 0; vif.rlast <= 0; vif.rvalid <= 0; vif.rready<=0; endtask task write_address(); @(posedge vif.clk) if(wr_rd==1) vif.awid <= s.awid; vif.awaddr <= s.awaddr; if(awburst==2'b01) awaddr<=awaddr+(2**awsize); if(awburst==2'b10) begin lower_boundary<=(awaddr%((awlen+1)(2**awsize)))*((awlen+1)(2**awsize)); upper_boundary<=lower_boundary+((awlen+1)(2**awsize)); end vif.awlen <= s.awlen; vif.awsize <= s.awsize; vif.awburst <= s.awburst; vif.awvalid <= 1; @(posedge vif.clk) wait(vif.awready) vif.awvalid <= 0; endtask task write_data(); @(posedge vif.clk) vif.wid <= s.wid; vif.wdata <= s.wdata[i]; vif.wstrobe <= s.wstrobe[i]; vif.wlast <= s.wlast; vif.wvalid <= 1; for(int i=0;i