什么是验证
无论是我们日常进行求解问题还是进行开发工程,都需要进行测试得到的结果的准确性。用来证明设计的功能正确性,确保设计符合功能描述的过程就是验证。
通常情况下,验证的工作量会大于设计的工作量,通常是占(前端设计+验证)总工作量的70%。举个例子,一双鞋子,工厂制作(使用流水线的机器)可能只需要几分钟,而对于消费者来说,首先需要确定鞋子是否合脚(确定鞋子的大小尺寸),然后要确定鞋子的薄厚,款式、样式、颜色、材质等等。把这些都确认好进行购买后,这时,可以说你完成了鞋子的验证工作。这样的一个流程也可以称为是一种 “验证的过程” 。日常生活是如此,芯片制造中更是如此。
验证中使用的硬件验证语言(HVL)和硬件描述语言(HDL)相比会有一些典型的性质:
- 受约束的随机激励生成;
- 功能覆盖率;
- 更高层次的结构(面向对象编程);
- 多线程以及线程间的通信;
- 支持HDL数据类型;
- 集成事件仿真器,便于对设计实施控制。
测试平台
测试平台的概念对于使用过FPGA进行开发设计的人来说并不陌生,在平时编写FPGA的一些小工程时,都会编写testbench进行模块的验证和测试。通常一个简单的TB包括时钟,激励,测试模块,验证模块功能的方式通常进行使用display在窗口打印输出或者观察波形。
对于验证来说,测试平台也包含上述这些部分,还进一步将这些进行细化,如下图所示:
验证测试平台包括时钟和复位,用于驱动测试平台正常运行;DUT(device under test)为待测的模块;激励用于提供给待测模块输入,对DUT创建测试序列,使得DUT正常工作;监视器部分负责监视模块的数据结果的变化,观察DUT的输入输出,然后将监视结果反馈给核查部分;核查部分对来自监视器和DUT的输出进行比对,进行报告检查结果,如
- 产生激励(Generate stimulus);
- 把激励输入到待测设计上(DUV,Design Under Verification);
- 产生预期(Generate Expectation);
- 捕捉响应(Capture response);
- 检验响应的正确性(Check the response for correctness);
- 根据验证目标评估验证进度(Measure the progress against the overall verification goals);
芯片开发流程
随着芯片的规模越来越大,开发的复杂度和集成度越来越高,从而需要越来越多的人专门去做验证的工作,下图是一个芯片开发的整体流程。
首先需要市场人员与客户沟通;然后由系统设计人员按照功能划分为各个子系统;子系统被进—步划分为功能模块,并由设计团队实现;验证人员对设计功能展开验证,发现设计缺陷,交由设计人员修正;验证没有出现漏洞后,交由后端人员进行综合、布局、布线;后端人员将核心数据交由FAB进行流片。
在一个芯片开发的流程设计中,验证是硅前的比较重要的一环。验证阶段每多发现一个bug,在后期会更小的概率出现灾难级别的系统漏洞。
验证和设计
硬件设计的目的在于创建一个基于设计规范并能完成特定任务的设备。作为验证工程师,主要目的就是确保该设备能够完成预期的目标任务,达到预期的效果。验证的流程可以并行于设计的流程。对于主流的验证流程,一般是不同的人承担验证和设计的工作,当一个设计者拿到功能描述文档后,开始进行功能的RTL设计,一般在晚于设计者的一到两周验证工程师也需要进行阅读功能描述文档,并且进行验证环境的搭建设计。
设计和验证都需要围绕功能描述文档,验证发现结果不符合预期时,如果漏洞明显可交由设计修正,待返回再测试;如果功能实现与设计存在分歧,则需共同回顾功能描述,决定哪一方理解正确,统—对功能的理解。
所以验证和设计都需要认真阅读功能描述文档,设计负责实现功能模块,将其翻译为RTL模型,验证会按照其功能发送激励和比较结果,从而达到功能描述的要求。
验证的工作
所以对于验证部分来说,在开始构建验证环境前,要进行编写验证计划,一般包括需要验证什么样的特性,采用那些技术等等。编写完成验证计划后,围绕项目的需求,进行检查核实设计文件是否正确地按照功能描述文档去实施;设计人员是否有遗漏边界情况(corner case) ;硬件设计是否足够稳定来处理一些错误情况(error response) 。
对于验证部分来说,他的工作就是完成分配给他的模块级(module level) 、子系统级(subsystem level)或者系统级(chip level)的任务。并且期望要求"按时保质低耗"完成目标硬件设计的验证工作。对于成本而言,在硅前验证付出的额外成本,相对是最低的。
缺陷增长曲线
通过缺陷数量在时间线上的记录,我们可以绘制出缺陷数量的增长曲线。一般来讲,缺陷数量的增长曲线是逐渐逼近趋于缓慢的。功能验证需要保证的就是将缺陷数量的增值(至少是致命缺陷数量)保证在硅前阶段,不应该让其发生在硅后测试阶段。针对缺陷的类型,一般会遵循先易后难的验证方法。我们给出的激励向量应该是先易后难,我们发现出的缺陷也应该是先基本后高级。缺陷率的曲线是否在收敛,或者说斜率是否在变小,这一定程度上可以说明验证的状态是否在收敛和趋于完备。