3、扫描链设计避坑:时钟域交叉问题、扫描使能信号扇出、扫描链平衡

扫描链设计,听起来好像就是把寄存器串一串。但实际做起来,坑多得很。我这些年踩过的雷,十个手指头数不过来。今天挑三个最要命的点,跟你好好聊聊。

3.1 时钟域交叉问题:跨域扫描的“隐形炸弹”

先说说时钟域交叉。说白了,就是你的扫描链穿过了两个不同的时钟域。比如,一条链上既有CLK_A的寄存器,又有CLK_B的寄存器。

为什么会出问题?

你想想看,扫描模式下,我们通常用一个统一的扫描时钟。但设计里那些跨时钟域的同步器,在扫描模式下可不会乖乖工作。我遇到过一回,芯片ATE测试时扫描链死活通不过,查了三天,最后发现是跨时钟域路径上的一个同步器在扫描模式下产生了亚稳态。

⚠️ 避坑指南: 我曾经在28nm项目上吃过这个亏。ATE测试时扫描链故障覆盖率明明很高,但良率就是上不去。后来定位到是跨时钟域路径上的一个双触发器同步器,在扫描移位时第一个触发器捕获了错误数据。

那怎么处理?我个人习惯的做法是:

  • 跨时钟域路径上,扫描链必须断开。用专门的扫描测试点(比如MUX隔离)来处理。
  • 如果非要跨域,那就用LOCKUP LATCH。这东西能保证跨时钟域时数据不会丢失。
  • 检查所有跨时钟域路径。在DC或TetraMAX里跑一下跨时钟域检查,别偷懒。
💡 小技巧: 我建议你在RTL阶段就把跨时钟域路径标记出来。用`// synopsys sync_set_reset`这类注释,或者直接在SDC里约束。这样后端工具能自动帮你处理好。

3.2 扫描使能信号扇出:别让SE信号成为瓶颈

扫描使能信号(SE),这个信号要控制所有扫描链上的寄存器。你想想看,一个信号要驱动几千甚至上万个寄存器,扇出有多大?

我见过一个项目,SE信号直接连到了所有寄存器。结果呢?扫描模式下,SE信号的transition time(转换时间)慢得像蜗牛。ATE测试时,扫描链移位频率稍微高一点,就出错。

核心问题: SE信号扇出过大 → 信号边沿变缓 → 寄存器捕获时序违例 → 扫描链测试失败

怎么解决?我一般这么做:

  1. SE信号必须做时钟树综合(CTS)。把它当成时钟信号来对待,用时钟树综合工具去平衡。
  2. 插入SE缓冲器树。像时钟树一样,分多级缓冲。每级扇出控制在合理范围内(比如每级驱动不超过1000个负载)。
  3. 检查SE信号的transition time。在STA里专门检查SE路径,确保它在目标频率下没问题。
// 一个典型的SE缓冲器树插入脚本示例(Innovus/ICC2)
# 创建SE时钟树
create_clock -name scan_se [get_ports scan_se] -period 100
# 设置SE为时钟信号
set_clock_tree_options -clock_trees scan_se
# 指定SE缓冲器类型
set_clock_tree_references -clock_trees scan_se {CLKBUFX12 CLKBUFX16 CLKBUFX20}
# 运行时钟树综合
clock_route -clock_trees scan_se
⚠️ 注意: 有些工具默认不会把SE信号当成时钟来处理。你得手动设置。我建议你在综合阶段就用`set_clock_tree`命令把SE信号标记出来,这样后端工具从一开始就知道怎么处理。

3.3 扫描链平衡:长度差异带来的测试时间噩梦

扫描链平衡,说白了就是让每条扫描链的长度差不多。为什么要平衡?

你想想看,ATE测试时,扫描链是串行移位的。如果一条链有1000个寄存器,另一条有10000个。那测试时间就被最长的链决定了。长链的移位时间直接拉长了整个测试周期。

我记得有个项目,设计团队没注意链平衡。结果ATE测试时,一条链有12000个寄存器,另一条只有800个。测试时间长了10倍。流片回来后,测试成本高得吓人。

经验数据: 我一般把每条扫描链的长度控制在2000-4000个寄存器之间。具体看芯片规模和ATE测试频率。链长度差异控制在10%以内。

怎么实现链平衡?

  • 在DFT插入阶段指定链长度。用`set_scan_configuration -chain_count 10 -chain_length 3000`这类命令。
  • 使用工具自动平衡。TetraMAX、DFT Compiler都有自动链平衡功能。但别完全依赖工具,手动检查一下。
  • 考虑物理布局。链平衡不只是数字上的平衡,还要考虑物理位置。把物理上靠近的寄存器放在同一条链上,可以减少绕线。
// DFT Compiler中设置链平衡的示例
set_scan_configuration -chain_count 8 -chain_length 2000
set_scan_configuration -chain_balance true
set_scan_configuration -clock_mixing no_mix
// 插入扫描链
insert_dft
💡 个人习惯: 我一般在综合完成后,先跑一个快速DFT检查。看看每条链的长度、物理分布、跨时钟域情况。发现问题及时调整,别等到后端布局布线完了再改,那代价太大了。

3.4 三个问题的关联性

这三个问题其实不是孤立的。我画个图帮你理清关系:

扫描链设计三大核心问题关联图 时钟域交叉 跨域路径亚稳态 同步器失效 测试覆盖率下降 扫描使能扇出 信号边沿变缓 时序违例 移位频率受限 扫描链平衡 链长度差异大 测试时间拉长 测试成本增加 影响 影响 三者相互影响,必须统筹考虑 跨时钟域路径可能增加SE扇出负担 链平衡策略会影响跨时钟域路径的划分 SE扇出优化需要结合链长度和物理布局

你看,这三个问题环环相扣。跨时钟域路径处理不好,可能让SE信号多出很多不必要的负载。链平衡做不好,又会让SE扇出分布不均匀。我建议你在做DFT规划时,就把这三个问题放在一起考虑。

总结一下我的经验:

  • 跨时钟域:断开或加LOCKUP LATCH,别硬连
  • SE扇出:当成时钟树来做,别省那几步
  • 链平衡:长度差异控制在10%以内,物理位置也要考虑

这三个点做好了,扫描链设计基本不会出大问题。剩下的就是跑仿真、看覆盖率、调时序了。

可可精品资料库