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