第四章:扫描链测试与调试

扫描链,说白了就是芯片测试的“高速公路”。

我刚开始做DFT那会儿,总觉得扫描链只要插进去、能跑通就行了。直到有一次,一颗芯片流片回来,ATE上一跑,扫描链全红——那一刻我才明白,扫描链的测试与调试,才是DFT工程师真正的“修罗场”。

4.1 扫描链的测试向量生成

扫描链测试向量,和普通的逻辑BIST向量不一样。它的目标很单纯:验证每条扫描链上的每个寄存器,能不能正常地“串进串出”。

我个人习惯把扫描链测试向量分成两类:

  • flush test(冲洗测试):最简单的测试。给一串0101...的pattern,看能不能原样从输出端出来。
  • transition test(跳变测试):更严格的测试。检查寄存器在0→1和1→0跳变时,有没有延迟或毛刺。

核心要点:扫描链测试向量的生成,本质上是在做“移位寄存器测试”。你不需要关心芯片的逻辑功能,只需要关心数据能不能在链上正确传递。

用TetraMAX生成扫描链测试向量,命令其实很简单:

# 读入网表和库
read_netlist top.v
run_build_model top

# 设置扫描链信息
add_scan_chain chain1 SI1 SO1
add_scan_chain chain2 SI2 SO2

# 生成扫描链测试向量
set_patterns -external scan_test.stil
run_atpg -auto_compression

嗯,这里要注意:扫描链测试向量的压缩率不能太高。我见过有人为了省测试时间,把压缩开到最大,结果链上的微小故障全被掩盖了。你想想看,链都没测明白,后面的逻辑测试还有什么意义?

4.2 扫描链的故障诊断

扫描链出故障了,怎么办?

别慌。扫描链的故障类型其实很有限,我总结下来就这几种:

故障类型 典型表现 常见原因
stuck-at-0 输出一直为0 短路到地、寄存器损坏
stuck-at-1 输出一直为1 短路到电源、驱动失效
transition fault 0→1或1→0变慢 走线过长、驱动能力不足
hold time violation 数据保持不住 时钟树不平衡、工艺偏差

诊断扫描链故障,我一般用“三段法”:

  1. 看pattern fail的位置:如果第100个cycle出错,那故障大概率在第100个寄存器附近。
  2. 看fail的pattern内容:全是0还是全是1?还是特定跳变才出错?这能帮你缩小故障类型。
  3. 看fail的扫描链分布:是单条链出问题,还是多条链同时出问题?多条链同时出问题,大概率是时钟或复位的问题。

我的小技巧:在TetraMAX里,用report_faults -verbose可以看每个fault的详细信息。我曾经靠这个命令,定位到一个藏在1000多个寄存器中间的hold time violation——那个bug,仿真死活跑不出来,但ATE上一抓一个准。

4.3 扫描链的调试技巧

调试扫描链,是DFT工程师的“看家本领”。

我见过太多人,一看到扫描链fail就慌了,开始乱改代码。其实,调试是有套路的。

4.3.1 从ATE log入手

ATE log里藏着大量信息。别只看“PASS”或“FAIL”,要仔细看:

  • fail的cycle号:这直接告诉你故障在链上的位置
  • fail的pattern内容:是expected=1, got=0,还是反过来?
  • fail的扫描链编号:是单条链还是多条链?

我曾经遇到一个case,ATE log显示所有扫描链都在第50个cycle fail。我当时就觉得不对劲——怎么可能所有链同时坏?后来一查,是测试时钟的相位设置错了。你看,有时候问题不在芯片本身,而在测试环境。

4.3.2 用TetraMAX做故障仿真

TetraMAX的故障仿真功能,是调试的利器。你可以:

# 注入一个stuck-at-0故障
add_fault -pin U1/Q -stuck 0

# 运行故障仿真
run_fault_sim

# 看仿真结果
report_simulation_result

这样,你可以模拟出“如果这个寄存器坏了,ATE上会看到什么结果”。然后和实际的ATE log对比,就能快速定位。

注意:故障仿真很吃资源。别一次注入太多故障,否则仿真器会跑死。我一般一次只注入3-5个故障,分批次排查。

4.3.3 物理定位法

如果逻辑定位搞不定,就得用物理手段了。

我记得有一次,一颗芯片的扫描链总是间歇性fail。逻辑仿真、故障仿真都查不出问题。最后,我拿着芯片去实验室,用探针台直接量SI和SO之间的波形——发现有一条走线太长,信号反射严重。改版后,问题解决。

物理定位的常用手段:

  • 探针台测量:直接量关键节点的波形
  • EMMI(发射显微镜):找芯片上的热点
  • Laser Voltage Probing:测内部节点的电压变化

这些手段虽然贵,但有时候是唯一的选择。

4.3.4 常见调试陷阱

最后,分享几个我踩过的坑:

  • 别忽略时钟树:扫描链fail,很多时候是时钟树的问题,不是寄存器的问题。
  • 注意测试模式下的时序:测试模式下的时序约束,和功能模式不一样。我见过有人把功能模式的约束直接套到测试模式,结果一堆hold violation。
  • 别迷信仿真:仿真通过,不代表芯片没问题。工艺偏差、温度变化,仿真都模拟不全。

总结一句话:扫描链调试,三分靠技术,七分靠经验。多动手、多记录、多总结,你也能成为调试高手。

好了,这一章的内容就到这里。下一章,我们会讲逻辑BIST的测试与调试——那又是另一个精彩的世界。