3. 扫描链设计 (Scan Chain)
扫描链是结构化 DFT 的基石,它将普通时序电路中的触发器替换为具有扫描功能的特殊触发器,并在测试模式下将这些触发器串联成一条或多条移位寄存器链。通过扫描链,测试工程师可以直接从芯片引脚控制(扫描输入)和观测(扫描输出)内部节点的状态,从而将复杂的时序测试问题简化为组合逻辑测试问题。
3.1 扫描触发器结构
扫描触发器的核心是在标准 D 触发器的基础上增加一个多路选择器(MUX),用于在正常工作模式(D 端)和测试模式(扫描输入端 SI)之间切换数据来源。常见的扫描触发器结构包括:
- Muxed-D 扫描触发器:最主流的结构,面积和延迟开销小。
- LSSD (Level-Sensitive Scan Design):使用锁存器对,对时钟毛刺不敏感,但面积较大。
- 时钟门控扫描触发器:集成时钟门控逻辑,用于低功耗设计。
关键指标: 扫描触发器的面积开销通常比普通触发器增加 10%~25%,延迟增加约 1~2 个门延迟。
下图展示了 Muxed-D 扫描触发器的内部结构:
3.2 扫描链插入流程
扫描链插入是 DFT 流程中的核心步骤,通常在逻辑综合之后、物理设计之前完成。标准流程如下:
| 步骤 | 阶段 | 输入/输出 | 关键检查点 |
|---|---|---|---|
| 1 | RTL 检查 | RTL 代码 → 可测性规则检查报告 | 异步置位/复位、时钟门控、三态总线 |
| 2 | 综合与映射 | RTL → 门级网表 (含普通触发器) | 时序约束、面积预估 |
| 3 | 扫描替换 | 普通触发器 → 扫描触发器 | 扫描触发器库单元可用性 |
| 4 | 扫描链排序 | 确定触发器连接顺序 | 物理距离、时钟域、功耗 |
| 5 | 扫描链缝合 | SI → SO 连接,生成扫描使能网络 | 扫描使能信号扇出、时钟树平衡 |
| 6 | 验证与仿真 | 扫描链网表 → 功能与时序仿真 | 移位正确性、捕获时序 |
工程实践: 扫描链插入通常使用 EDA 工具(如 Synopsys DFT Compiler、Cadence Genus)自动完成。但工程师需要手动指定扫描链数量、扫描使能信号名称、以及是否对某些时钟域或存储器进行旁路。
下图展示了从 RTL 到扫描链网表的完整流程:
3.3 扫描使能控制
扫描使能(Scan Enable, SE)信号是扫描链的控制核心,它决定了触发器的工作模式。SE 信号的设计直接影响测试时序和芯片性能。
3.3.1 扫描使能的工作模式
| 模式 | SE 电平 | 触发器行为 | 时钟要求 |
|---|---|---|---|
| 正常模式 | 0 | D 端数据输入,正常功能逻辑 | 功能时钟 |
| 移位模式 | 1 | SI 端数据输入,数据沿扫描链移位 | 扫描时钟(通常为功能时钟) |
| 捕获模式 | 0 | D 端数据输入,捕获组合逻辑响应 | 捕获时钟(1~2 个脉冲) |
时序风险: SE 信号在移位模式与捕获模式之间切换时,必须保证所有触发器在同一时钟沿完成模式切换。如果 SE 信号到达不同触发器的时间偏差过大(SE 时钟偏差),可能导致部分触发器仍在移位而部分已进入捕获,造成测试失败。
3.3.2 扫描使能网络设计
SE 信号通常是一个全局信号,需要驱动芯片内所有扫描触发器。其设计要点包括:
- 低延迟偏差: 使用 H 树或平衡树结构分配 SE 信号,确保各触发器 SE 端延迟偏差在 100ps 以内。
- 高扇出缓冲: SE 信号扇出可能达到数万甚至数十万,需要插入多级缓冲器(Buffer Tree)来驱动。
- 测试模式隔离: 在正常模式下,SE 信号应保持为 0,且不干扰功能逻辑。通常通过测试模式选择信号(Test Mode)来门控 SE。
- 多链独立控制: 对于多扫描链设计,每条链可以拥有独立的 SE 信号,以实现并行移位或分时测试。
下图展示了扫描使能信号的分配网络:
3.3.3 扫描使能时序约束
在测试综合阶段,需要为 SE 信号设置专门的时序约束,以确保测试模式下的时序收敛:
# 扫描使能时序约束示例 (Synopsys Design Constraints)
# 设置 SE 信号为测试模式输入
set_test_mode -type scan -enable_port [get_ports scan_enable]
# 设置 SE 信号的最大延迟
set_max_delay 2.0 -from [get_ports scan_enable] -to [all_registers -data_pins]
# 设置 SE 信号的时钟偏差约束
set_clock_uncertainty -setup 0.3 [get_clocks test_clock]
set_clock_uncertainty -hold 0.2 [get_clocks test_clock]
# 设置 SE 信号在捕获模式下的时序检查
set_false_path -from [get_ports scan_enable] -to [all_registers -clock_pins] -setup
设计建议: 对于高性能芯片,建议使用独立的测试时钟(Test Clock)来驱动扫描链,与功能时钟分离。这样可以避免功能时钟树上的额外负载,同时允许测试时钟具有不同的频率和占空比。