SV精通6:验证的量化与功能覆盖率

一、覆盖率

1 概述

2 覆盖率反馈回路

  • 随机约束(constrained random tests) 很窄的时候会变成定向测试(directed testcase)
  • Many runs , different seeds : 跑多次使用不同的种子
  • Functionall Coverage : 功能覆盖率
  • Identify holes:分析漏洞

即一开始可以使用定向测试

测试题

答案:AB

3 漏洞率曲线

漏洞率下降时,应寻找各种不同的办法去测试可能的边界情况(corner case)

4 功能覆盖率步骤

二、 覆盖率类型

1 代码覆盖率

工具分析,编译时添加选项,不需要额外代码

  • 行覆盖率
  • 路径覆盖率
  • 反转覆盖率
  • 状态机覆盖率

最终结果用于衡量设计代码,关注点在设计代码的分析上,而不是测试平台

代码覆盖率100%是必要不充分条件

测试题

答案:C

实际情况常常达不到100%,我们会:1、设置编译器这部分达不到;2、设置100%的阈值

2 断言覆盖率

可以使用SV的程序性代码:assert

但使用SVA更简单


断言除了用于信号和状态的检查外,还可以用作覆盖率收集

只有代码覆盖率会自动收集,断言覆盖率需要自己定义

3 功能覆盖率(重要)

功能覆盖率关系图

不止仿真,形式验证、加速都可以收集覆盖率

pass:功能测试有没有通过

功能覆盖率步骤

合并覆盖率

测试题

答案:BCD

三、功能覆盖策略

1 收集信息而非数据

着眼于感兴趣的状态,而不是具体数值

2 只测量需要的内容

  • 什么时候打开覆盖率收集,什么时候关闭

  • 只收集哪些?功能点…

  • 合理的定义覆盖率采样事件

3 验证的完备性:代码覆盖率与功能覆盖率的关系

目标是同时驱动高的代码覆盖率和功能覆盖率

Functional Coverage & Code Coverage figure

  • Need more FC points ,including corner cases : 部分代码代表的功能还没有提取,需要定义更多的功能覆盖率
  • Is design complete ? : (最常见的)某些感兴趣的状态还是没有被测试到,分析我们的功能覆盖率哪些没有测试到,针对他们去添加修改约束和性能测试

测试题

答案:CD

四、覆盖组(关键词covergroup)

1 概念

  • covergroup与类相似,一次定义多次例化
  • covergroup可定义在类、interface、module中
  • covergroup包含一个或多个coverpoint,所有points全部同一时间采集
  • covergroup可采样任何可见变量,例如程序变量、接口信号、设计端口
  • 一个类里面面可包含多个covergroup
  • 你拥有多个独立的covergroup时,每个covergroup可以根据需要自行使能或禁止
  • 每个covergroup可以定义单独的触发采样时间,允许从多个源头收集数据
  • covergroup必须例化后才能收集数据

方法

1
2
3
4
CovPort ck = new ();
ck.start();//new之后默认已经启动,只有stop只有才需要重启
ck.stop();
ck.sample();//采样

2 在类里定义covergroup

两种例化方式

第一种:实例名和类名一致,但类名还是类名,实例名也是实例名,但没法例化多次

1
2
3
covergroup CovPort;
....
CovPort = new ();//和类的例化不太一样

第二种(建议):实例名与类名不一致,我们定义类也是用这种,可以例化多次

1
CovPort cg1 = new();

采样

第一种采样方式(手动)

1
cg1.sample();

第二种采样方式:covergroup的采样触发等待某些特定的信号(自动)

3 covergroup的采样触发

使用事件触发

借助已有事件,比如已有的时钟或event

测试题

答案:ABC

五、数据采样

1 概述:仓bin

定义coverpoint时,SV会创建很多仓,可以是自己定义的bin,也可以是自动生成的bin,推荐自己定义

2 coverpoint 和 bin

3 bin的创建和应用

4 命名coverpoint和bin

misc = default

5 条件覆盖率:iff关键词给coverpoint添加额外条件

关注port变量,不单单要触发采样条件ck.sample(),还要(!bus_if.reset)即已经复位

为什么ck要先关闭:因为要操作复位信号

6 翻转覆盖率:=> 符号

测试题

答案:ABD

7 wildcard覆盖率:把X,Z或?当成0,1的通配

8 忽略某些bin:关键词ignore_bins

使用ignore_bins定义bin

9 非法某些bin:关键词illegal_bins

10 交叉覆盖率:关键词cross

(1) 排除部分cross bin:ignore_bins + binsof + intersect

1
2
3
binsof(覆盖率组变量A) itersect {整形}
//与7有关的“A”组合


ignore_bins md = binsof(port) intersect{0} && binsof(kind) intersect {[9:11]}


ignore_bins lo = binsof(kind.lo)//lo在前面定义了bin lo = {[8:$]}

(2) 精细的交叉覆盖率指定:交叉后bin由于过于多了,我们更常用指定,只用binsof

尽量不做排除法,而是指定法

测试题

答案:ABC

D错是因为,如果不连续(漏掉)某些bin,SV可能会自动帮你填充如:

456没有关心

采样到illegal_bins仿真会停止

六、覆盖选项

1 单个实例的覆盖率:查看单个覆盖率option.per_instance = 1

2 添加注释 option.commet = string*

:

3 覆盖次数限定:option.at_least

4 覆盖率目标:option.goal

5 covergroup方法

1
2
3
4
get_coverage()//所有group加权以后的覆盖率
get_inst_coverage()//特定覆盖组实例覆盖率
//返回的0-100实数就是百分比
set_inst_name(string)设置覆盖组名称

七、数据分析

1 概述

获得总体覆盖率:使用系统函数,或使用get_inst_coverage()