验证导论
1. HVL(Hardware Verification Language)相比于HDL(Hardware Description Language)的一些特点:
- 受约束的随机激励生成;
- 功能覆盖率;
- 更高层次的结构,尤其是面向对象的编程;
- 多线程及线程之间的通信;
- 支持HDL数据类型;
- 集成了事件仿真器,便于对设计施加控制;
2. 漏洞可能发生的地方:
- 代码块层次:功能定义,数据流向等等;
- 代码块边界:对于规范的理解不同;
3. 基本测试平台的功能
- 产生激励;
- 激励加载到DUT上;
- 捕捉响应;
- 检查正确性;
- 对照验证目标测算完成进度;
4.完全覆盖的技术路线
4. 可能随机化的对象:
- 设备配置;
- 环境配置;
- 输入数据;
- 协议异常;
- 错误和违例;
- 时延;
4.1. 设备和环境配置
- 在实际的应用环境中,随着待测设计使用时间的增加,其配置环境会变得越来越随机;
- 可以对仿真的时长,设备的数量,以及端口的配置等等,加以约束进行随机;
4.2 协议异常、错误和违例
- 可以使用一些不当的激励来测试,并在有可能出错的地方加入检验代码,最好能够停下来
- 恰当的使用断言;
4.3 时延和同步
- 尝试不同驱动器以不同的速度通信;
4.4 并行的随机测试
- 可以尝试将处理器名称、处理器核的编号以及不同运行目录的名称加入到种子里进行随机;
5. 功能覆盖率
- 加入代码确定哪些功能是被测试过的,且测试结果如何。
- 覆盖率驱动的验证:
在随机测试中,随着功能覆盖率逐渐接近极限,测试需要改变,以期望找到新的方法去测试尚未被覆盖的区域。 - 对于覆盖率的约束调整,可以写入反馈循环(这需要对设计有深入的了解,以及高超的验证技术);
6. 测试平台的构成
- 在仿真时,测试平台会把整个待测设计包裹起来;
- 测试平台的分层:
- 信号层:待测设计(DUT)与待测设计与测试平台的连接(interface)
- 命令层:
驱动器:执行总线的读写命令驱动待测设计的输入;
断言:监视独立信号的变化;
监视器:监视所有信号的变化,并分组; - 功能层:
代理器:接收事务信息,处理成相应的命令;
计分板:预测代理器接收的事务结果;
检验器:比较来自监视器和计分板的命令; - 场景层:
发生器:产生各种应用场景所需要的的数据驱动功能层; - 测试层:
指挥官的地位,引领着整个测试平台进行合适的测试,包含创建激励的约束;由于经常改变,所以不足为测试环境。 - 功能覆盖率:
衡量测试进展,由于需要经常改变,所以不作为测试环境。 - 测试平台不必需要所有的层次,但测试层是必须的。
7. 对测试环境的仿真
- 建立(build)、运行(run)、收尾(wrap-up)
- 建立
- 生成配置:把待测设计的配置和周围环境随机化;
- 建立环境:基于配置来分配和连接测试平台构件;
- 对待测设计进行复位;
- 配置待测设计;
- 运行
- 启动环境:运行测试平台构件;
- 运行测试:启动测试平台,等待结果;
- 收尾
- 清空:等待待测设计清空最后的事务;
- 报告:根据测试平台的数据反馈编写补充验证报告,对下一步进行安排。