代码覆盖是一种技术,用来识别在验证设计中已执行的代码。

即便一个设计在所有测试平台都能顺利通过测试,但是否有部分RTL级代码未运行,因此未触发可能的功能错误,这个问题可以用代码覆盖率来解决。代码覆盖率并不是SV独有的,在软件工程中已经使用了相当长的一段时间。

代码覆盖率的优点:可以被仿真器自动收集,因此在仿真过程中使能它非常简单,不用修改设计或者验证环境。代码覆盖的目的是确认我们是否忘记在设计中执行某些代码,无需跟踪设计平台的代码并确认它已执行,这是设计覆盖率要做的事。

当代码覆盖率达到90%时,平均只有54%的代码被监测,由于监测的代码不够多,因此一些即便被触发的漏洞也在传播的过程中没有被监测到。这也就是代码覆盖率无法同功能覆盖率等同的原因,代码覆盖率的数据无法直接映射到哪些设计功能被测试了。

代码覆盖率类型之一:行覆盖率。它可以用来衡量源代码哪些代码行被执行过,哪些没被执行过。对于那些无用的代码也就是永远不会被执行的代码,在代码分析时我们应当把它们从覆盖率数据中过滤掉。

语句、行或者块覆盖率可以衡量验证执行的总代码行数,不同覆盖率分析工具的报告形式可能会有所不同,下图是形式之一。 

gtest 统计 代码覆盖率 代码覆盖率测试作用_状态机

当代码未被覆盖时,除了寻找设计过程中的失误,测试平台的问题也需要被考虑到。

 

gtest 统计 代码覆盖率 代码覆盖率测试作用_状态机_02

分支覆盖率用来指出条件语句if...else和case的分支轨迹。条件覆盖率相比分支覆盖率的范围更小,用来衡量分支覆盖率中条件为真的执行轨迹。

gtest 统计 代码覆盖率 代码覆盖率测试作用_代码覆盖率_03

状态机覆盖率(FSM):状态机的状态可以由仿真工具自动识别,每个状态的进入次数,状态之间的跳转次数,以及多个状态的跳转顺序都可以由仿真工具记录下来。因为FSM中的每个状态通常使用case语句进行编码,所以任何未访问的状态都可以通过未覆盖的语句清楚地识别。

代码覆盖率100%表明:①整个设计已经执行②代码覆盖率表示整个验证套件运行源代码的彻底程度,但它并未以任何方法提供有关验证套件正确性或完整性的指示。③代码覆盖率无助于验证设计意图,只是完全执行了RTL级代码,并不管他是否正确。④代码覆盖率的结果应该用来帮助识别和验证未执行的边界情况,