| @@ -1,144 +0,0 @@ | |||
| //driver | |||
| class driver extends uvm_driver #(packet); | |||
| `uvm_component_utils(driver) | |||
| virtual axi_if vif; | |||
| packet pkt; | |||
| function new(string name="driver", uvm_component parent=null); | |||
| super.new(name, parent); | |||
| endfunction | |||
| virtual function void build_phase(uvm_phase phase); | |||
| super.build_phase(phase); | |||
| pkt=packet::type_id::create("pkt"); | |||
| if(!uvm_config_db#(virtual axi_if)::get(this,"","vif",vif)) | |||
| `uvm_error("drv","Unable to access Interface"); | |||
| endfunction | |||
| task reset_dut(); | |||
| repeat (2) begin | |||
| //write address channel | |||
| vif.awvalid <= 0; | |||
| vif.awready <= 0; | |||
| vif.awid <= 0; | |||
| vif.awlen <= 0; | |||
| vif.awsize <= 0; | |||
| vif.awaddr <= 0; | |||
| vif.awburst <= 0; | |||
| //write data channel (w) | |||
| vif.wvalid <= 0; | |||
| vif.wready <= 0; | |||
| vif.wid <= 0; | |||
| vif.wdata <= 0; | |||
| vif.wstrb <= 0; | |||
| vif.wlast <= 0; | |||
| //write response channel (b) | |||
| vif.bready <= 0; | |||
| vif.bvalid <= 0; | |||
| vif.bid <= 0; | |||
| vif.bresp <= 0; | |||
| ///////////////read address channel (ar) | |||
| vif.arvalid <= 0; | |||
| vif.arready <= 0; | |||
| vif.arid <= 0; | |||
| vif.arlen <= 0; | |||
| vif.arsize <= 0; | |||
| vif.araddr <= 0; | |||
| vif.arburst <= 0; | |||
| /////////// read data channel (r) | |||
| vif.rvalid <= 0; | |||
| vif.rready <= 0; | |||
| vif.rid <= 0; | |||
| vif.rdata <= 0; | |||
| vif.rstrb <= 0; | |||
| vif.rlast <= 0; | |||
| vif.rresp <= 0; | |||
| //1 clk delay | |||
| @(posedge vif.clk); | |||
| `uvm_info(get_type_name(),"*** Reset Applied by driver ***",UVM_MEDIUM) | |||
| end | |||
| endtask | |||
| task write(); | |||
| if(pkt.op==WRITE) | |||
| begin | |||
| //write address channel | |||
| vif.awvalid <= pkt.awvalid ; | |||
| vif.awready <= pkt.awready ; | |||
| vif.awid <= pkt.awid ; | |||
| vif.awlen <= pkt.awlen ; | |||
| vif.awsize <= pkt.awsize ; | |||
| vif.awaddr <= pkt.awaddr ; | |||
| vif.awburst <= pkt.awburst ; | |||
| //write data channel (w) | |||
| vif.wvalid <= pkt.wvalid ; | |||
| vif.wready <= pkt.wready ; | |||
| vif.wid <= pkt.wid ; | |||
| vif.wdata <= pkt.wdata ; | |||
| vif.wstrb <= pkt.wstrb ; | |||
| vif.wlast <= pkt.wlast ; | |||
| //write response channel (b) | |||
| vif.bready <= pkt.bready ; | |||
| vif.bvalid <= pkt.bvalid ; | |||
| vif.bid <= pkt.bid ; | |||
| //1 clk delay | |||
| @(posedge vif.clk); | |||
| `uvm_info(get_type_name(),"*** write signals are drived to DUT ***",UVM_MEDIUM) | |||
| vif.bresp <= pkt.bresp ; end | |||
| endtask | |||
| task read(); | |||
| if(pkt.op == READ)begin | |||
| ///////////////read address channar) | |||
| vif.arvalid <= pkt.arvalid ; | |||
| vif.arready <= pkt.arready ; | |||
| vif.arid <= pkt.arid ; | |||
| vif.arlen <= pkt.arlen ; | |||
| vif.arsize <= pkt.arsize ; | |||
| vif.araddr <= pkt.araddr ; | |||
| vif.arburst <= pkt.arburst ; | |||
| /////////// read data channel (r) | |||
| vif.rvalid <= pkt.rvalid ; | |||
| vif.rready <= pkt.rready ; | |||
| vif.rid <= pkt.rid ; | |||
| vif.rdata <= pkt.rdata ; | |||
| vif.rstrb <= pkt.rstrb ; | |||
| vif.rlast <= pkt.rlast ; | |||
| vif.rresp <= pkt.rresp ; | |||
| //1 clk delay | |||
| @(posedge vif.clk); | |||
| `uvm_info(get_type_name(),"*** read signals are drived to DUT ***",UVM_MEDIUM) | |||
| end | |||
| endtask | |||
| virtual task run_phase(uvm_phase phase); | |||
| reset_dut(); | |||
| forever begin | |||
| seq_item_port.get_next_item(pkt); | |||
| `uvm_info(get_type_name(),"*** Driver Received the transaction by sequencer ***",UVM_MEDIUM) | |||
| if(pkt.op==RESET) begin | |||
| reset_dut(); | |||
| end | |||
| //Write operation support | |||
| else if(pkt.op == WRITE) begin | |||
| write(); | |||
| `uvm_info(get_type_name(),"*** WRITE packet is received in driver ***",UVM_MEDIUM) | |||
| end | |||
| else if(pkt.op == READ) begin | |||
| read(); | |||
| `uvm_info(get_type_name(),"*** READ packet is received in driver ***",UVM_MEDIUM) | |||
| end | |||
| //put read drive logic here | |||
| seq_item_port.item_done(); | |||
| end | |||
| endtask | |||
| endclass | |||