Author | SHA1 | Message | Date |
---|---|---|---|
|
21c59b9753 | seq | 1 year ago |
|
9792b9ae88 | mounika_drv | 1 year ago |
@@ -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 | |||||
@@ -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 |