什么是covergroup?
- “covergroup”是一种用户定义的类型,以在同一个事件触发时采样相应的变量值。
- “‘covergroup’中需要收集的信息实际上代表了设计的规格。
- covergroup’可以在“package’”、“module’”、“program’”、“interface’ ”和“class’”中定义。
上图是covergroup关键语法的示意:
- 没有coverpoint的covergroup是没用的,但是编译器可能不会报Error。
- Covergroup,顾名思义,就是一组coverpoint,也就是说一个covergroup中可以有多个coverpoint。
- 必须实例化covergroup才有意义。
- 可以提供(非强制性)一个事件来确定covergroup中的coverpoint何时被采样。如果省略了事件,则必须显式使用内置方法sample。
什么是coverpoint ?
- coverpoint 简单来说就是一个能够代表设计规格的变量或者变量表达式
- 每个coverpoint 可以是一个值或者值的切换。
- “bins”可以由用户定义或由 EDA 工具自动创建。
功能覆盖率就是通过bin的覆盖情况统计出来的。
Coverpoint的语法如上图所示:
covergroup g1 在(posedge clk) 采样。 “oc”是Coverpoint的名称。‘oc’覆盖了2比特变量‘offset’。由于没有指定收集哪些bin,EDA仿真工具会默认为我们创建4个bin(auto[0]、auto[1]、auto[2]、auto[3]),分别表示覆盖2’b00、2‘b01、2’b10、2‘b11
因为上图中所有的场景被被覆盖了,所以覆盖率是100%。
一个covergroup/coverpoint的示例
PCI协议由许多不同类型的总线周期组成。我们在仿真过程中希望确认是否已经覆盖了每种类型。
下面使用枚举类型pciCommands定义各种总线周期类型
covergroup指定了正确的采样事件(在这里是FRAME_的下降沿)。
从仿真性能的角度来看,这个采样事件非常重要,如果使用@ (posedge clk)进行采样会增加很多的仿真性能开销。
在上面的例子中,我们没有指定任何bins。仿真器将自动创建12个在FRAME_下降沿采样的bins,分别代表12个总线周期类型。
在每一次FRAME_下降沿,仿真器会查看总线上的pciCommands_cover是否是这12个总线类型中的一个,如果匹配则表示该总线类型被cover一次。
作者:验证哥布林
来源:芯片设计验证微信号https://mp.weixin.qq.com/s/_2KaHWTnK_KEgsQsPzkFkA
https://mp.weixin.qq.com/s/7w2tivnWSK_hxEW1rGSwTQ
https://mp.weixin.qq.com/s/7FlXrRWbtmQAEDQMqM5W0A
推荐阅读
更多数字IC设计技术干货等请关注数字芯片实验室专栏。添加极术小姐姐(微信:aijishu20)微信可申请加入IC设计交流群。