2 Revīzijas

Autors SHA1 Ziņojums Datums
  mounika 21c59b9753 seq pirms 5 mēnešiem
  mounika 9792b9ae88 mounika_drv pirms 5 mēnešiem
2 mainītis faili ar 269 papildinājumiem un 0 dzēšanām
Dalītais skats
  1. +152
    -0
      axi_drv.sv
  2. +117
    -0
      axi_seq.sv

+ 152
- 0
axi_drv.sv Parādīt failu

@@ -0,0 +1,152 @@
class axi_drv extends uvm_driver#(axi_seq_item)

`uvm_components_utils(axi_drv)

virtual intf vif;
axi_seq_item txn;

int [31:0] temp[];

function new(string name="axi_drv",uvm_component parent);
super.new(name.parent);
endfunction

function void build_phase(uvm_phase phase);

uvm_config_db#(virtual intf)::get(this,"",vif,vif);
txn=axi_seq_item::type_id::create(txn);

endfunction

task run_phase(uvm_phase phase);
begin
get_next_item(txn);
drive(txn);
item_done();
endtask

task drive(txn);

fork
// reset();
write_add(txn);
write_data(txn);
read_add(txn);
join
endtask

///////////////write addr///////////

task write_add(txn);
int lower_wrap_boundary;
int upper_wrap_boundary;
int burst_len,burst_size;
int total_trans;
if(txn.write==1)
begin
@(vif.clk);
vif.awid<=txn.awid;
vif.awlen<=txn.awlen;
vif.awsize<=txn.awsize;
vif.awburst<=txn.awburst;

/////////fixed burst/////////////

if(txn.awburst==2'b00)
begin
vif.awaddr<=txn.awaddr;
end

/////////////incr burst//////////////
else if(txn.awaddr==2'b01)
begin
vif.awaddr<=txn.awaddr;
for(int i=0;i<awlen;i++)
begin
vif.awaddr<=txn.awaddr+(2**awsize);
end
end

//////////////////////wrap burst//////////

else if(txn.awaddr==2'b10)
begin
if(awaddr%(2**awsize==0))
begin
burst_len=awlen+1;
burst_size=2**awsize;
total_trans=burst_len*burst_size;

lower_wrap_boundary=int'(awaddr/total_trans)*total_trans;
upper_wrap_boundary=lower_wrap_boundary+total_trans;
end
end
vif.awvalid<=1;
wait(vif.awready);
@(vif.clk);
vif.awvalid<=0;
end

endtask

//////////////write data///////////////

task write_data(txn);
begin
temp=new[txn.awlen+1];

forech(txn.wdata[i][j])
begin
temp[i][8*j+:8]=data[i][j];
end

for(i=0;i<awlen+1;i++)
begin

@(vif.clk);
vif.wid<=txn.wid;
vif.wdata<=temp[i];
vif.wlast<=(awlen==i)?1:0;
end
vif.wvalid<=1;
wait(vif.wready)
@(vif.clk);
vif.wvalid<=0;
end
endtask

///////////read addr///////////
task read_add(txn);
begin
if(!txn.write)
begin
@(vif.clk);
vif.arid<=txn.arid;
vif.araddr<=txn.araddr;
vif.arlen<=txn.arlen;
vif.arsize<=txn.arsize;
vif.arburst<=txn.arburst;
vif.arvalid<=1;
wait(vif.arready);
@(vif.clk);
vif.arvalid<=0;
end
end
endtask


endclass








+ 117
- 0
axi_seq.sv Parādīt failu

@@ -0,0 +1,117 @@

//write sequence
class axi_wr_seq extends uvm_sequence #(axi_seq_item);
`uvm_object_utils(axi_wr_seq)

seq_item txn;

function new(string name="axi_wr_seq");
super.new(name);
endfunction

task body();
txn=seq_item::type_id::create(txn);
start_item(txn);
assert(txn.randomize() with {txn.write==1;txn.awaddr==0x04;txn.wdata==0x2b1a;});
finish_item(txn);
endtask

endclass

//read sequence
class axi_rd_seq extends uvm_sequence #axi_(seq_item);
`uvm_object_utils(axi_rd_seq)

seq_item txn;

function new(string name="axi_rd_seq");
super.new(name);
endfunction

task body();
txn=seq_item::type_id::create(txn);
start_item(txn);
assert(txn.randomize() with {txn.write==0;txn.araddr==0x04;});
finish_item(txn);
endtask

endclass

//unaligned sequence
class axi_rd_seq extends uvm_sequence #(axi_seq_item);
`uvm_object_utils(axi_rd_seq)

seq_item txn;

function new(string name="axi_rd_seq");
super.new(name);
endfunction

task body();
txn=seq_item::type_id::create(txn);
// if(txn.awaddr%2**awsize!=0)
// begin
txn.aligned_addr.constraint_mode(0);
// end
start_item(txn);
assert(txn.randomize() with {txn.write==1;txn.awaddr==0x07;txn.awsize==3;});
finish_item(txn);
endtask

endclass


//locked access sequence
class axi_locked_access_seq extends uvm_sequence #(axi_seq_item);
`uvm_object_utils(axi_locked_acess_seq)

seq_item txn;

function new(string name="axi_locked_access_seq");
super.new(name);
endfunction

task body();
begin
txn=seq_item::type_id::create(txn);
start_item(txn);
assert(txn.randomize() with {txn.write==1;txn.awaddr==0x04;txn.awlock==2'b10;txn.awid==01;});
finish_item(txn);
end

begin
txn=seq_item::type_id::create(txn);
start_item(txn);
assert(txn.randomize() with {txn.write==1;txn.awaddr==0x04;txn.awlock==2'b10;txn.awid==02;});
finish_item(txn);
end


endtask

endclass



//write read sequence
class axi_rd_seq extends uvm_sequence #(axi_seq_item);
`uvm_object_utils(axi_rd_seq)

seq_item txn;
axi_wr_seq wr_seq;
axi_rd_seq rd_seq;


function new(string name="axi_rd_seq");
super.new(name);
endfunction

task body();
begin
txn=seq_item::type_id::create(txn);
`uvm_do(wr_seq);
`uvm_do(rd_seq);
end
endtask

endclass

Notiek ielāde…
Atcelt
Saglabāt