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



浙公网安备 33010602011771号