|
- //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
-
|