第二章 岗位与行业介绍
岗位介绍
在芯片开发流程中,验证属于前端,验证工程师主要负责尽可能多的发现模块、子系统或系统级设计在RTL阶段(也就是Verilog代码)时隐藏的bug。下图是数字IC开发的全流程图,其中功能验证(前仿真)就是该岗位需要做的工作。
IC验证在整个芯片开发流程中具有很重要的意义,设计模块如果不经过验证,是不允许被流片的,设计如果不经过充分的验证,是没有信心去流片的,因为Bug在综合后或流片后被发现的损失远远超过在RTL级发现。前期写RTL代码如果发现问题,只需要设计人员重新修改并进行回归测试就可以,但流片后发现缺陷,那就是几百万上千万人民币的损失了。因此在芯片开发初期,验证往往需要投入更多的人力和时间成本。
验证又分模块级验证和系统级验证(这里不讨论形式验证和后仿),两者在流程和目的性上有着区别。一般会先对模块级进行设计、验证等工作,待模块级稳定后,会将各个模块相互连接,集成为系统级设计,再针对系统级设计进行验证。本文章主要介绍模块级验证的内容。
待测试的模块或系统一般称为DUT(Design Under Test,待测设计)。模块级验证的工作内容有:
-
阅读功能文档,提取验证所需要的的信息,如设计接口、寄存器、配置流程等。功能文档一般由leader提供,设计人员和验证人员在一起开一个会,确定自己接下来负责的模块,设计人员根据功能文档进行设计,而验证人员根据功能文档展开验证。由于设计和验证都是各自根据功能文档展开工作,所以在理解上存在一定的偏差,因此在一个项目中,验证人员要尽可能多的与设计人员沟通,互相讨论对设计的理解,可以减少不必要的问题。
-
撰写验证计划,计划一般包括:
-
使用何种语言或验证方法学搭建验证环境;
-
使用哪些EDA工具、验证技术以及对设计进行仿真验证;
-
工程师自己从设计功能文档中所理解到的设计功能有哪些,将采用什么样的寄存器配置方式或激励进行测试;
-
功能覆盖组的定义和覆盖率收集的方式,功能覆盖率确保需要验证的设计功能有没有疏漏,而代码覆盖率可以发现设计内部的逻辑错误导致的无法执行的语句和冗余的代码;
-
验证环境的结构图;
-
验证环境中将会使用到哪些VIP(Verification IP,验证IP,指验证环境中针对特定接口或总线使用的通用的、可扩展的、复用性强的验证组件);
-
参考模型如何准备;
-
根据验证计划使用熟悉的语言和验证方法学搭建环境,并创建若干冒烟测试(冒烟测试的目的是检查环境是否能够正常运行,以及DUT的基本功能有没有问题,如mem读写、寄存器读写、FIFO读写、总线接口协议是否正确等)。验证环境的初期可以没有Scoreboard(计分板)、refmod(参考模型)以及coverage_model(覆盖率模型),只需要保证该环境具有可扩展性、复用性,以及能够基于该环境创建需要的测试用例就好。
-
根据验证计划,逐一测试设计的功能。在这个部分大概率需要Scoreboard和refmod,用于检查功能上的错误。Scoreboard由验证人员定义,而Refmod可以使用C模型或自己定义。每一个功能可以由一个或多个TC(Test Case,测试用例)测试,在多种随机约束的范围下保证该功能点的正确性。当然,只测试
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
《数字IC验证校招指南》,专刊共计两部分,分别介绍了数字IC验证岗位的工作内容和该岗位的校招流程,包括简历准备、投递流程、笔试面试、名企笔试面试真题以及个人经验总结。本专刊将全面介绍笔者在校招过程中的经验,通关大厂技巧,让你们的求职之路更加顺畅。