SV 覆盖率

  • 覆盖率分为功能覆盖率和代码覆盖率

基于覆盖率驱动的验证技术

  • 覆盖率检测可以采用穷举方法或者是随机检测的方法
  • 功能覆盖率是根据spec提取出功能点然后定义的功能覆盖率

功能覆盖率模型

功能覆盖率收敛

功能覆盖率数据

功能覆盖率数据的归一化和分析

代码覆盖率

断言覆盖率

功能覆盖率


基于覆盖率驱动的验证策略

覆盖率和Bug Rate的关系

定义功能覆盖率模型

  • 使用covergroup模块建立覆盖率模型
covergroup cg @(posedge);
  c:coverpoint color;
endgroup

  • covergroup的命名要有意义

功能覆盖率建模

  • 创建covergroup之后会,创建covergroup对象,通过covergroup对象调用sample()方法,进行采样
  • covergroup定义的时候没有敏感列表必须显式调用sample()函数进行采样

功能覆盖率报告

  • 没有指定bins,会自动生成bins,port是3bit的,所以会自动生成7个bins
  • at least可以进行设置
  • 为了提高覆盖率,可以跑更多的仿真次数,可以更改seed,可以添加约束,可以添加定向测试

功能覆盖率的采样事件

  • covergroup之后添加敏感列表,可以等待时钟沿\事件或者电平信号

定义覆盖点:信号和表达式

定义覆盖点:表达式

  • +5'b0是为了将4bit数转换为5bit数,防止溢出

定义覆盖点:bins

  • bins - 默认生成的bins最大是64个
  • 如果有一个32bit的数,默认生成的bins最大只有64个,每个bins的大小为2^32 / 64
// 定义bins的写法
covergroup Covlen;
  len:coverpoint {tr.hdr_len+tr.payload_len+5'b0};
  {
    // 会将0-23的每个数当成是一个bins,共24个bins
    bins len[]={[0:23]};
    // 一个bins,范围从[0:23]
    bin len = {[0:23]};
  }
endgroup

  • bins有23个 - 需要至少每个bins都出现一次才可以,所以至少23次
  • bins如果只有一个,那么至少跑1次

定义覆盖点:条件覆盖

定义覆盖率:状态跳转覆盖

  • ? - 表示不关心该bit

定义覆盖点:交叉覆盖

  • kind - 16个bins
  • port - 8个bins
  • cross kind,port - bins为128个

参数化的覆盖率:提高代码覆盖率


总结

  • CDV - 基于覆盖率驱动的验证计数
  • 覆盖率类型:代码覆盖率和功能覆盖率
  • SV中的功能覆盖率建模
  • 定义覆盖率模型:covergroup

案例




// 打开dve
dve -cov& 

// 覆盖率文件在sim.vdb文件中,将这个文件load到dve中
// 在hierarchy中找到function group
// 双击coverage definition,可以查看覆盖率报告

完整代码


posted @ 2024-01-28 12:49  Icer_Newer  阅读(205)  评论(0编辑  收藏  举报