学习记录20(覆盖率covergroup代码书写)

1.覆盖率收集的什么?
收集的是信息而不是具体的数据,也就是说收集的是某个现象,例如fiffo由空变满,再由满变空就说明已经覆盖了几乎所有情况

2.为什么在验证前期不用打开覆盖率(验证的功能覆盖率)?怎么进行初步验证?
因为覆盖率也会通过new来创建必要的内存空间,会降低仿真性能增加仿真时间,正确的做法是只开启需要分析并改进的那部分数据的覆盖率代码,来尽可能保证仿真性能。初步验证可以通过随机化变量来进行初步验证。

注意:要设定合理的覆盖率采样事件,一方面提高采样效率一方面降低收集覆盖率的开销。

3.验证的完备性
第二点你写的验证代码没有覆盖所有的代码,验证的不够全面,第三点比第二点好一点,虽然能覆盖所有代码但是还没有实现对应的功能或者你写的功能实现是错的,你理解的对但是代码写的不对,需要进一步优化
image
功能覆盖率高而代码覆盖率是验证工程师自己写了自己能想到功能,所以功能覆盖高,而代码覆盖率低是因为代码不是验证工程师写的,提取的验证点较少,本质上是验证计划不完整,测试没有执行设计的所有代码
代码覆盖高但功能覆盖率低可能是验证工程师理解的功能是对的,但是在实现上实现错了或者没有写到关键点
image
刚开始的时候肯定是功能覆盖率低而代码覆盖率高,因为肯定要先覆盖所有代码,再进行功能实现

4.sv的覆盖组(covergroup)
需要实例化需要new,且占据一定开销
covergroup定义在可以定义在哪里?
covergrop可以采样的对象有什么?
covergroup 和 coverpoint 的关系可以概括为:covergroup 是一个“容器”或“测试清单”,而 coverpoint 是这张清单上的“具体检查项”。
image

一个类中可以包含多个covergroup可以自行禁止或使能,也可以定义单独的出发采样事件允许从多个源头收集数据,可以理解为你写好了一份“调查问卷(covergroup)”,但你可以派 10 个调查员(实例)去 10 个不同的地方(信号源),每个调查员按照自己的时间表(触发事件)独立发放问卷。
image
上图是在program中创建覆盖组,与类的创建类似,定义了一个coverpoint是在ifc实例接口,与类相同也是要声明一个句柄,创建一个对象

通常是直接写在类里面,这样直接不用写句柄就直接在类里面定义使用了,此外由于类中定义covergroup所以后续在通过创建该类的句柄或者在子类中继承,注意sample是采样过程
image

采样触发

条件:采样数据(目标是哪个信号)和数据被采样的事件(触发采样的事件发生)
如何完成:1)通过sample()直接完成采样,2)数据被采样的事件可以通过各种条件,例如wait/@

两种触发模式(核心分类):

模式 A:显式手动触发(sample() 函数)
做法:在代码中任何你想采样的时候,直接调用 covergroup_inst.sample();
适用场景:
不存在合适的采样信号(比如你只想在某个特定任务结束后采样一次)。
一个 covergroup 被例化了多个实例,你需要独立控制每个实例的采样时刻(比如监控多个 FIFO,每个 FIFO 的采样时机不一样)。
优点:完全由代码逻辑控制,采样时机和仿真时序解耦。

模式 B:隐式事件触发(@ / wait)
做法:在 covergroup 定义时,直接绑定一个事件或信号变化(如 @(posedge clk) 或 wait(ready == 1))。
适用场景:
存在一个稳定的采样时钟(如 clk),你希望每个周期自动采样。
你想在某个信号跳变时(如状态机进入特定状态)立即触发采样。
优点:自动执行,不需要在代码里到处写 sample()。

image

可以看一下这个链接:https://www.cnblogs.com/Alfred-HOO/articles/19550541
参考:https://www.cnblogs.com/Alfred-HOO/articles/19524256

posted on 2026-08-03 18:14  tuck0603  阅读(16)  评论(0)    收藏  举报

导航