关于VMM验证的功能覆盖率
功能覆盖率简单地说是一个比例数据,指芯片中已验证过的功能占该芯片全部功能的百分比。只有当芯片中所有的功能都被验证为正确时才能保证流片的成功,验证工作的目标就是尽量使功能覆盖率达到100%。 想要提高验证工作的效率,就必须在尽可能短的时间内,尽可能多地提高功能覆盖率。
针对功能覆盖率的验证过程如下图所示。
1 编写验证需求文档
2 基于验证需求文档实现包含功能覆盖率模型的测试平台
3 在能够自动统计功能覆盖率的模型的驱动下,通过随机激励,定向激励,形式验证等手段使功能覆盖率达到100%
4 验证完成
与传统的验证过程不同的地方在于:它实现了一个能够自动统计功能覆盖率的模型。通过该模型,可以方便地得到当前的功能覆盖率,并根据它调整验证策略,以尽快地达到100%功能覆盖率。
与传统的验证过程不同的地方在于:它实现了一个能够自动统计功能覆盖率的模型。通过该模型,可以方便地得到当前的功能覆盖率,并根据它调整验证策略,以尽快地达到100%功能覆盖率。
1编写验证需求文档
验证需求文档用于记录所有需要验证的功能或边角情况。它是整个验证过程的基础。不管是传统的验证过程还是新的验证过程,都需要制定详细的验证需求文档。它应当由有经验的设计工程师、验证工程师和软件工程师等一起来定义。
在验证需求文档中,应当记录两类内容:一是设计能做什么;二是设计不能做什么。设计能做什么并不是泛泛而谈的,而是要详细定义在各种各样的情况下(包括边角情况下),设计会怎么做。设计不能做什么也不是泛泛而谈的,也是要详细定义在各种各样的情况下(包括边角情况下),设计不会做什么。由于验证的过程就是查错的过程,这里所谓的各种各样的情况,都是我们所关注的可能会出错的情况。对于某个设计,出错的可能方式是无限多种的,我们要基于给定设计的功能和架构以及具体实现细节,尽可能多地枚举出所有可能导致错误的情况。
需要强调的是,验证需求文档是验证需求和验证意图的体现,若是验证需求文档中对某种可能引起错误的情况没有定义,那么由验证需求文档得到的功能覆盖率模型也不会关注该情形,那么,即使功能覆盖率模型报告的功能覆盖率为100%,设计仍旧可能存在错误。因此,验证需求文档需要有经验的工程师来制订,并在整个项目的开发过程中不断地修订和重审,以保证考虑得尽可能地周全。
2根据验证需求文档构建包括功能覆盖率模型在内的测试平台
要实现能够自动统计功能覆盖率的模型,最好要有语言和工具的支持。Verilog语言并没有专门用于统计功能覆盖率的语言特性,使用它实现功能覆盖率的统计模型并不方便。近年来新推出的符合IEEE标准的SystemVerilog语言中,有两类语言特性是专门用于统计功能覆盖率的,使用SystemVerilog语言可以比较方便地实现功能覆盖率的统计模型。这两类语言的特性是指:覆盖率组(covergroup)和覆盖率属性(cover property)。下面将对覆盖率组和覆盖率属性作简单的介绍,更多的语法细节请参考SystemVerilog的语法手册和相关的书籍。
覆盖率组(covergroup)用于对数据或表达式曾出现过的值或者值的变化情况进行统计。例如明德扬提供的例程中有以下覆盖率组:
下面进行简单的介绍
这里先是新建了一个覆盖率类,里面有三个待检测的变量cfg_lth,cfg_sth,pkt_length,从图片里看到,我们在类里添加了一个覆盖率组pkt_length_cov,覆盖率组(pkt_length_cov)定义了覆盖率点( coverpoint) cfg_lth,cfg_sth,pkt_length,单独看对cfg_lth的覆盖率点定义,可看出对该覆盖率点变量cfg_lth定义了三个容器(bins),以便对cfg_lth值的范围进行统计:第一个容器记录报文长度为9600的次数,第二个容器记录包文长度为1024的次数,第三个容器记录包文长度为64的次数。 而最后的cross关键字表示交叉,即两个覆盖率点里面的容器进行排列组合,系统会自动生成交叉后的容器。举个简单的例子,第一个覆盖率点有3个容器,如果第二个覆盖率点有2个容器,那么cross过后,肯定有3X2个容器。
实现功能覆盖率模型的要点 :
要使用覆盖率组和覆盖率属性实现功能覆盖率模型,需注意以下几点:
(1) 覆盖率组常用于对数据或事务建模,覆盖率属性常用于对时序行为建模。两种语法特性各有各的特点,对不同的功能测试点要使用最合适的建模方式,有时候还可以把两者接合起来使用,比如在覆盖率属性满足时触发覆盖率组的采样。
(2) 与具体实现有关的边角情况应当由设计者本人用覆盖率属性来确定。例如,在某模块中有一个FIFO,设计者应当用覆盖率属性来保证FIFO为空和为满的情况被测试到过。再比如本文前面提到过的FIFO只差一个数据就满时发起一个新的事务的情形也可以用覆盖率属性来保证被测试到。
(3) 应当仔细地设计功能覆盖率数据,使其便于理解和分析。收集覆盖率数据的原因并不是为了收集一组数据,而是为了得到功能覆盖率的信息,为了使通过收集到的功能覆盖率数据分析功能覆盖率信息变得容易,应当仔细地设计功能覆盖率数据,使我们能够一目了然地得到功能覆盖率的信息。
3通过各种验证手段提高功能覆盖率,直至验证完成
构建了包括功能覆盖率模型的测试平台之后,设计者就可以在当前功能覆盖率的指导下通过各种验证手段来提高功能覆盖率。例如,可以先用比较宽泛的随机激励覆盖大多数容易覆盖的情况,然后再分析当前的功能覆盖率,根据它来约束随机激励发生器,以覆盖一些较难覆盖的情况,如果有些边角情况难以用随机激励的方法达到,还可以编写定向的测试激励来达到,甚至通过形式化的方法。
有了自动统计功能覆盖率的模型,我们可以较快地得到当前的功能覆盖率水平,相比于传统的验证过程,不仅仅是节约了时间,它还能让我们根据当前的功能覆盖率情况调整验证策略,以最少的时间达到最高的功能覆盖率,这才是针对覆盖率验证期望达到的目标。