| @@ -0,0 +1,124 @@ | |||||
| class axi_drv extends uvm_driver#(axi_trans); | |||||
| `uvm_component_utils(axi_drv) | |||||
| virtual axi_if vif; | |||||
| axi_trans tnx; | |||||
| function new(string name="axi_drv",uvm_component parent); | |||||
| super.new(name,parent); | |||||
| endfunction | |||||
| function void build_phase(uvm_phase phase); | |||||
| super.build_phase(phase); | |||||
| if(!uvm_config_db#(virtual axi_if)::get(this,"","vif",vif)) | |||||
| `uvm_error("build_phase","driver virtual interface failed"); | |||||
| endfunction | |||||
| task run_phase(uvm_phase phase); | |||||
| `uvm_info("UVM_DRIVER",$sformatf("driver main phase ended"),UVM_LOW); | |||||
| forever | |||||
| begin | |||||
| seq_item_port.get_next_item(tnx); | |||||
| drive(tnx); | |||||
| seq_item_port.item_done(); | |||||
| end | |||||
| endtask | |||||
| task driver(); | |||||
| begin | |||||
| axi_write_address(); | |||||
| axi_write_data(); | |||||
| axi_write_resp(); | |||||
| axi_read_address(); | |||||
| axi_read_data(); | |||||
| end | |||||
| endtask | |||||
| task axi_write_addr(axi_trans txn); | |||||
| $display("start of drive_awaddr"); | |||||
| vif.drv_cb.AWVALID <= 1; | |||||
| vif.drv_cb.AWADDR <= txn.AWADDR; | |||||
| vif.drv_cb.AWSIZE <= txn.AWSIZE; | |||||
| vif.drv_cb.AWID <= txn.AWID; | |||||
| vif.drv_cb.AWLEN <= txn.AWLEN; | |||||
| vif.drv_cb.AWBURST <= txn.AWBURST; | |||||
| @(vif.drv_cb); | |||||
| wait(vif.drv_cb.AWREADY) | |||||
| vif.drv_cb.AWVALID <= 0; | |||||
| repeat | |||||
| @(vif.drv_cb); | |||||
| $display("end of drive_awaddr"); | |||||
| endtask | |||||
| task axi_write_data(axi_trans txn); | |||||
| $display("start of drive_wdata"); | |||||
| foreach(txn.WDATA[i]) | |||||
| begin | |||||
| vif.drv_cb.WVALID <= 1; | |||||
| vif.drv_cb.WDATA <= txn.WDATA[i]; | |||||
| vif.drv_cb.WSTRB <= txn.WSTRB[i]; | |||||
| vif.drv_cb.WID <= txn.WID; | |||||
| if(i==(txn.AWLEN)) | |||||
| vif.drv_cb.WLAST <= 1; | |||||
| else | |||||
| vif.drv_cb.WLAST <= 0; | |||||
| @(vif.drv_cb); | |||||
| wait(vif.drv_cb.WREADY) | |||||
| vif.drv_cb.WVALID <= 0; | |||||
| vif.drv_cb.WLAST <= 0; | |||||
| repeat | |||||
| @(vif.drv_cb); | |||||
| end | |||||
| $display("end of drive_wdata"); | |||||
| endtask | |||||
| task axi_write_resp(axi_trans txn); | |||||
| $display("start of drive_bresp"); | |||||
| foreach(tnx.) | |||||
| vif.drv_cb.BREADY<=1; | |||||
| @(vif.drv_cb) | |||||
| wait(vif.drv_cb.BVALID) | |||||
| vif.drv_cb.BREADY<=0; | |||||
| repeat | |||||
| @(vif.drv_cb); | |||||
| $display("end of drive_bresp"); | |||||
| endtask | |||||
| /* task drive(axi_trans trans); | |||||
| begin | |||||
| `uvm_info("UVM_DRIVER",$sformatf("driver run driver task entered"),UVM_LOW); | |||||
| @(this.vif.drv_cb); | |||||
| `uvm_info("UVM_DRIVER",$sformatf("driver run drive task ended"),UVM_LOW); | |||||
| end | |||||
| endtask | |||||
| endclass*/ | |||||