【路科V0】systemVerilog基础19——代码覆盖率

代码覆盖率概述

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

包含未知错误的设计的问题

        这个设计看起来就像一个非常好的设计。我们绝对不可能知道被验证的设计在功能上是完全正确的。

         即便所有测试平台都成功仿真,但是否有部分RTL代码未运行,因此未触发可能的功能错误?这是代码覆盖可以帮助回答的问题。

        代码覆盖率并不是SV独有的,这项技术已经在软件工程中使用了相当长的一段时间。

代码覆盖率的一个优势

        在于它可以由仿真工具自动收集,继而用来指出在测试程序中设计源代码哪些被激活触发,而哪些则一直处于非激活的状态。

        由于代码覆盖率自动的特性,在仿真过程中使能它变得很简单,它不需要修改设计或者验证环境。
代码覆盖的目的是

        确认我们是否忘记在设计中执行某些代码,无需跟踪测试平台的代码并确认它已执行。

代码覆盖率局限

        代码覆盖率100%并不意味着足够的功能覆盖率。

        研究发现,在回归测试实现了90%的代码覆盖率时,平均只有54%的代码会被监测,这意味着即便代码覆盖率的完备性满足,但依然可能在这些代码中存在漏洞。

        上述的推断是因为不是所有被覆盖的代码都会得到足够的监测,也由于没有得到足够的监测,因此一些即便被触发的漏洞也在传播的过程中没有到达监测点上——漏洞便从眼皮底下“逃逸”  了。
        另外,代码覆盖率的数据无法直接映射到哪些设计功能被测试了,所以从这一点来看,代码覆盖率和功能覆盖率之间又是互相独立的。

代码覆盖率分类

  • 行覆盖率(statement / line)
  • 分支覆盖率(branch)
  • 条件覆盖率(condition/expression)
  •  状态机覆盖率(FSM)
  • 跳转覆盖率(toggle)

行覆盖率(statement / line)

         用来衡量源代码哪些代码行被执行过,以此来指出哪些代码行没有被执行过。

          从每一行执行的次数,如果设置最小的执行次数,也可以用来做代码测试的一项指标。

         代码覆盖率可以指出在一些缺乏输入激励的情况下,某些赋值的代码行没有被执行的情况,它也可以指出在一些漏洞影响或者无用代码的影响下,一些代码行也无法被执行的情况。

         对于那些无用的代码,也就是永远不会被执行的代码,在代码分析时,我们可以将它们从覆盖率数据中过滤掉。

        行覆盖率也可以称为块覆盖率,其中块是在执行单个语句时执行的语句序列。

示例:
        只要if语句中的表达式求值为true,就会执行名为acked的块。因此,计算该块的执行等同于计算该块中的四个单独语句的执行。

if (dtack == 1'b1) begin: acked
    as       <=1'b0;
    data     <= 16'hzzzz;
    bus_rq   <= 1'b0;
    state     <= IDLE ;
end : acked

 语句、行或块覆盖率可以衡量验证执行的总代码行数。

 图形用户界面通常允许用户浏览源代码并快速识别未执行的语句。

 示例:

        如下图以图形方式显示了一小部分代码的语句覆盖率报告,来自不同代码覆盖率分析工具的报告的实际形式可能会有所不同。

【路科V0】systemVerilog基础19——代码覆盖率_第1张图片

语句覆盖率度量达到100% 

         要使语句覆盖率度量达到100%,有必要了解导致执行未覆盖语句所需的条件在这种情况下,奇偶校验必须设置为ODD或EVEN。只要确定了条件,就必须去了解这些条件从未满足过的原因。

        这是一个永远不会发生的情况吗?它是否应该由现有测试环境来验证?或者这是一个被遗忘的情况?
        如果导致未覆盖的语句执行的条件应该被测试,则表明测试平台在功能上不正确或不完整。如果条件完全被遗忘,则需要添加到测试平台,创建一个全新的测试用例或使用不同的种子进行额外的运行。

分支覆盖率(branch)

分支覆盖率是用来对条件语句(if  /else,case,?:),指出其执行的分支轨迹。

示例:

判断下列分支的布尔表达式为true或者false

if (parity == ODD || parity == EVEN) begin

条件覆盖率(condition/expression)

条件覆盖率是用来衡量一些布尔表达式中各个条件真伪判断的执行轨迹。

示例:

下列if条件语句中的两个条件是否各自衡量为true/false

if (parity ==ODD || parity ==EVEN) begin
// parity == ODD或者parity != 0DD
// paraity ==EVEN 或者parity != EVEN

【路科V0】systemVerilog基础19——代码覆盖率_第2张图片

 状态机覆盖率(FSM)

        仿真工具由于可以自动识别状态机,因此在收集覆盖率时,也可以将覆盖率状态的执行情况监测到。
        每个状态的进入次数,状态之间的跳转次数,以及多个状态的跳转顺序都可以由仿真工具记录下来。
        因为FSM中的每个状态通常使用case语句中的选项进行编码,所以任何未访问的状态都可以通过未覆盖的语句清楚地识别。

跳转覆盖率(toggle)

        用来衡量寄存器跳转的次数(0->1,1->0)。
        一般项目会要求模块的端口实现至少1次0到1,以及1次1到0的跳转来保证模块的集成和模块之间的互动。
        也有的项目会要求所有的寄存器都应该同端口一样满足跳转的最少次数。

 端口跳转覆盖率

经常用来测试IP模块之间的基本连接性,来发现问题。例如

  • 检查一些输入端口是否没有连接
  • 已经连接的两个端口的比特位数是否不匹配
  • 一些已经连接的输入是否被给定的固定值等

代码覆盖率100%

【路科V0】systemVerilog基础19——代码覆盖率_第3张图片

         简而言之,它表示整个设计已经执行。
        代码覆盖率表示整个验证套件运行源代码的彻底程度,但它并未以任何方式提供有关验证套件正确性或完整性的指示。

        代码覆盖率无助于验证设计意图,只是完全执行了RTL代码,无论是否正确。

        代码覆盖率的结果应该用于帮助识别验证未执行的边界情况或依赖于设计实现的特性。
        对于没有覆盖到的测试场景,我们还应考虑其是否更新或者添加测试,或者是处于覆盖率工具的盲区所导致的。

你可能感兴趣的:(数字验证,数字验证,systemVerilog)