作者 | SHA1 | 备注 | 提交日期 |
---|---|---|---|
|
21c59b9753 | seq | 1年前 |
|
9792b9ae88 | mounika_drv | 1年前 |
@@ -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 |