From 877176c8c8f82ca68db6505a63315bebd4fc8167 Mon Sep 17 00:00:00 2001 From: gandra_pravalika Date: Fri, 10 May 2024 07:33:25 +0100 Subject: [PATCH] axi_driver --- axi_driver.sv.txt | 195 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 195 insertions(+) create mode 100644 axi_driver.sv.txt diff --git a/axi_driver.sv.txt b/axi_driver.sv.txt new file mode 100644 index 0000000..766560e --- /dev/null +++ b/axi_driver.sv.txt @@ -0,0 +1,195 @@ + +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