• SV基础知识---覆盖率 (概念理解)


    功能覆盖率  是用来衡量哪些设计特征已经被测试程序测试过的一个指标

    使用反馈环路来分析覆盖的结果,并决定采取哪种行动来达到100%的覆盖率。

    首要的选择式使用更多的种子来运行现有的测试程序,其次是建立新的约束。只有在确实需要的时候才会创建定向测试

     显式的覆盖率是在测试环境中使用SV特性直接描述的,隐含的覆盖率则是暗藏在测试中。 收集覆盖率数据,可以通过改变随机种子,就可以反复运行同一个随机测试平台来产生新的激励,每一次仿真都会产生一个带有覆盖率信息的数据库,记录随机游走的轨迹。

    覆盖率操作流程:

     通过分析覆盖率数据可以决定如何修改测试集。

    通过仿真器覆盖率数据分析工具你可以:

    1. 运行一个带多个种子的测试。使用不同的随机种子反复地运行这个约束集。
    2. 检查运行通过与否。功能覆盖信息只在仿真运行成功时才有效,当由于设计里存在漏洞而使得仿真失败时,必须丢弃覆盖率信息。
    3. 分析通过多次运行得到的覆盖率。如果约束所指向的区域还没有达到100%覆盖率,但是覆盖率一直在增加,那么就继续运行更多的种子。如果覆盖率已经稳定下来,不再继续增长,那么就应该考虑修改约束,最后必要时考虑编写定向测试。
       

    一、覆盖率的类型

    1、代码覆盖率

    覆盖率的收集一般只收集设计代码。仿真器都带有代码覆盖率的工具,覆盖率数据也被转换为可读模式。工具会通过分析源代码和增加隐藏代码自动完成代码覆盖率的统计。当完成所有的测试,代码覆盖率工具会创建相应的数据库

    • 行代码覆盖率:衡量的是多少行代码已经被执行过
    • 路径覆盖率:在穿过代码和表达式的路径中有哪些已经被执行过
    • 翻转覆盖率:哪些单比特变量的值为0或1
    • 有限状态机覆盖率:以及状态机中哪些和状态转换已经被访问过

    代码覆盖率衡量的是测试对于设计规范的“实现”究竟测试得多彻底,而非针对验证计划,虽然达到100%覆盖率,但是有可能设计代码本身就有缺陷。

    2、功能覆盖率

    功能覆盖率是和设计意图紧密相连的,有时也被称为“规范覆盖率”,而代码覆盖率则是衡量设计的实现情况。如果某个代码块在设计中被漏掉,代码覆盖率不能发现,但是功能覆盖率可以。

    3、漏洞率

    衡量覆盖率的一个间接的方式是查看新漏洞出现的比率。

    一个项目中的漏洞率:

     4、断言覆盖率

    • 断言是用于一次性地或在一段时间内核对两个设计信号之间关系的声明性代码。
    • 断言可以拥有局部变量并且可以进行简单的数据检查。
    • 断言最常用于查找错误,一旦检测到问题,仿真就会立即停止。
    • 有些断言会被用于查找感兴趣的信号值或者设计状态。这要用到cover property语句,用于观测信号序列,而覆盖组则对仿真过程中的数值和事务进行采样。覆盖组可以在信号序列结束时触发,序列可以收集信息供覆盖组使用。
    • 使用断言覆盖率可以测量这些断言被触发的频繁程度。

    5、

    二、功能覆盖策略

    1、收集信息而非数据

    例如测试一个容量为1K的FIFO存储器,测试它读写地址索引里的数据,这有上百万种可能的组合,只需要成功读出所有的数据即可。设计信号如果数量范围太大的话,应该拆分成小范围再加上边界情形。

    2、只测量将会使用到的内容

    收集功能覆盖率数据的开销很大,所以应该只测量将会用到的测试内容。在编译、初始化、触发时刻都能控制覆盖率数据,也可以使用条件编译或者对覆盖率信息的收集实行抑制。

    3、测量的完备性

    覆盖率比较:

    三、功能覆盖率的简单例子

    待补充。。。

  • 相关阅读:
    【剑指Offer】41.数据流中的中位数
    从零实现 promise 的 class 和 function 版本
    C++:用函数模板排列数组
    网络代码理解
    怎么把flac音频变为mp3?
    如何使用vscode向github上传文件or项目
    10款功能强大的网络嗅探工具应用分析
    Springboot网络微小说的设计与实现毕业设计源码031758
    openGauss学习笔记-70 openGauss 数据库管理-创建和管理普通表-查看表数据
    PE文件-CPU寄存器-栈-常用汇编语言指令-push-move-sub-lea-rep-xor
  • 原文地址:https://blog.csdn.net/Arvin_ing/article/details/127812860