IC验证零基础学习-System Verilog-(九)功能覆盖率

本文详细介绍了SystemVerilog的功能覆盖率,包括代码覆盖率、功能覆盖率和断言覆盖率的概念及其重要性。重点讲解了如何定义和统计覆盖率,如何利用覆盖组、触发和数据采样进行有效的覆盖率分析。此外,还探讨了交叉覆盖率、覆盖选项以及覆盖率驱动的验证平台的构建方法,强调了在验证过程中覆盖率的重要性及其与漏洞率的关系。
摘要由CSDN通过智能技术生成

IC验证零基础学习-System Verilog-(九)功能覆盖率
功能覆盖率是用来衡量哪些设计特征已经被测试程序测试过的一个指标。
1)运行一个带多个种子的测试。
2)检查运行通过与否。
3)分析通过多次运行得到的覆盖率
制定验证计划中的功能点的时候,需要考虑以下三个问题:
1)哪些功能点需要检查。功能要求,接口要求,系统规范,协议规范。
2)这个功能点的哪些数据需要检查
3)如何对这些数据进行采样

1、覆盖率类型
1)代码覆盖率(仿真器收集)
行覆盖率(line):多少行代码被执行。
路径覆盖率(path):穿过代码和表达式的路径多少被执行
翻转覆盖率(toggle):哪些单bit的值为0或1
有限状态机覆盖率(FSM):状态机中哪些状态和状态转换已经被访问过了
【注意】主要关注点应该放在设计代码的分析上,而不是测试平台上。
2)功能覆盖率
验证的目的就是确保设计在实际环境中的行为正确。
功能覆盖率是和设计意图紧密相连的,代码覆盖率则是衡量设计的实现情况。
衡量覆盖率的一个间接的方式是查看新漏洞出现的比率。
3)断言覆盖率
断言是用于一次性的或在一段时间内核对两个设计信号之间关系的声明性代码。
断言可以拥有局部变量,并且可以进行简单的数据检查。常用于查找错误,检查仲裁算法,各种FIFO以及其他硬件。
2、功能覆盖率
SV功能覆盖率结构可以实现如下功能:
1)定义和统计变量和表达式的覆盖率及交叉覆盖率
2)支持自动化创建覆盖点计数器和用户自定义覆盖点计数器
3)覆盖点计数器可以同时包括多种类型,例如数值集合、跳转、交叉项等
4)可以在不同层次设置过滤条件。
5)可以通过events和sequences来触发覆盖率点采样
6)过程化覆盖点采样激活和覆盖率实时查询
7)提供属性参数来管理覆盖率统计和计算
在动手写测试代码前,预先弄清楚相关设计的关键特性,边界情况和可能的故障模式。
1)收集信息而非数据
2)只测量将会使用到的内容
3)测量完备性
①功能覆盖率很高但是代码覆盖率很低,可能因为验证计划不完整,测试并没有执行设计的所有代码。
②代码覆盖率很高,但是功能覆盖率很低,即使测试平台很好地执行了设计的所有代码,但是并没有把它定为到所有感兴趣的状态上。
在两者都提高的时候,漏洞率趋势如何?
3、覆盖组xiangjie
覆盖组与类相似,一次定义后便可以进行多次实例化。它含有覆盖点,选项,形式参数和可触发(trigger)。一个覆盖组包含一个或多个数据点,全都在同一时间采集。
一个覆盖组必须被实例化后才可以开始采样,收集数据。
4、覆盖组的触发
功能覆盖率的两个主要部分是采样的数据和数据被采样的时刻。当这些新数据都准备好了以后,测试平台便会触发覆盖组。
使用sample()任务采样覆盖率数值;使用事件触发进行采样;使用SV断言进行触发。
5、数据采样
仓是衡量功能覆盖率的基本单位
1)个体仓和总体覆盖率
为了计算出一个点上的覆盖率,首先必须确定所有可能数值的个数,这个被称为域。一个仓中可能有一个或多个值,覆盖率就是采样值的数目除以域中仓的数目。
2)自动创建仓
SV会自动为覆盖点创建仓,它通过被采样的表达式的域来确定可能值的范围,对于一个位宽为N位的表达式,有2^N个可能值。
3)限制自动创建仓
4)对表达式进行采样
始终要核对覆盖率报告以确保能够得到预期值。
5)使用用户定义的仓发现漏洞
自动生成的仓适用于匿名数值,如计数值、地址值或2的幂值。对于其他数值,应该明确对仓命名,以增加准确度并有利于对覆盖率报告的分析。
6)命名覆盖点的仓
7)条件覆盖率
使用关键字iff给覆盖点添加条件。
8)为枚举类型创建仓
9)翻转覆盖率
10)在状态和翻转中使用通配符
使用关键字wildcard来创建多个状态或翻转。在表达式中,任何X,Z或?都会被当作0或1的通配符。
11)忽略数值
12)不合法的仓
13)状态机的覆盖率
6、交叉覆盖率–同时测量两个或两个以上覆盖点的值。

7、通用的覆盖组
8、覆盖选项
9、覆盖率数据分析
10、在仿真过程中进行覆盖率统计
11、覆盖率驱动的验证平台
1)定义覆盖率统计模块
2)将覆盖率统计模型集成到scoreboard中,并在任务run中调用cov.run进行覆盖率统计。
3)修改验证环境的控制流程,把覆盖率作为仿真运行中止的标准之一。
其中,我们添加了一个覆盖率查询的任务check_coverage,这个任务中我们通过系统函数$get_coverage()查询整个验证环境中的覆盖率,一旦达到100%就停止运行。同时,修改仿真任务terminate,将check_coverage集成进去,那么系统可能在两种情况下停止仿真:一是运行到1000次比较,aaa_test_done为1,退出仿真;二是运行到达覆盖率100%,退出仿真。

参考书籍《SystemVerilog验证测试平台编写指南》《SystemVerilog与功能验证》

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值