覆盖率从大的方面分为两类,一类是功能覆盖率(function coverage),另一类是代码覆盖率(code coverage)。
其中功能覆盖率又分为覆盖点(coverage points)和断言(assertion)等,而代码覆盖率又分为行覆盖(line coverage),翻转覆盖(toggle coverage),分支覆盖(branch coverage),条件覆盖(condition coverage),状态机覆盖(FSM coverage)等。
行覆盖(line coverage):这个比较通俗易懂,即被测设备(Device Under Test)的每行代码都要被执行过(即覆盖)。如图1-1,这个模块共有8行代码需要被覆盖,而且实际这8行也都有被覆盖,所以这个模块的line coverage 就是100%。
翻转覆盖(toggle coverage):即DUT的每个模块的信号(包括端口信号和内部信号)都有被翻转过(即每一个信号都从0>1,1>0变化过)。如图1-2,我们可以看出rst_n这个信号只从0到1翻转过,但没有从1到0翻转过,所以这个信号没有被toggle。
分支覆盖(branch coverage):即DUT的所有模块的每个条件分支否有被执行过(包括if,else和case等),如图1-3,即为一个branch ,共两个覆盖点,一个if ,一个else。而这两个分支也都有被覆盖,即它的branch coverage也是100%。
条件覆盖(condition coverage):这个和分支覆盖容易混淆,条件覆盖指可能进入某个分支的所有条件的组合都应该被遍历到。如图1-4,可能进入这个分支的情况共有三种组合,分别为count<8'h05成立,但rst_n不成立;count<8'h05不成立,但rst_n成立;count<8'h05,和rst_n都成立。在这里三种情况也都有被遍历 ,所以这个分支的条件覆盖率也为100%。
状态机覆盖(FSM coverage):这个也比较好理解,即状态机里所有可能发生的状态跳转都要被遍历到。如图1-5,所有状态机的可能发生的跳转状态为6种,但实际上只发生了4种状态跳转,所以这个状态机的覆盖率为66.67%。
覆盖率用于衡量test case的质量和衡量IP(或SOC)的验证充分程度,理论上code coverage要达到100%,但随着IP和SOC的复杂程度的增加,这几乎是一个不可能完成的事情,所以不同公司对代码覆盖率最终要达到的百分比要求也不一样。通过coverage的分析,可以找到DUT里还没有覆盖的一些盲点,可以通过修改或增加test case的方式去覆盖那些盲点,当然如果有盲点无法被test case覆盖,也可以通过文档记录的方式,将不可覆盖的原因记录下来。
自检:self-testing
探索测试:exploratory testing
黑盒测试:black-box testing
白盒测试:white-box testing
嵌入式处理器:Embedded Processor