功能覆盖率一般分为两种
- 面向数据的覆盖率
- 面向控制的覆盖率
面向数据的覆盖率:通过编写覆盖组(coverage groups)、覆盖点(coverage points)、交叉覆盖(cross coverage)等来获得面向数据的覆盖率。
面向控制的覆盖率:一般通过编写SVA获得断言覆盖率
功能覆盖率的编写要全面,涉及到功能的方方面面都要覆盖到。
以scoreboard为例,说明面向数据的覆盖率的一种写法,在组件内定义覆盖组,写default值检测那个,test_00_sequence。
test_00_sequence主要是测定DUT内部寄存器的default值与设计文档中的是否一致,覆盖组中应该存在类型为“R”寄存器的地址以及相应数据等等。
covergroup dog_cov_sequence_00;
coverpoint addr{
bins dog_LOAD ={32'h000};
bins dog_VALUE={32'h004};
bins dog_CTRL ={32'h008};
bins dog_RIS ={32'h010};
bins dog_MIS ={32'h014};
bins dog_LOCK ={32'hC00};
bins dog_ITCR ={32'hF00};
bins dog_PERIPHID4 ={32'hFD0};
bins dog_PERIPHID5 ={32'hFD4};
bins dog_PERIPHID6 ={32'hFD8};
bins dog_PERIPHID7 ={32'hFDC};
bins dog_PERIPHID0 ={32'hFE0};
bins dog_PERIPHID1 ={32'hFE4};
bins dog_PERIPHID2 ={32'hFE8};
bins dog_PERIPHID3 ={32'hFEC};
bins dog_PCELLID0 ={32'hFF0};
bins dog_PCELLID1 ={32'hFF4};
bins dog_PCELLID2 ={32'hFF8};
bins dog_PCELLID3 ={32'hFFC};
}
coverpoint data{
bins load ={32'hFFFFFFFF};
bins value ={32'hFFFFFFFF};
bins control ={32'hFFFFFFFF};
bins ris ={32'h0};
bins mis ={32'h0};
bins lock ={32'h0};
bins itcr ={32'h0};
//
bins periphid4 ={32'h04};
bins periphid5 ={32'h0};
bins periphid6 ={32'h0};
bins periphid7 ={32'h0};
bins periphid0 ={32'h24};
bins periphid1 ={32'hB8};
bins periphid2 ={32'h1B};
bins periphid3 ={32'hB0};
//
bins pcellid0 ={32'h0D};
bins pcellid1 ={32'hF0};
bins pcellid2 ={32'h05};
bins pcellid3 ={32'hB1};
}
endgroup:dog_cov_sequence_00
这种是比较清晰简单的写法,test_sequence_00中涉及到的数据以及地址都写一下。
在scoreboard中,如果比对通过,那么就去采样,触发覆盖组,看是否所有数据都能击中仓。将transaction中的PADDR和PRDATA给到addr和data,或者直接写trans.PADDR和trans.PRDATA。
然后可以在report_phase中使用get_coverage()去拿到它的一个覆盖率。
//dog_cov_sequence_00.get_coverage()在report_phase中
UVM_INFO ../env/wdog_scoreboard.sv(137) @ 705000: uvm_test_top.env.scb [wdog_scoreboard] report_phase Enter...
dog_coverage is 100.000000
UVM_INFO ../env/wdog_scoreboard.sv(140) @ 705000: uvm_test_top.env.scb [wdog_scoreboard] report_phase Exiting...
dog_coverage的覆盖率是100%。
同样,也可以通过firefox查看它的覆盖率。需要在Makefile中添加如下语句生成report报告并用firefox查看报告。
使用urg命令将coverage数据转成html urg -dir simv.vdb&,生成Urgreport目录。并调用firefox查看覆盖率报告。firefox Urgreport/groups.html&w
通过覆盖率报告可以查看到,所有仓的数据都被打到了。以上就是写覆盖组到查覆盖率报告的一个基本流程。
未完。。。