一、功能覆盖率策略
1.1 收集信息而非数据
- 对于一些设计,你需要关心的是合法的寄存器地址和非法的寄存器地址,可写的寄存器域和非法的寄存器域,而不是具体的寄存器地址数值。
- 一旦关注的地方着眼于感兴趣的状态,而不是具体数值,那么这对于你如何定义功能覆盖率,以及如何收集信息会减轻很大的负担。
- 设计信号如果数量范围太大,应该拆分为多个小范围再加上边界情况。
1.2 只测量需要的内容
- Verifier 需要懂得,在使能功能覆盖率收集时,这一特性会降低很大的仿真性能。
- 由于收集功能覆盖率数据的开销很大,所以应该只测量你会用来分析并且改进测试的那部分数据。
- 同时也需要设计合理的覆盖率采样的事件,一方面提升采样效率,一方面也可以降低收集覆盖率的开销。
1.3 验证的完备性
- 完备的覆盖率测量结果和漏洞增长曲线,可以帮助确认设计是否被完整地验证过。
- 如果功能覆盖率高但代码覆盖率低,这说明验证计划不完整,测试没有执行设计的所有代码。
- 如果代码覆盖率高但功能覆盖率低,这说明即使测试平台很好地执行了设计的所有代码,但是测试还是没有把设计定位到所有感兴趣的状态上。
- 你的目标是同时驱动高的代码覆盖率和功能覆盖率。
二、覆盖组
- 覆盖组(covergroup)与类相似,一次定义后便可以多次实例化。
- covergroup可以包含一个或者多个coverpoint,且全都在同一时间采集。
- covergroup可以定义在类中,也可以定义在interface或者module中。
- covergroup可以采样任何可见的变量,例如程序变量、接口信号或者设计端口。
- 一个类里可以包含多个covergroup。
- 当你拥有多个独立的covergroup,每个covergroup可以根据需要自行使能或者禁止。
- 每个covergroup可以定义单独的触发采样事件,允许从多个源头收集数据。
- covergroup必须被例化才可以用来收集数据。
2.1 在类里定义covergroup
CovPort 的例化 也可也这样 CovPort cg1=new();
- covergroup由采样的数据和数据被采样的事件构成。
- 当这两个条件都准备好以后,测试平台便会触发covergroup。
- 这个过程可以通过直接使用sample()函数完成,也可以在covergroup中使用采样阻塞表示式wait或**@**实现在信号或事件上的阻塞。