3、扫描链设计原理:扫描链结构、扫描触发器类型、扫描使能控制
好,咱们今天聊聊扫描链。说实话,这是DFT里最基础、也最核心的一块。你想想看,芯片里成千上万个寄存器,你要怎么测试它们?总不能一个个去点吧?扫描链就是干这个的——把寄存器串成一条链,像串糖葫芦一样。
3.1 扫描链的基本结构
扫描链的结构,说白了就是两套模式:正常模式和测试模式。
- 正常模式:寄存器各干各的,该采数据采数据,该输出输出。
- 测试模式:所有寄存器串成一条链,数据从扫描输入(SI)灌进去,一路传下去,最后从扫描输出(SO)出来。
我刚开始接触扫描链时,总觉得这玩意儿挺玄乎。后来自己搭过一次就明白了——其实就是给每个触发器加个“旁路开关”。正常工作时走原路,测试时走扫描路。
核心要点:扫描链的本质是“时间换空间”——用多个时钟周期,换取对内部节点的可控性和可观测性。
3.2 扫描触发器的类型
扫描触发器可不是随便找个触发器就能用的。它需要额外支持扫描功能。常见的类型有这几种:
| 类型 | 结构特点 | 优缺点 |
|---|---|---|
| Muxed-D型 | 在D触发器前加一个2选1MUX | 结构简单,面积开销小;但时序路径上多了个MUX延迟 |
| LSSD型 | 双锁存器结构,主从分离 | 无竞争风险,时序干净;但面积大,功耗高 |
| 时钟门控型 | 利用时钟门控实现扫描模式切换 | 低功耗设计常用;但控制逻辑复杂 |
我个人习惯用Muxed-D型。为什么?因为它简单、成熟,大部分EDA工具都支持得很好。我在一个28nm的项目里用过LSSD,说实话,面积开销确实大,但时序确实干净——没有hold time问题,这点在高速设计中很香。
小技巧:如果你用的是Muxed-D型,记得在综合时把扫描使能信号(SE)设为“ideal net”,避免它在时序分析里捣乱。
3.3 扫描使能控制
扫描使能(Scan Enable,简称SE)是扫描链的“总开关”。它决定了触发器工作在正常模式还是扫描模式。
嗯,这里要注意:SE信号的控制不是随便拉根线就行的。它有几个关键点:
- 全局同步:SE必须在整个芯片内同步切换。我曾经见过一个项目,SE在不同时钟域之间没做同步,结果扫描测试时数据全乱了。
- 时序要求:SE的setup/hold时间必须满足。你想想看,如果SE在时钟沿附近跳变,触发器可能误判模式,那测试结果就废了。
- 低功耗考虑:扫描模式下,所有寄存器都在翻转,功耗会飙升。我建议在SE路径上加门控,测试完就关掉。
避坑指南:我曾经在一个项目里,SE信号跨了三个时钟域,结果扫描链死活跑不通。后来发现是SE在不同域之间出现了“毛刺”,导致部分触发器提前退出了扫描模式。解决办法很简单——加两级同步器,搞定。
3.4 扫描链的插入流程
扫描链的插入,一般是在综合阶段完成的。流程大致如下:
- RTL设计完成:先确保功能正确。
- 综合时指定扫描规则:告诉工具哪些寄存器要替换成扫描触发器。
- 自动替换:工具会把普通D触发器换成带MUX的扫描触发器。
- 链连接:工具根据你的约束,把扫描触发器串成链。
- 验证:跑仿真,确认扫描链能正常工作。
我个人习惯在综合后先跑一遍“扫描链完整性检查”。这个检查能发现很多低级错误——比如某个寄存器没被替换、或者扫描链断开了。早点发现,早点修,别等到后端再哭。
经验之谈:扫描链的插入不是一锤子买卖。我建议在综合、布局、布线三个阶段各检查一次。因为后端优化可能会动你的扫描链,比如插入缓冲器、调整时钟树,这些都可能影响扫描链的时序。
3.5 扫描链的时序分析
扫描链的时序分析和正常模式不太一样。正常模式关注的是“数据路径”,而扫描模式关注的是“扫描路径”。
说白了,扫描路径就是一条长长的移位寄存器链。数据从SI进去,经过N个触发器,最后从SO出来。这条路径上的时序要求是:
- setup time:数据必须在时钟沿之前稳定到达下一个触发器的D端。
- hold time:数据必须在时钟沿之后保持一段时间。
你可能会问:扫描链那么长,时序能收敛吗?答案是:能,但要注意两点:
- 时钟偏斜:扫描链上的时钟偏斜必须严格控制。我建议在扫描模式下,把时钟树做成“平衡树”,减少偏斜。
- 缓冲器插入:如果扫描链太长,信号会衰减。这时候需要插入缓冲器。但缓冲器也会增加延迟,所以得权衡。
小技巧:在STA(静态时序分析)时,记得把扫描模式单独设一个“scenario”。这样你可以分别分析正常模式和扫描模式的时序,互不干扰。
3.6 扫描链的常见问题与解决
做扫描链这么多年,我踩过的坑不少。这里列几个常见的:
- 扫描链断链:某个触发器的扫描输出没连到下一个的扫描输入。解决办法:跑一遍“链完整性检查”。
- SE信号毛刺:SE信号在扫描过程中跳变,导致模式切换。解决办法:加同步器,或者用门控时钟。
- 时钟域交叉:扫描链跨了多个时钟域,导致数据丢失。解决办法:在跨域处加同步器,或者把扫描链限制在同一个时钟域内。
我记得有一次,一个项目在ATE测试时,扫描链死活跑不通。我查了三天,最后发现是SE信号在布局时被优化掉了——因为工具觉得它是个“constant net”。从那以后,我每次都会在综合脚本里把SE设为“dont_touch”。
总结一下:扫描链设计看似简单,但细节决定成败。从触发器类型的选择,到SE信号的控制,再到时序分析,每一步都得小心。别怕麻烦,多检查几遍,总比流片回来再哭强。