- 1 为什么需要功能覆盖率?
- 2 怎么收集覆盖率?
- 3 怎么收敛覆盖率?
- 4 覆盖率有哪些类型?
- 4.1 代码覆盖率
- 4.1.1 代码覆盖率衡量的指标?
- 4.1.2 代码覆盖率衡量的内容?
- 4.1.3 怎么测试代码覆盖率?
- 4.2 功能覆盖率
- 4.2.2 怎么测量功能覆盖率?
- 4.2.3 什么是覆盖组?
- 4.3 漏洞率
- 4.4 断言覆盖率
- 5 功能覆盖的策略?
功能覆盖率是用来衡量哪些设计特征已经被测试程序测试过的一个指标。
1 为什么需要功能覆盖率?如果是定向测试,测试中的覆盖率是隐含的,设计规范列出了100个特征,需要做的就是完成100个测试,如果完成了50个,则覆盖率为50%。
对于复杂的设计,需要使用受约束的随机测试方法(CRT),此时不需要手工逐行输入激励,却需要根据验证计划编写代码来追踪测试的有效性。显示的功能覆盖率衡量了测试的进度。
2 怎么收集覆盖率?通过改变随机数种子,就可以反复运行同一个随机测试平台来产生新的激励。每一次仿真都会产生一个带有覆盖率信息的数据库,记录随机游走的轨迹。把这些信息全部合并在一起就可以得到功能覆盖率,从而衡量整体的进展程度。
3 怎么收敛覆盖率?- 改变随机数种子获得功能覆盖率数据。
- 分析覆盖率数据决定如何修改测试集。
- 覆盖率稳步增长:添加新的随机种子继续运行现有测试,或加长运行时间。
- 覆盖率增速放缓:添加额外的约束产生更多激励。
- 覆盖率稳定而某些部分未测试过:创建更多新的测试。
- 覆盖率接近100%而不停发现错误:没有真正覆盖设计中的某些区域。
- 代码覆盖率
- 功能覆盖率
- 漏洞率
- 断言覆盖率
代码覆盖率衡量的是测试对于涉及规范的“实现”究竟测试得多彻底,而非针对验证计划。代码覆盖率达到100%并不意味着工作已经完成。
4.1.2 代码覆盖率衡量的内容?代码覆盖率是衡量验证进展的最简易的方式。这种方式衡量:
- 多少行代码已经被执行过(行覆盖率)。
- 在穿过的代码和表达式的路径有哪些已经被执行过(路径覆盖率)。
- 哪些单bit变量值为0或1(翻转覆盖率)。
- 状态机中哪些状态和状态转换已经被访问过(有限状态机覆盖率)。
工具自动分析源代码和增加隐藏代码来完成代码覆盖率的统计。 当运行完所有测试,代码覆盖率工具便会创建相应的数据库。
4.2 功能覆盖率功能覆盖率是和设计意图紧密相连的,有时也被称为“规范覆盖率”,而代码覆盖率则是很亮设计的实现情况。 如果某个代码块在设计中被漏掉,代码覆盖率不能发现这个错误,但是功能覆盖率可以。
4.2.2 怎么测量功能覆盖率?- 首先编写验证计划和相对应的用于仿真的可执行版本。
- 在 SystemVerilog 测试平台中对变量和表达式的数值进行采样。这些采样的地方就是覆盖点。
- 在同一个时间点(如当一个事务处理完成时)的多个覆盖点被一起放在一个覆盖组。
覆盖组与类相似:一次定义后可多次例化。 含有覆盖点、选项、形式参数和可选触发(trigger)。一个覆盖组包含一个或多个覆盖点,在同一时间采集。
4.3 漏洞率衡量覆盖率的一个间接的方式是查看新漏洞出现的比率。
断言是用于一次性 或 一段时间内 核对 两个设计信号之间关系的声明性代码。
相对于使用 SystemVerilog 程序性代码检查,断言(SVA)更容易表达。
5 功能覆盖的策略?- 收集信息而非数据。 FIFO验证的例子,不需要测量读写地址索引里的数据,这有非常多的可能。如果能够使FIFO从空到满再由满到空,就已经覆盖数据读写中的所有情形了,再加上其他感兴趣状态比如地址索引全1与全0之间却换。
- 只测量将会使用到的内容
- 测量的完备性