前言:
什么是验证:用来证明设计功能的正确,符合设计功能描述的流程(两者有区别)
测试平台
- 观察DUT创建测试序列(Stimulator)
- 观察DUT的输入输出(Moniter)
- 对DUT的输出数据与预期数据进行比对(Checker)
- 报告检查结果
软件验证和硬件验证的区别:时序的问题
芯片开发流程
- 用户需求:从市场人员与客户开始,与系统设计人员一同生成设计结构与产品描述文档
- 系统设计:系统设计人员按照功能划分为各个子系统,推出模块功能详述文档
- 硬件设计:子系统被进一步划分为功能模块,并由硬件设计团队实现写出硬件描述文件
- 功能验证:验证人员编写验证环境文件和测试用例对设计功能展开验证,发现设计缺陷,交由设计人员修正
- 后端综合:验证没有出现漏洞后,交由后端人员进行综合、布局、布线
- 芯片流片:后端人员将核心数据交由FAB进行流片
为什么芯片设计是流水线,做不到软件设计一样频繁迭代:芯片设计的成本太大。
交给后端综合、布局布线之前的验证为功能验证,而后端只需要通过工具对静态时序进行分析,进行小幅的一些修正,其实可以达到一个不需要验证的水平 但是在实际过程中,我们在布局布线后会做门级验证,门级验证主要是查看一些没有预料到的情况,比如接口时序的问题,跨时钟域的问题。
验证人员做了哪些工作
在设计人员根据设计功能描述,实现各个模式RTL代码之后,开始构建验证环境,做几项工作来检查设计:
- 设计文件是否正确地按照功能文档去实施了?
- 硬件设计人员是否有遗漏的边界情况(corner case)?随机能够帮助我们击打边界情况
- 硬件设计是否足够稳定来处理一些错误情况(error response)
验证和设计的协作
- 验证和设计都需要认真阅读功能描述文档
- 设计会将其翻译为RTL模型验证会按照其功能发送激励和比较结果
- 验证会按照其功能发送激励和比较结果
SystemVerilog提供了外界语言的接口,验证人员可以利用c/c++等高级语言编写预期模型对模块进行验证
设计和验证的关系
独立设计和验证
合作设计和验证
验证的重要性
- 重大缺陷造成额外的成本损失是越靠后越巨大(尽量在硅前)
- 验证阶段快而全地找到缺陷)
- 缺陷率增长曲线的曲率是逐渐减小
- 快而全地提供缺陷率增长是理想目标(量化验证)
重大缺陷:一旦出现重大缺陷,整个芯片的绝大多数基本功能,甚至是核心功能受到影响甚至是不可修复的(软件也搞不定)
验证的目标
- 对于一名验证师而言,他的工作就是完成分配给他的任务这个任务可能是模块级(module level)、子系统级(module level)或者系统级(module level)
- 验证的目标,就是“按时保质低耗”完成目标硬件设计的验证工作
- 按时:考虑节点(milestone)
- 低耗:更短的时间和人力,可以预期控制的成本
- 保质:尽可能地将缺陷暴露在流片以后,减小额外成本
缺陷增长曲线
- 通过缺陷数量在时间上的记录,我们可以绘制出缺陷数量的增长曲线
- 采取先简单再复杂的测试序列
- 保证缺陷增长曲线逐步收敛
- 在验证后期阶段不应该再出现基本设计缺陷
验证周期
- 创建验证计划 ➡ 在验证过程要经常回顾验证计划
- 开发验证环境
- 调试环境和HDL文件 ➡ 检查验证代码
- 递归测试(回归测试) ➡ 流片前验证完备性检查
- 硅后系统测试
- 展开逃逸分析(escape analysis) ➡ 吸取教训
思考问题
设计人员和验证人员他们的协作关系体现在哪些地方?
- 验证和设计都需要认真阅读功能描述文档
- 设计会将其翻译为RTL模型
- 验证会按照其功能发送激励和比较结果
为什么芯片验证的重要性目前越来越高?
- 硬件设计没有验证是没有信心去流片的
- 即使流片成功,设计缺陷暴露的问题会使芯片设计的额外成本呈指数上升
- 对于航天芯片、汽车芯片等重要芯片需要极高的安全性,需要芯片验证团队保驾护航
在一个完成的验证周期中,有哪些工作需要完成呢?
- 创建验证计划
- 开发验证环境
- 调试环境和HDL文件