第四章:扫描链测试与调试
扫描链,说白了就是芯片测试的“高速公路”。
我刚开始做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 | 数据保持不住 | 时钟树不平衡、工艺偏差 |
诊断扫描链故障,我一般用“三段法”:
- 看pattern fail的位置:如果第100个cycle出错,那故障大概率在第100个寄存器附近。
- 看fail的pattern内容:全是0还是全是1?还是特定跳变才出错?这能帮你缩小故障类型。
- 看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的测试与调试——那又是另一个精彩的世界。