前言:随着验证方法学的发展,覆盖率作为一种判断验证充分性的手段已成为验证工作的主导。绝大多数验证工程师会将覆盖率分为两大类:代码覆盖率和功能覆盖率。本文主要介绍有关代码覆盖率的概念。
代码覆盖率
代码覆盖率是衡量验证进展的最简易的方式。它的作用是检查代码是否冗余,设计要点是否遍历,被检测的对象是RTL代码,而代码覆盖率的检测一般由工具自动生成的,不需要自定义收集条件。代码覆盖率主要包括以下几种:
1.行覆盖率(Line coverage)
行覆盖率度量的是多少行代码已经被执行过。比如,你有100行代码,执行了90行,那么覆盖率就是90%。
2.分支覆盖率(Branch coverage)
分支覆盖率衡量的是代码中的分支覆盖的情况,包括:
if-else语句覆盖情况
case语句覆盖情况
三元操作符("?:")覆盖情况
3.路径覆盖率(Path Coverage)
路径覆盖率衡量的是在穿过代码和表达式的路径中有哪些已经被执行过,表明代码中数据通路的覆盖情况。
4.条件覆盖率(Conditional coverage)
判定式中有多个条件时,要求每个条件的取值均得到验证。这里的条件覆盖率很容易与分支覆盖率产生混淆,为了方便大家区别,下面举一个例子:
if ((test1() || test2()) {
//在只有test1()为false的情况下,这个地方有一个BUG
}
else {
do_something_benign;
}
假设我们有如下两种情况:
- test1()为true
- test1()和test2()都为false
如果只是为了验证分支覆盖率,以上的两种情况就足够了,因为if语句中两种分支条件都有了,但是对于第一条分支中的只有在test1()为false情况下的BUG,这里并没有覆盖到。
而在条件覆盖率下,还需要验证test1()为false且test2()为true这种情况,只有这三种情况都验证到了,才算是满足了条件覆盖率。
5.翻转覆盖率(Toggle coverage)
翻转覆盖率衡量的是哪些单比特变量的值为0或1,表明代码中信号的0到1和1到0的翻转情况。
6.有限状态机覆盖率(FSM coverage)
有限状态机覆盖率衡量的是状态机中哪些状态和状态转换已经被访问过。表明状态机中各个状态的覆盖情况。