制造一颗芯片为什么那么慢

做芯片是一个复杂的系统工程。涉及到了数字、模拟、SRAM、仿真、验证、物理设计,但也还仅限于芯片设计的范畴,并且不包括其它重要的芯片设计工作,比如处理器架构、各种算法的加速、以及比较特殊的射频、固态存储、FPGA等等。站在更高的角度看整个芯片的开发流程,芯片设计仅仅是个开端,后面还有制造、封装、测试、系统、软件、产品等等。那么今天来说下芯片测试的问题。

芯片测试

芯片测试本身就是一个大杂烩。我个人认为它可以分为两大类:出厂前的测试和出厂后的测试(这个“厂”是制造芯片的工厂,或者叫做芯片的代工厂)。前者主要是确保芯片在制造过程中没有产生缺陷(比如金属线没有短路/断路)并且芯片上基本的元件达到了技术指标(比如逻辑门足够快)。后者主要是确保芯片在功能上没有缺陷(比如是否能处理某些特殊情况)并且达到了芯片这一级的各项指标(比如整体功耗、数据传输速度等等)。

芯片的生产是一个流水作业,流水线上的每一个环节都不能太慢。测试设备比较昂贵,每块芯片占用测试设备的时间是决定生产成本的一个重要因素。所以出厂前的测试,需要在尽可能短的时间内能尽可能多地找出有缺陷的芯片,同时还不要轻易丢掉没有缺陷的芯片,这就产生了一门学问,叫Design For Testability(DFT)。

芯片上的晶体管数以十亿计,金属连接更是不计其数,要想在短时间内对它们做个遍历并不是件容易的事。例如处理奇偶校验码异常的电路,在没有发生异常的时候是不工作的。根据我个人的经验,一个复杂的电路,花在验证上的工作量大于设计的工作量,而验证工作又有相当大一部分是做各种异常情况的处理。为验证而做的仿真中,可以通过在testbench中人为制造异常而迅速验证相关电路。然而,当电路设计做到了芯片上,内部节点很难从外部直接控制。

出厂后的测试它们要让芯片跑起来。在这里主要谈谈它们的区别。验证的主要手段是仿真,即让一个虚拟的芯片跑起来,而测试是真刀真枪地把应用跑在芯片上、系统上。仿真所能覆盖的范围通常只是芯片的一部分,其它东西比如外围设备,以及跟外围设备通信的接口电路基本上都是用模型来代替。这些模型是否正确,是否能代表所有的实际情况,常常存在或多或少的不确定性。另外,因为仿真的速度很慢,比较难在仿真中跑一个复杂的实际应用(仿真的速度大概是实际芯片运行速度的百万分之一)

从流片到第一批芯片从fab出来,大概需要几个月的时间。拿到第一批芯片之后,把它们焊上电路板,接上各种外围设备,然后开始系统级的测试。这个时候,以前的仿真中没有出现的问题就可能会曝露出来。修改一次电路板,包括电路板的重新生产,大约几周时间,花费远低于一次芯片流片。当然,这些高速信号的问题,有时候是跟电路板的设计和芯片上接口电路的设计都有关,这又是一个团队合(che)作(pi)的好机会。最后剩下的就是芯片里面的问题了。跑仿真的时候出现了问题,可以比较容易通过检查芯片内部节点的波形来debug。然而在系统测试中,芯片内部的情况大多只能通过读寄存器来debug。

当然,有一些芯片上的bug极其隐蔽,不仅流片之前没有发现,芯片做好之后仍然没有在测试中曝露出来,一直到产品上市之后才被发现。一个著名的案例就是某硅谷大厂曾经召回了存在浮点运算bug的芯片,损失数亿美元。这样的问题足以说明测试工作在芯片开发流程中是多么重要。当一块芯片流片回来,把一个仿真改一改,让它跑在真正的芯片上,之前跑仿真的时候,屏幕上打印的中间结果慢得像蜗牛在爬,而现在是唰唰飞过,快得眼睛不能适应,心中暗暗感叹:多少伟大的公司是通过流片来做仿真….