课程链接:https://www.bilibili.com/video/BV1k7411H7Jo?p=30
功能验证的目标在于确定设计有关的功能是否被全部实现了。在功能验证中,我们应当尽可能发现一些不期望发现的情况——比如一些功能没有被实现,一些功能被错误地实现了,又有哪些没有被要求的功能被实现了。
我们无法通过代码覆盖率得知要求的功能是否实现。
功能覆盖率中的第一个概念——覆盖组(covergroup),覆盖组与类相似,在一次定义后便可以多次进行例化。
一个覆盖组包含一个或者多个数据点,这些数据点在同一时间被采集。
覆盖组可以采集任何可见变量,比如程序或者模块变量、接口信号或者设计中的任何信号。对任何事务的采样都必须等到数据被待测设计接收到以后。一个类也可以包含多个覆盖组,每个覆盖组根据需要将它们使能或者禁止。
覆盖组想要采样变量,必须先定义采样事件。只有采样事件被触发后,覆盖组监测的变量才会在该时刻被采样。
从这个图可以看出,覆盖组的具体使用方法。
通常会将覆盖组coverpoint定义在类中,由此不但可以通过虚接口去采样硬件信号,也可以去覆盖类的成员变量。
嵌入式覆盖组声明:只要m_z发生变化,m_x和m_y就会被采样。
覆盖组中的单元覆盖点coverpoint,数据点对数据的采样发生在数据组采样的时候。
可以通过iff语句来禁止在某些情况下对覆盖点的采集,例如在下面g4覆盖组中,对于s0的采样,必须在复位信号释放以后(即reset=0)才允许。
可以看到,覆盖组cg具备两个ref类型的参数,在内部定义了若干个覆盖点cp
a变量表示,在采样过程中只要v_a变量的值在0~63或者65时,那么该仓即被采用一次。覆盖仓b代表数组,范围内的每一个值都将被独立采样,放置到独立的仓中。default表示除了代码里提到的数值,其他数值都会被归类到others这样一个覆盖仓数组。