4、扫描链设计进阶:多扫描链,扫描链平衡,扫描链的时钟与复位处理

各位同学,欢迎来到第四章。上一章我们聊了扫描链的基本概念,说白了就是把普通寄存器串成一条链子,方便测试。但实际项目中,哪有那么简单?

你想想看,一个上亿门的芯片,要是只做一条扫描链,那测试时间得等到猴年马月去?我当年刚入行时,就犯过这个傻——一条链子串了十万个寄存器,结果ATE(自动测试设备)跑一个pattern要好几秒,整个测试程序跑下来,一天都搞不定。后来老工程师告诉我:你得学会分而治之。

4.1 多扫描链:分而治之的艺术

多扫描链,说白了就是把一条大链拆成若干条小链。每条链都有自己的扫描输入(SI)和扫描输出(SO)。这样做的好处很明显:

  • 测试时间大幅缩短:假设原来一条链有10000个寄存器,现在拆成10条,每条1000个。加载一个pattern的时间,从10000个时钟周期降到了1000个。嗯,这个账大家都会算。
  • 测试功耗更可控:一条大链同时翻转,瞬间电流能把芯片烧了。拆成多条,可以分时使能,功耗就降下来了。
  • 故障诊断更精准:哪条链出了问题,直接定位到那条链,不用在一条大链里大海捞针。

核心要点:多扫描链的数量不是越多越好。每条链的寄存器数量要均衡,否则短的链等长的链,白白浪费时间。我个人习惯,每条链控制在500-2000个寄存器之间,具体看芯片规模和ATE的通道数。

我在项目中遇到过一种情况:某次做AI加速芯片,为了追求极致的测试速度,我把扫描链拆了200多条。结果呢?ATE的通道不够用了,不得不重新综合。所以,多扫描链的设计,一定要跟ATE的测试通道数匹配。你想想看,ATE的每个通道都要接一个SI或SO,通道数有限,你链子再多也没用。

4.2 扫描链平衡:别让短板拖后腿

扫描链平衡,听起来高大上,其实道理很简单:让每条链的长度尽量一致。为什么要这么做?

假设你有两条链,一条1000个寄存器,另一条2000个。ATE加载一个pattern时,必须等最长的链加载完才能开始测试。也就是说,短的链一直在空等。这就像排队打饭,你前面的人磨磨蹭蹭,后面的人再快也得等着。

我建议的做法是:

  1. 综合阶段就考虑平衡:在DC(Design Compiler)或Genus中,设置扫描链的最大长度和最小长度约束。比如,设定每条链不超过1500个寄存器,不低于1200个。
  2. 手动调整关键路径:有些模块的寄存器特别多,比如CPU的寄存器堆。这时候,我会手动把这些模块拆成多条链,或者跟其他模块的短链合并。
  3. 利用EDA工具自动平衡:现在的工具都很智能,比如Synopsys的DFT Compiler,可以直接做链平衡。但工具不是万能的,有时候它会把跨时钟域的寄存器串在一起,导致时序问题。嗯,这里要注意。

小技巧:在做扫描链平衡时,我通常会先跑一个快速综合,看看每条链的预估长度。然后根据结果,手动调整那些明显偏长或偏短的模块。这样比完全依赖工具要靠谱得多。

我曾经有一次,工具自动平衡后,把两个不同时钟域的寄存器串在了一起。结果测试时,跨时钟域的路径出现了hold violation,导致测试失败。后来我花了整整两天才定位到问题。所以,平衡归平衡,时钟域一定要分开处理。

4.3 扫描链的时钟处理:别让时钟成为绊脚石

时钟是扫描链的命脉。没有时钟,寄存器动不了;时钟处理不好,测试全白费。

扫描链的时钟,通常有两种模式:

  • 功能时钟:就是芯片正常工作时的时钟。在测试模式下,这个时钟继续用,但需要保证它稳定、无毛刺。
  • 扫描时钟:专门为测试设计的时钟,通常由ATE提供。它的频率比功能时钟低很多,一般几十MHz到几百MHz。

我个人习惯,在扫描链设计中,尽量使用独立的扫描时钟。为什么呢?因为功能时钟可能被分频、门控,或者有PLL锁定时间的问题。你想想看,ATE要等PLL锁定才能开始测试,那得多浪费时间?

但有些芯片,为了节省功耗或面积,会把功能时钟和扫描时钟复用。这时候,就要特别注意时钟的切换逻辑。我见过一个案例:某芯片在扫描模式下,时钟切换逻辑没处理好,导致时钟出现了毛刺,结果扫描链里的数据全乱了。后来查了三天,才发现是时钟MUX的glitch问题。

警告:时钟MUX在切换时,一定要用无毛刺切换电路(glitch-free mux)。否则,一个毛刺就可能让整个扫描链的数据全部错位。我建议在时钟路径上加上同步器,确保切换发生在时钟的低电平期间。

另外,多时钟域的扫描链,一定要把不同时钟域的寄存器分开。比如,CPU核用PLL时钟,外设用晶振时钟,这两类寄存器绝对不能串在一条链上。否则,跨时钟域的路径在测试时会出现setup/hold violation,导致测试覆盖率下降。

4.4 扫描链的复位处理:让芯片回到起点

复位,说白了就是让芯片回到一个已知的初始状态。在扫描测试中,复位处理同样重要。

扫描链的复位,通常有两种方式:

复位方式 优点 缺点 适用场景
同步复位 时序简单,容易分析 需要时钟才能复位 低速测试,ATE可控
异步复位 不需要时钟,立即复位 容易产生毛刺,需要同步释放 高速测试,快速初始化

我建议,在扫描测试中,尽量使用异步复位。为什么呢?因为ATE可以在不给时钟的情况下,直接拉低复位信号,让所有寄存器回到0。这样,扫描链的初始状态就是确定的,不会出现未知态(X态)。

但异步复位有个坑:复位释放时,如果跟时钟沿太近,可能会产生亚稳态。所以,异步复位一定要做同步释放处理。我通常的做法是:在复位路径上加两级同步器,确保复位释放时,所有寄存器都能稳定地退出复位状态。

避坑指南:我曾经在一个项目中,为了省面积,把复位同步器去掉了。结果测试时,每次复位释放后,扫描链的前几个寄存器总是出现随机值。后来查了整整一周,才发现是复位释放时序问题。从那以后,我再也不敢省这个同步器了。

另外,有些寄存器在扫描模式下,复位信号需要被强制拉高或拉低。比如,某些控制寄存器,在测试时不能复位,否则会破坏测试状态。这时候,我会在复位路径上加一个测试模式选择信号(test_mode),在扫描模式下,屏蔽掉复位信号。

嗯,这里还要注意一点:复位信号本身也要做扫描测试。也就是说,复位网络上的所有逻辑,都要能被扫描链覆盖到。否则,复位路径上的故障就测不到了。我通常的做法是,把复位信号也当作一个扫描输入,在测试时,通过ATE来控制复位信号的翻转。

4.5 实战经验总结

说了这么多,我给大家总结几条实战经验:

  • 多扫描链的数量:跟ATE通道数匹配,每条链500-2000个寄存器为宜。
  • 链平衡:长度差异不要超过20%,否则测试效率会大打折扣。
  • 时钟处理:不同时钟域的寄存器分开,时钟MUX用glitch-free设计。
  • 复位处理:用异步复位+同步释放,测试模式下可屏蔽复位。
  • 别忘了复位网络本身:复位路径上的逻辑也要被扫描覆盖。

最后,我想说一句:扫描链设计,看似简单,实则处处是坑。我做了十几年DFT,每次流片回来,最担心的就是扫描链能不能正常工作。但只要把这些基础打牢了,后面的路就好走了。

下一章,我们会聊到扫描链的测试向量生成和故障仿真。到时候,我会给大家讲讲,怎么用ATPG工具生成高效的测试向量,以及怎么分析测试覆盖率。咱们下章见!