诊断之美-芯片验证方法

来源:互联网 发布:软件停服通知 编辑:程序博客网 时间:2024/05/01 04:45

提一个问题:给你一个芯片,怎么做它的验证?

一般过程肯定是把它放到一个专门设计好的电路板上,把BIOS跑起来,进入操作系统,然后跑测试程序.这个答案是对的,但是如果这块芯片的出货量是几十万,上千万甚至上亿,那这个答案远远不够.

首先我们得把可能出现的问题列出来,然后针对这些问题设计验证方案.那会有那些问题呢?

在芯片设计的时候,有前端后端之分.前端实现了逻辑功能,后端负责时钟,电源,功耗等等.等设计完成,那就要拿到工厂流片.然后放到预先设计的主板上上电.

这样,问题就可能出在逻辑信号,模拟或者电气信号,制造工艺,主板设计上.让我们一个个来分析如何找出其中的错误.

对于逻辑信号,我们可以在设计的时候就用仿真工具来验证其正确性.给出输入向量,读出输出,判断是否正确,这就是基本方法.这个方法的好处是可以做到白盒测试,每一个小的模块的功能都可以分析的很细致.缺点是如果在一个非常大的系统上,集成的时候如果测的太细,那会花很多时间.此外,逻辑仿真只能找出逻辑功能上的缺陷.没法发现电气层或者模拟层的问题.哪怕是静态时序仿真,也只是建立在一个近似的晶体管模型上,并不是百分之一百和实际芯片吻合.而这其中的差异,就要靠别的手段来验证.

先来解决第一个问题,如何验证一个10亿门级的系统.在每个小模块都确保正确的情况下,可以把这个大系统前端代码整个的或者部分的

放到一个大型的FPGA上.虽然这样并不是跑在真正的芯片实际时钟下,而且也不能发现模拟信号问题,但是对于验证整个系统的功能非常好.我们甚至能把BIOS和操作系统在这个仿真器上跑起来,从而运行各种软件测试程序.这样就能在流片之前把绝大部分的逻辑设计问题找出来.从而节省成本和开发时间.问题发现的越晚,修正所需的成本和时间越多.之前Intel赔了10亿美元召回SandyBridge的例子很好的说明了这点.

有时候,FPGA仿真器会把内存控制器和中央处理器模块拿出来,用一个真正的硬件(或者是前一代的硬件)来替代.这样也可以减小仿真复杂度,提高运行速度.

假设我们在仿真器上跑通了所有测试,那么我们可以说对于逻辑层的设计,我们有90%以上的信心.接下来就要考虑模拟信号层的问题了.

根据经验,模拟信号层的问题大多出在时钟和电源上.比如毛刺,上电次序,过冲,时序,电流补偿,电阻补偿,,晶体管输入电压等等等等.所有的模拟模块设计的时候,都会做很详尽的模拟信号仿真.那为什么还会出问题呢?可能是仿真时候所用的模型不够精确,也可能制造的工艺上存在偏差.总之原因很多.我先来讲下怎么来分类逻辑信号和模拟信号的验证.

当我们设计出一个逻辑模块的时候,如果它的输入输出都是另外一个逻辑模块,既没有到芯片外,也不是电源,时钟等模拟信号,那么我们说这些输入输出信号都是逻辑信号.虽然他最终也是变成一个物理上的电信号在芯片各个晶体管之间流动,但由于距离很短,我们可以近似认为这个是理想的零或一.这就是所谓的逻辑信号.至于为什么可以这么假定,根据信号完整性的经验,只有当传输距离和波长相近或者更长的时候,才会出现信号完整性问题,也就是说,才需要考虑信号的模拟特性.在一个1G HZ的芯片里,波长是光速除以频率等于0.3米,而指甲大那么点地方就有十亿门晶体管,传输距离显然远小于波长.如果这个信号需要连到芯片外,那么就有可能接近波长,从而需要考虑其模拟特性了.

那么怎样来验证模拟信号呢?我们可以把所有电源,时钟,以及和芯片外部管脚都看作模拟信号模块.验证就可以针对这些东西来设计.这些模块有个别称,叫做硬IP(Interlectual property),而那些逻辑的模块叫做软IP.硬IP除了在设计阶段需要做仿真来验证之外,在流片拿到真正的芯片之后,还需要做各类验证.有以下几类:

输出信号的验证.主要是看由芯片发出来的信号,时序是不是对,有没有毛刺,各种DC, AC Charicterization(直流交流特性)是不是符合要求.电流电阻补偿是不是起作用.如果不太符合,还需要重设各类预先设计好的寄存器,调整参数,最终使得输出波形符合要求.如果还是不行,那么就要调整设计重新,重新流片.

输入信号的验证.主要是看在给定各类外部信号的情况下,能不能触发预先设计好的功能和内部信号.比如过载,差分信号的零和一,使能,关闭等等.

时钟和电源信号的验证.这其实是把内部信号接到外部的示波器上来观察.虽然会有些变形,但是看看基本的电压和频率什么的还是可以的.如果需要看更精确的信号,就需要一整套DFX(Design For Testing/Valiation/Debug)系统.这个以后会在验证的手段里面讲到.

逻辑信号和模拟信号都验证完了,那还需要什么?前面提到,在工厂制造的过程中也会有问题,从而逻辑信号和模拟信号都会受影响.在工厂大批量制造的时候,不可能像在研发阶段使用各种各样的手段去验证各个层面的功能.解决方法是,工厂每条生产线上都会有一台或者几台大型测试仪,可以把芯片管脚直接连到测试仪上,运行10秒左右的各个模块的最基本的功能测试.如果没问题,那么芯片才可以出货.当然,不是说过了测试仪这关的芯片都是好的.有些潜在问题还是发现不了.好的流程可以把这些问题芯片控制在100每百万片.差的那1000每百万片也是有的.请注意工厂的良率是另外一个概念.良率指的是通过检测的芯片数量除以总产量.而不是卖出去最终发现质量有问题的比例.好的工厂良率可以做到95%,,一般的60%也有.

前面还提到了问题还可能出在主板上.从芯片的角度讲,这类问题是不需要处理的.但是一旦出了问题,需要花时间来判断是芯片还是主板的原因.而且,每个芯片的管脚都需要一个规范来定义各种直流交流电特性.这些值的范围在设计主板的时候就需要考虑到,作为用来验证芯片功能的主板,上面需要把各种符合规范情况的极限值都设计上去,并且一一验证.因此,主板的验证包含以下这些:

输出信号完整性仿真.在主板打板之前,每个管脚上都需要加上限制条件,然后跑仿真,看看是不是在极限情况下都符合要求.

输出信号完整性验证.在拿到主板和芯片之后,需要在示波器上把每种极限情况都记录下来,看是不是符合要求.此外.需要注意的是,这个测试中,所有信号必须在连线末端测,并且末端阻抗要保持正确.如果是在刚出芯片的地方测,那就是属于前面说的芯片输入输出信号验证了.

一致性测试.对于一些高速接口,其协议定义了输出信号的规范,并且很多示波器会包含这样一些工具来帮助判断信号是否符合规范.所要做的就是把信号(通常是差分信号)连到示波器,然后控制芯片进入测试向量输出模式,让示波器接受信号并判断.其中一种叫做眼图,其过程就是通过模式识别,把特殊阶段的0-1-0和1-0-1信号记录下来,然后重叠在一起.当样本足够多,就可以形成一个像眼睛一样的图.如果眼图张角在规定范围内,说明信号质量过关.

功耗验证.主要是针对芯片以及主板电源和功耗.方法是利用示波器采样单位时间内的电源输入管脚的电压和电流,然后控制芯片打开或者关闭某些功能和模块,来获取某阶段的功耗情况.在芯片设计阶段,也会有基于晶体管模型的静态功耗分析.

机械设计验证.主要是针对主板的

散热验证.主要是针对主板热力设计的.芯片的散热验证不太清楚.

(以上两条只闻其名,具体怎么做不是很明白)

就算做完了以上所有的验证,也不能保证芯片设计就没问题.其他的问题可能出在:

偶然发生的错误,比如时钟毛刺,逻辑设计缺陷等等.这样需要回归测试(Regression)长时间运行测试程序来发现问题.

温度,湿度,电压会对芯片造成影响,可以用对应的仪器设备来模拟各种环境.这个就不用多讲了.

老化测试.

一块Wafer(晶圆)上可能有上千片芯片,而每次流片可能有很多晶圆.不同晶圆,不同位置上的晶体管特性都不一样.同一种特性,也存在有的电子漂移快,有的慢.针对这种情况,每个芯片都被归类到一个特殊的Skew里面.每种Skew都需要被特别的分类测试,以找出他们各自电气特性的极限值,并把模拟电路部分参数作相应调整.

以上一些测试,都是在芯片工作状态,不断的运行测试程序,直到预订时间或者错误发生.

这里我用了测试这个词语.它和验证的区别在于,验证更强调功能的正确与否,测试强调在各种条件下重复的检验.至于诊断,强调的是利用自动化的工具发现错误的原因.而除错(Debug),则强调人工参与找出错误根源.

还有一些和芯片连接的设备相关的测试.比如列出一个支持清单,上面包含所有的可能连到芯片的设备.对于每一个设备,都需要得到相应的驱动程序,然后不断做一些功能性的操作,看是否会出问题.

最后还需要把所有操作系统,硬件驱动程序,应用程序放在一起,长时间运行测试程序,看看性能如何.这个过程有很多名字,每个公司叫法不同.

写了那么多验证,归结起来只有三种:分别基于逻辑信号,模拟信号,参数变化和客户环境.前两种是基础,要针对每个模块做大量的测试程序开发.后面主要是反复运行发现边角问题.

从时间上划分,逻辑信号的验证应该在设计阶段和仿真阶段就完成,也就是流片前.等芯片拿到手,当然也需要跑测试,但是这时候已近是解决了大部分逻辑问题的了.不能说拿到了以后再跑,那会大大延迟产品周期.模拟信号的验证除了仿真外,基本是流片后做的.其余两个也是.

至此,大部分验证都包含了.开头的问题也就有了答案.