diff --git a/axi_driver.sv b/axi_driver.sv new file mode 100644 index 0000000..ec0ecc2 --- /dev/null +++ b/axi_driver.sv @@ -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*/