西洲渡

一只还没迈入IC领域的小菜鸡

SV系统验证(1)——芯片开发及验证概述

前言:

什么是验证:用来证明设计功能的正确,符合设计功能描述的流程(两者有区别)

测试平台

01.png

  • 观察DUT创建测试序列(Stimulator)
  • 观察DUT的输入输出(Moniter)
  • 对DUT的输出数据与预期数据进行比对(Checker)
  • 报告检查结果

软件验证和硬件验证的区别:时序的问题

芯片开发流程

  • 用户需求:从市场人员与客户开始,与系统设计人员一同生成设计结构与产品描述文档
  • 系统设计:系统设计人员按照功能划分为各个子系统,推出模块功能详述文档
  • 硬件设计:子系统被进一步划分为功能模块,并由硬件设计团队实现写出硬件描述文件
  • 功能验证:验证人员编写验证环境文件和测试用例对设计功能展开验证,发现设计缺陷,交由设计人员修正
  • 后端综合:验证没有出现漏洞后,交由后端人员进行综合、布局、布线
  • 芯片流片:后端人员将核心数据交由FAB进行流片

02.png

为什么芯片设计是流水线,做不到软件设计一样频繁迭代:芯片设计的成本太大。

交给后端综合、布局布线之前的验证为功能验证,而后端只需要通过工具对静态时序进行分析,进行小幅的一些修正,其实可以达到一个不需要验证的水平 但是在实际过程中,我们在布局布线后会做门级验证,门级验证主要是查看一些没有预料到的情况,比如接口时序的问题,跨时钟域的问题。

验证人员做了哪些工作

在设计人员根据设计功能描述,实现各个模式RTL代码之后,开始构建验证环境,做几项工作来检查设计:

  • 设计文件是否正确地按照功能文档去实施了?
  • 硬件设计人员是否有遗漏的边界情况(corner case)?随机能够帮助我们击打边界情况
  • 硬件设计是否足够稳定来处理一些错误情况(error response)

验证和设计的协作

  • 验证和设计都需要认真阅读功能描述文档
  • 设计会将其翻译为RTL模型验证会按照其功能发送激励和比较结果
  • 验证会按照其功能发送激励和比较结果

03.png

SystemVerilog提供了外界语言的接口,验证人员可以利用c/c++等高级语言编写预期模型对模块进行验证

设计和验证的关系

独立设计和验证
04.png
合作设计和验证
05.png

验证的重要性

  • 重大缺陷造成额外的成本损失是越靠后越巨大(尽量在硅前)
  • 验证阶段快而全地找到缺陷)
  • 缺陷率增长曲线的曲率是逐渐减小
  • 快而全地提供缺陷率增长是理想目标(量化验证)

重大缺陷:一旦出现重大缺陷,整个芯片的绝大多数基本功能,甚至是核心功能受到影响甚至是不可修复的(软件也搞不定)

06.png

验证的目标

  • 对于一名验证师而言,他的工作就是完成分配给他的任务这个任务可能是模块级(module level)、子系统级(module level)或者系统级(module level)
  • 验证的目标,就是“按时保质低耗”完成目标硬件设计的验证工作
    • 按时:考虑节点(milestone)
    • 低耗:更短的时间和人力,可以预期控制的成本
    • 保质:尽可能地将缺陷暴露在流片以后,减小额外成本

缺陷增长曲线

07.png

  • 通过缺陷数量在时间上的记录,我们可以绘制出缺陷数量的增长曲线
  • 采取先简单再复杂的测试序列
  • 保证缺陷增长曲线逐步收敛
  • 在验证后期阶段不应该再出现基本设计缺陷

验证周期

08.png

  1. 创建验证计划 ➡ 在验证过程要经常回顾验证计划
  2. 开发验证环境
  3. 调试环境和HDL文件 ➡ 检查验证代码
  4. 递归测试(回归测试) ➡ 流片前验证完备性检查
  5. 硅后系统测试
  6. 展开逃逸分析(escape analysis) ➡ 吸取教训

思考问题

设计人员和验证人员他们的协作关系体现在哪些地方?

  • 验证和设计都需要认真阅读功能描述文档
  • 设计会将其翻译为RTL模型
  • 验证会按照其功能发送激励和比较结果

为什么芯片验证的重要性目前越来越高?

  • 硬件设计没有验证是没有信心去流片的
  • 即使流片成功,设计缺陷暴露的问题会使芯片设计的额外成本呈指数上升
  • 对于航天芯片、汽车芯片等重要芯片需要极高的安全性,需要芯片验证团队保驾护航

在一个完成的验证周期中,有哪些工作需要完成呢?

  1. 创建验证计划
  2. 开发验证环境
  3. 调试环境和HDL文件

附录:芯片开发概述及验证概述思维导图

09.png