| @@ -0,0 +1,195 @@ | |||
| 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<awlen+1;i=i+1) | |||
| begin | |||
| if(i==awlen+1) | |||
| vif.wlast <= 1; | |||
| @(posedge vif.clk) | |||
| wait(vif.wready) | |||
| vif.wvalid<=0; | |||
| vif.wlast <= 0; | |||
| end | |||
| endtask | |||
| task write_response(); | |||
| @(posedge vif.clk) | |||
| vif.bid <= s.bid; | |||
| vif.bresp <= s.bresp; | |||
| vif.bvalid <= 1; | |||
| @(posedge vif.clk) | |||
| wait(vif.bready) | |||
| vif.bvalid<=0; | |||
| endtask | |||
| task read_address(); | |||
| @(posedge vif.clk) | |||
| if(wr_rd==0) | |||
| vif.arid <= s.arid; | |||
| vif.araddr <= s.araddr; | |||
| if(arburst==2'b01) | |||
| araddr<=araddr+(2**arsize); | |||
| if(arburst==2'b10) | |||
| begin | |||
| lower_boundary<=(araddr%((arlen+1)(2**arsize)))*((arlen+1)(2**arsize)); | |||
| upper_boundary<=lower_boundary+((arlen+1)(2**arsize)); | |||
| end | |||
| vif.arlen <= s.arlen; | |||
| vif.arsize <= s.arsize; | |||
| vif.arburst <= s.arburst; | |||
| vif.arvalid <= 1; | |||
| @(posedge vif.clk) | |||
| wait(vif.arready) | |||
| vif.arvalid <= 0; | |||
| endtask | |||
| task read_data(); | |||
| @(posedge vif.clk) | |||
| vif.rid <= s.rid; | |||
| vif.rdata <= s.rdata; | |||
| vif.rlast <= s.rlast; | |||
| vif.rresp <= s.rresp; | |||
| vif.rvalid <= 1; | |||
| for(int i=0;i<=arlen+1;i=i+1) | |||
| begin | |||
| if(i==arlen+1) | |||
| vif.rlast <= 1; | |||
| @(posedge vif.clk) | |||
| wait(vif.rready) | |||
| vif.rvalid<=0; | |||
| vif.rlast <= 0; | |||
| end | |||
| endtask | |||
| endclass | |||