Ver a proveniência

axi_driver

master
gandra_pravalika há 4 meses
ascendente
cometimento
877176c8c8
1 ficheiros alterados com 195 adições e 0 eliminações
  1. +195
    -0
      axi_driver.sv.txt

+ 195
- 0
axi_driver.sv.txt Ver ficheiro

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
















Carregando…
Cancelar
Guardar