提一个问题:给你一个芯片,怎么做它的验证?
一般过程肯定是把它放到一个专门设计好的电路板上,把BIOS跑起来,进入操作系统,然后跑测试程序.这个答案是对的,但是如果这块芯片的出货量是几十万,上千万甚至上亿,那这个答案远远不够.
首先我们得把可能出现的问题列出来,然后针对这些问题设计验证方案.那会有那些问题呢?
在芯片设计的时候,有前端后端之分.前端实现了逻辑功能,后端负责时钟,电源,功耗等等.等设计完成,那就要拿到工厂流片.然后放到预先设计的主板上上电.
这样,问题就可能出在逻辑信号,模拟或者电气信号,制造工艺,主板设计上.让我们一个个来分析如何找出其中的错误.
对于逻辑信号,我们可以在设计的时候就用仿真工具来验证其正确性.给出输入向量,读出输出,判断是否正确,这就是基本方法.这个方法的好处是可以做到白盒测试,每一个小的模块的功能都可以分析的很细致.缺点是如果在一个非常大的系统上,集成的时候如果测的太细,那会花很多时间.此外,逻辑仿真只能找出逻辑功能上的缺陷.没法发现电气层或者模拟层的问题.哪怕是静态时序仿真,也只是建立在一个近似的晶体管模型上,并不是百分之一百和实际芯片吻合.而这其中的差异,就要靠别的手段来验证.
先来解决第一个问题,如何验证一个10亿门级的系统.在每个小模块都确保正确的情况下,可以把这个大系统前端代码整个的或者部分的
放到一个大型的FPGA上.虽然这样并不是跑在真正的芯片实际时钟下,而且也不能发现模拟信号问题,但是对于验证整个系统的功能非常好.我们甚至能把BIOS和操作系统在这个仿真器上跑起来,从而运行各种软件测试程序.这样就能在流片之前把绝大部分的逻辑设计问题找出来.从而节省成本和开发时间.问题发现的越晚,修正所需的成本和时间越多.之前Intel赔了10亿美元召回SandyBridge的例子很好的说明了这点.
有时候,FPGA仿真器会把内存控制器和中央处理器模块拿出来,用一个真正的硬件(或者是前一代的硬件)来替代.这样也可以减小仿真复杂度,提高运行速度.
假设我们在仿真器上跑通了所有测试,那么我们可以说对于逻辑层的设计,我们有90%以上的信心.接下来就要考虑模拟信号层的问题了.
根