SPEC
DUT如下:
具体功能描述可参考ARM官方文档:AHB to APB sync-down bridge
验证框架图
测试点分解以及设计测试用例
测试点分解
- 对于APB端,APB2、APB3、APB4的信号都要测到。
- 在APB的时钟频率小于AHB的时钟频率时的频率范围。
- 传输过程中发生reset模块功能能否恢复。
- HADDR与PADDR的范围:0x0000~0xFFFF。
- 对于AHB来说,由HBURST[2:0]决定的八种不同的burst传输、HSIZE[2:0]决定的传输size以及write/read的排列组合。
- 由HTRANS[1:0]决定的transfer type。
- HPROT、HREADYOUT、HRESP的检查。
- 多个AHBtransfer连续传输检查。
- APBACTIVE检查。
- PSTRB、PPROT、PREADY、PSLVERR的检查。
- Parameter检查。
设计测试用例
- AHB端
- AHB Single Write32
- AHB Single Read32
- AHB Burst(HBURST[2:0]随机、HSIZE[2:0]随机、Data,Addr随机,Addr的边界值如0x0000,0xFFFF需覆盖、write/read操作随机、HPROT[3:0]随机。
将上述sequence进行组合,测试连续间断/不间断的AHB传输。
- APB端
- PREADY信号保持为1。
- PREADY信号为0,且持续随机个周期。
- PSLVERR信号保持为0
- PSLVERR信号拉高,且有效的位置随机。
- Parameter如ADDRWIDTH、REGISTER_RDATA、REGISTER_WDATA。
- AHB与APB的频率比:
2:1、3:1、4:1、8:1、16:1
具体的Sequence及testcase
Sequence
- AHB端
- ahbl_mst_single_write32_seq
class ahbl_mst_single_write32_seq extends ahbl_mst_basic_seq;
function new(string name = "ahbl_mst_single_write32_seq");
super.new(name);
endfunction
`uvm_object_utils(ahbl_mst_single_write32_seq)
virtual task body();
`uvm_do_with(req,{hsel == 1'b1;
htrans == ahbl_mst_pkg::NSEQ;
hsize == ahbl_mst_pkg::WORD;
hburst == ahbl_mst_pkg::SINGLE;
hwrite == 1'b1;})
endtask
endclass
- ahbl_mst_single_read32_seq
class ahbl_mst_single_read32_seq extends ahbl_mst_basic_seq;
function new(string name="ahbl_mst_single_read32_seq");
super.new(name);
endfunction
`uvm_object_utils(ahbl_mst_single_read32_seq)
virtual task body();
`uvm_do_with(req,{hsel == 1'b1;
htrans == ahbl_mst_pkg::NSEQ;
hsize == ahbl_mst_pkg::WORD;
hburst == ahbl_mst_pkg::SINGLE;
hwrite == 1'b0;})
endtask
endclass
- ahbl_mst_burst_seq
class ahbl_mst_burst_seq extends ahbl_mst_basic_seq;
function new(string name="ahbl_mst_burst_seq");
super.new(name);
endfunction
`uvm_object_utils(ahbl_mst_burst_seq)
virtual task body();
`uvm_do_with(req,{hsel == 1'b1;})
endtask
endclass
- APB端
- apb_slv_rdy_seq
class apb_slv_rdy_seq extends apb_slv_basic_seq;
function new(string name = "apb_slv_rdy_seq");
super.new(name);
endfunction
`uvm_object_utils(apb_slv_rdy_seq)
virtual task body();
`uvm_do_with(req,{slverr == 1'b0;
nready_num == 0;})
endtask
endclass
- apb_slv_nrdy_seq
class apb_slv_nrdy_seq extends apb_slv_basic_seq;
function new(string name="apb_slv_nrdy_seq");
super.new(name);
endfunction
`uvm_object_utils(apb_slv_nrdy_seq)
virtual task body();
`uvm_do_with(req,{slverr == 1'b0;
nready_num inside {[1:5]};})
endtask
endclass
- apb_slv_slverr_seq
class apb_slv_slverr_seq extends apb_slv_basic_seq;
function new(string name = "apb_slv_slverr_seq");
super.new(name);
endfunction
`uvm_object_utils(apb_slv_slverr_seq)
virtual task body();
`uvm_do_with(req,{slverr == 1'b1;
nready_num inside {[1:5]};})
endtask
endclass
testcase
- ahbl_mst_single_read32
- ahbl_mst_single_write32_apb_slv_nrdy
- ahbl_mst_burst
- ahbl_mst_burst_apb_slv_slverr
- ahbl_mst_tight_transfer
- …