【IC验证】覆盖率coverage(绿皮书总结)

时间: 2024-04-13 23:26:43 |   作者: 华体会登入页面

详情


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

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

  有些断言会被用于查找感兴趣的信号值或者设计状态。这要用到cover property语句,用于观测信号序列,而覆盖组则对仿真过程中的数值和事务进行采样。覆盖组可以在信号序列结束时触发,序列可以收集信息供覆盖组使用。

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

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

  功能覆盖率的两个主要部分是采样的数据和数据采样的时刻。触发覆盖组能够正常的使用sample函数来完成。

  也能借助已经有的信号来触发覆盖组,可以在covergroup声明中使用阻塞语句。

  与直接调用sample方法相比,使用事件触发的好处在于可以借助已有的事件进行触发覆盖组采样。

  如果已经有了一个诸如事件结束等有用事件的SVA,那就能增加一个事件触发来唤醒覆盖组。

  当你在覆盖点上指定一个变量或表达式时,SV便会创建很多仓(bin)来记录每个数值被捕捉到的次数,这些仓是衡量功能覆盖率的基本单位。

  为了计算出一个点上的覆盖率,首先必须确定所有可能数值的个数,这也被成为域。一个仓中可能有一个或多个值,覆盖率就是采样值的数目除以与中仓的数目。如:一个3 bit变量覆盖点的域是0:7,一般的情况下会除以8个仓,如果在仿线个仓的值被采样到,那么报告会给出这个点的覆盖率是7/8或是87.5%。所有这些点组合在一起便构成了一个组的覆盖率,而所有组合组合在一起就能给出整个仿线、

  为了计算出一个点上的覆盖率,首先必须确定所有可能数值的个数,这也被成为域。一个仓中可能有一个或多个值,覆盖率就是采样值的数目除以与中仓的数目。如:一个3 bit变量覆盖点的域是0:7,一般的情况下会除以8个仓,如果在仿线个仓的值被采样到,那么报告会给出这个点的覆盖率是7/8或是87.5%。所有这些点组合在一起便构成了一个组的覆盖率,而所有组合组合在一起就能给出整个仿线、

  SV会自动为覆盖点创建仓。他通过被采样的表达式的域来确定可能跟值的范围。对于一个位宽N位的表达式,有2^N个可能值。对于枚举类型,其域就是署名值的个数。

  覆盖组选项auto_bin_max指明了自动创建仓的最大数目,缺省值是64。

  如果覆盖点变量或表达式的值域超过指定的最大值,SV会把值域范围平均分配给auto_bin_max个仓。如:一个16 bit变量有65536个可能值,所以64个bin中每一个都覆盖率1024个值(65536/64)。实际这种自动分配值域的方式不实用,因为不容易找到没有被覆盖的数值。实际多用明确定义仓的范围或者把仓的值数量限制在8或者16。

  可以对仓名指定明确的仓名,以增加覆盖率报告的准确度。SV会自动为枚举类型的仓命名。直接看例子。

  可以使用关键字iff给覆盖点添加条件。应用场景常为在复位期间关闭覆盖以忽略掉一些杂散的触发。

  使用关键字wildcard来创建多个状态或翻转。在表达式中,任何X,Z或?都会被当成0或1的通配符。

  有些采样数值不仅应该被忽略,而且假如慢慢的出现还应该报错。此情形最好在测试平台中使用代码进行仔细的检测,但也能够正常的使用illegal_bins对仓做标识。如果在覆盖组中发现了不合法的数值,那就是你得测试程序或者bin定义出了问题。

  六、交叉覆盖率交叉覆盖率可以同时测量两个或者两个以上覆盖点的值。注当你想测量两个变量的交叉覆盖率,其中一个有N种取值,另一个由M种取值,SV需要NxM个交叉仓来存储所有的组合。

  SV使用cross关键字来记录一个组里两个或两个以上覆盖点的组合值。cross语句只允许带覆盖点或者简单的变量名。如果你想使用表达式,层次化的名字或者对象中的变量。例如handle.variable,必须首先对coverpoint里的表达式使用标号,然后把这个标号用在cross语句里。

  使用ignore_bins能够大大减少仓的数目。在交叉覆盖中,能够正常的使用binsof和intersect分别指定覆盖点和数值集,这样做才能够使单个的ignore_bins结构清除掉很多个体仓。

  一个组的总体覆盖率是基于所有简单覆盖点和交叉覆盖率的。如果只希望对一个coverpoint上的变量或表达式进行采样,而这个coverpoint将会被用到cross语句中,那么应把他的权重设置成0,这样他就不会对总体的覆盖率造成影响。

  假设有两个随机比特变量a和b,他们带着三种感兴趣的状态,{a==0, b==0}, {a==1, b==0}和{b==1}。使用仓名的交叉覆盖率

  SV允许创建一个通用的覆盖组,这样在对它进行实例化时可以指定一些独特的细节。SV不允许把覆盖组的触发参数传递给实例,作为变通,可以把覆盖组放到一个类里,然后把触发参数传递给构造函数。

  如果不仅想在调用构造函数时使用数值,还希望覆盖组在整个仿真过程中可以对数值进行采样,那就能通过引用的方式来指定有必要进行采样的变量。

  ;一种是类型选项,用于所有的覆盖组实例。类似于类中的静态数据成员,选项可以放在覆盖组中并对组里的所有覆盖点有效,也可以防在单个覆盖点中以便实现更精细的控制。单个实例的覆盖率

  使用option.at_least可设为覆盖阈值,即一个仓被命中覆盖阈值后,此仓才被认为被覆盖到。option.at_least如果定义咋覆盖组里,那么会用作所有的覆盖点。如果定义在一个点上,那么就只对该点有效。

  缺省情况下,覆盖率报告只会给出带有采样值的仓。使用cross_num_print_missing选项可以让仿真和报告工具给出所有的仓,尤其是没有命中的仓。

  一个覆盖组或覆盖点的目标是达到该组或该点被认为已经完全覆盖的水平。缺省情况下时100%的覆盖率。

  在仿真进行的过程中,可以查询功能覆盖率的水平,允许你检查是不是已经达到覆盖目标,并能对随机测试施加控制。在全局层面上,使用getcoverage 能够获得所有覆盖组的总覆盖率。 get_coverage能够获得所有覆盖组的总覆盖率。get coverage能够获得所有覆盖组的总覆盖率。get_coverage返回一个介于0~100的实数,该系统任务可以查询到所有的覆盖组。能够正常的使用get_coverage()和get_inst_coverage()函数来缩小测量范围。