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,可以查看覆盖率报告
完整代码