SoC设计的验证需要投入大量的资源(已占整个设计资源的40%~70%),而随着设计规模的增大,验证技术已经落后于设计和制造能力,使模拟和验证成为整个设计流程的瓶颈,给提高设计生产率造成了障碍,因此如何更快更好地完成验证工作是目前业界所关注的问题。目前芯片一次投片成功率只有35%左右,主要原因就是验证不够充分。验证包括功能验证、等价性检查(Equivalent checking)、静态时序分析和时序验证、物理验证等几方面。
对功能验证这个环节,大多数芯片设计公司目前采取的办法都是通过运用合适的或更先进的验证平台、灵活运用各种验证方法、提高验证的可用性和复用性、增加人员的投入和每日工作时间,从而缩短验证时间来达到开发周期缩短的目的。
至于设计和功能验证的协同工作方案,基本可以归纳为:
1. 根据原始算法、系统要求等产生各种设计所需文档,如总体文档、功能设计详细文档、接口定义文档等;
2. 设计人员和验证人员分头根据这些文档进行子模块的代码设计、子模块的验证环境搭建、系统级验证环境的搭建工作;
3. 子模块验证人员需要等待下列工作都完成后才能进行验证工作,包括:a. 子模块设计完成并通过基本功能仿真和数组基本固定数据的测试,假如来自算法标准部门的基本固定测试数据不能及时提供,还需等待标准部门的工作完成;b. 参考模型的提供;c. 子模块验证环境搭建完毕。子模块验证人员在此基础上才能进行后续的工作,如验证环境的调试、测试用例的编写及测试等。
大多数时候,验证处于等候的状态,因为被验证对象比较复杂,内部设计经常会出现架构和算法方面的调整,会有延误和返工。即使不做模块级验证而直接做系统级验证也会有这些等待过程,更何况对于大型的设计,按正规、严谨的流程应该是在模块级验证通过的基础上进行系统级验证,这样有助于减少系统级验证的工作量及难度,从而有效缩短功能验证的时间,因为模块级验证通过后,系统级验证需要验证的主要就是接口和子模块间的交互控制了。
可以看到,按上述的方案设计和功能验证属于串行工作,一方面会有很多等待环节,从而造成功能验证的最终完成时间的滞后,另一方面如果要保证最终的交付期限,又要给功能验证预留相对充足的时间,就需要压缩设计的时间,给设计人员带来巨大的压力,引发人力投入和设计质量的矛盾,而设计质量的好坏同样会对后续环节造成影响,最终导致芯片设计周期的拉长。
基于上述实现方案存在的弊端,我们提出了下面这种提高芯片设计和功能验证过程的并行度方案。对于一个电路系统的设计,我们可以把它划分为多个子模块,子模块间有信号的交互(如控制信号和数据等)。对于其中一些功能比较复杂的子模块,当子模块接口定义清晰后,模块设计人员先做一个暂时性模块,该模块的外部接口信号和正式模块的一致,但内部逻辑与正式模块相比很简单,只需按不同功能模块的特定要求完成输入到输出的传递工作,省掉了复杂的内部处理过程,提供给验证人员以便搭建环境、调试环境,做一些和内部具体处理算法无关的工作,如接口、模块间交互、整个数据流打通等。
nload="javascript:if(>740)=740" align=center border=0>
图:采用暂时性模块使芯片设计和功能验证并行展开的实例。
这样的暂时性模块由于功能很简单,当子模块接口定义清晰后其编码、仿真和参考模型都能快速提供给功能验证环节,消除了功能验证的等待过程,接着模块设计人员、参考模型提供者做正式模块的编码仿真等工作,而同时验证人员针对单个暂时性模块及由暂时性模块集成后的系统的验证环境搭建、调试及验证工作也可以展开,而且此时的验证只专注于接口、模块间交互、整个数据流打通,便于出错时的定位,降低了验证难度,缩短了验证时间。
由于正式模块内部的正确性可以由功能仿真、测试向量对比,与参考模型的一致性过程得到基本的保证,对暂时性模块的验证过程也能证明验证环境的正确性以及被验证对象在接口和内部模块交互、数据通路方面的正确性,这时验证人员用正式模块、正式参考模型替换掉验证环境中的暂时性模块、暂时参考模型做进一步测试,此时出问题的几率更小,定位更容易,进一步缩短了验证时间。
总之,按照上述实现方案,避免了验证工作的等待和减轻了设计在短时间内的压力,使设计和功能验证能相对独立地同步进行,最大限度地排除了相互之间的影响、降低了难度、节省了时间。
下面以一个简单的实例加以说明暂时性模块的构造。假定正式模块要完成的功能为当收到start信号后,从RAM1读出数据经过复杂处理过程模块的处理后把结果存入RAM2,当数据处理完毕后发出结束指示信号done,暂时性模块可以这样构造,当收到start信号后,从RAM1读出数据直接写入RAM2,写完后发出结束指示信号done,阴影处为被取消的部分。
该方案操作简单、便于实施,关键在于先构造相对简单的、接口和正式模块一致的暂时性模块以代替正式模块进行验证方面的工作,从而使设计工作和验证工作能并行开展,正式模块设计及仿真完成后再用于替换掉验证环境中的暂时性模块。
由于在任何设计中,接口都是最早确定的,提供一个只关注接口的模块可以使验证工作第一时间展开,不需等待。因为测试模块和被测对象交互的就是接口,我们可以先不关注数据的正确性,而是打通数据和控制通路。这么做的优点很明显,减轻了设计在短时间内的压力,使设计和功能验证能相对独立地同步进行,最大限度地排除了相互之间的影响、降低了难度、缩短了芯片开发周期。