第三章 扫描链设计基础:扫描链原理、扫描触发器类型、扫描链插入流程
各位好,欢迎来到第三章。今天咱们聊聊扫描链设计的基础。
说实话,扫描链是DFT的基石。你想想看,没有扫描链,我们怎么知道芯片内部出了什么问题?就像医生没有听诊器,光靠拍打外壳,很难诊断内部故障。我个人习惯把扫描链比作芯片的"听诊器"——它让我们能直接"听到"每个触发器的状态。
3.1 扫描链原理
扫描链的核心思想其实很简单:把普通的触发器变成既能正常工作,又能串行输入/输出数据的特殊触发器。
为什么需要这样?因为芯片正常工作时,我们没法直接观察内部节点的状态。但通过扫描链,我们可以把测试数据串行地"灌"进去,然后捕获响应,再串行地"吐"出来。
扫描链的工作模式:
- 正常模式:触发器像普通寄存器一样工作,数据从D端输入,Q端输出
- 移位模式:触发器首尾相连形成移位寄存器,数据从SI(扫描输入)串行移入,从SO(扫描输出)串行移出
- 捕获模式:在时钟沿捕获组合逻辑的输出,将结果锁存到触发器
我记得刚入行时,有个老工程师跟我说:"扫描链就是给芯片装了个'回放功能'。"当时不太理解,后来做多了才明白——测试时我们先把激励移进去,让芯片跑一个周期,再把结果移出来分析。这不就是回放吗?
3.2 扫描触发器类型
扫描触发器可不是随便找个触发器就能用的。它需要额外的控制端口。常见的类型有这几种:
| 类型 | 结构特点 | 面积开销 | 适用场景 |
|---|---|---|---|
| Muxed-D型 | D端前加一个2选1MUX | 约10-15% | 最常用,标准扫描单元 |
| LSSD型 | 双锁存器结构,电平敏感 | 约20-30% | 高性能设计,抗噪声好 |
| 时钟门控型 | 集成时钟门控逻辑 | 约15-20% | 低功耗设计 |
我个人最常用的是Muxed-D型。为什么?因为它简单、成熟,EDA工具支持得最好。但如果你做的是超高速设计,LSSD可能更合适——它没有时钟竞争的问题。
避坑指南:我曾经在一个项目中,为了省面积,用了不带MUX的普通触发器,想靠外部逻辑实现扫描功能。结果时序乱得一塌糊涂,最后不得不重新流片。嗯,从那以后我再也不敢在扫描触发器上省成本了。
3.3 扫描链插入流程
扫描链插入不是一步到位的,它有一套标准流程。我把它总结成五个步骤:
- 准备网表和库:综合后的门级网表,加上扫描触发器的库单元
- 定义扫描端口:指定扫描输入(SI)、扫描输出(SO)、扫描使能(SE)
- 替换触发器:把普通D触发器替换成扫描触发器
- 连接扫描链:把扫描触发器首尾串起来,形成一条或多条链
- 验证扫描链:跑DRC检查,确保链能正常工作
这里我贴一段简单的Tcl脚本,展示扫描链插入的核心操作:
# 扫描链插入示例脚本
set_scan_configuration -chain_count 4
set_scan_configuration -clock_mixing no_mix
# 替换触发器
replace_scan_cells -all
# 连接扫描链
create_scan_chain -name chain0 \
-si_port SI0 -so_port SO0 \
-cells [get_cells -hierarchical *scan_reg*]
# 验证
verify_scan_chain -chain chain0
这段脚本看着简单,但实际项目中坑不少。比如时钟域的问题——不同时钟域的触发器能不能串在一起?我建议尽量别混,除非你做了跨时钟域同步处理。
注意:扫描链插入后,一定要做静态时序分析(STA)。扫描路径上的时序约束和正常路径不一样,SE信号的控制时序尤其关键。我曾经见过一个案例,SE信号布线太长导致移位时数据出错,查了整整两天才找到原因。
3.4 扫描链设计的几个关键点
最后,我总结几个实战中容易忽略的点:
- 链的长度要均衡:多条扫描链时,每条链的触发器数量尽量接近,否则测试时间会被最长的链拖慢
- 注意扫描使能信号:SE信号要能快速切换,否则会影响捕获时序
- 避免扫描链环路:组合逻辑中不要形成扫描链的反馈环路,否则测试向量会失效
- 考虑测试功耗:扫描移位时所有触发器同时翻转,功耗可能比正常模式还高,需要做功耗分析
说白了,扫描链设计就是个平衡的艺术——面积、时序、功耗、测试覆盖率,哪个都不能偏废。我做了这么多年DFT,最大的体会就是:前期多花点心思在扫描链规划上,后期测试时能省下大把时间。
好了,这一章就到这里。下一章咱们聊聊扫描链的时序分析和优化,那可是个硬骨头,但啃下来之后你会觉得豁然开朗。