29.【RTL_Synthesis】Design For Testability(可测试性设计)

张开发
2026/4/9 14:58:59 15 分钟阅读

分享文章

29.【RTL_Synthesis】Design For Testability(可测试性设计)
可测试性设计DFT让芯片能被“体检”今天我们来聊一个在芯片设计里非常重要、但很多初学者容易忽略的话题——可测试性设计。你千辛万苦设计了一款芯片送去流片几个月后拿到第一批样品。你兴高采烈地上电测试结果发现有的芯片完全没反应有的时好时坏有的功耗异常高。你怎么知道是制造过程中产生的缺陷比如灰尘颗粒导致的短路、开路还是你的设计本身有bug更关键的是你如何快速、低成本地筛选出好的芯片卖给客户答案就是在芯片设计阶段就加入专门的测试电路让制造后的测试变得简单、快速、可靠。这就是 DFT 要做的事。这一讲我们不会深入到 DFT 工程师的专业细节但作为验证工程师你必须要理解 DFT 的基本原理以及你的 RTL 写法如何影响可测试性。否则你写出来的设计可能根本无法被有效测试或者测试成本高得离谱。1. 测试的核心难题可控性和可观测性想象一个巨大的迷宫里面有很多开关和灯泡。你的任务是确保所有开关都能正常控制灯泡。但是你只能从迷宫的入口芯片引脚输入信号从出口芯片引脚观察结果。迷宫里的大多数开关和灯泡你都看不到、摸不着。可控性你能不能让某个内部节点变成你想要的逻辑值0 或 1如果做不到你就无法激活某些故障。可观测性你能不能“看到”某个内部节点当前是什么值如果看不到你就无法判断故障是否被传播到了输出。在没有 DFT 的普通设计里大部分触发器和门都埋藏在芯片深处可控性和可观测性极差。DFT 的核心就是通过添加辅助电路把内部节点“拉出来”让测试时能像访问外部引脚一样控制/观察它们。2. 扫描链Scan ChainDFT 的基石2.1 什么是扫描链扫描链把设计里所有的普通触发器换成扫描触发器。扫描触发器比普通触发器多了一个扫描输入SI和一个扫描使能SE引脚。扫描触发器的工作原理正常模式SE0触发器的数据来自 D 引脚功能正常。扫描模式SE1触发器的数据来自 SI 引脚并且所有触发器的 Q 连到下一个触发器的 SI形成一条长长的移位寄存器链。这样一来在扫描模式下你可以把测试向量串行移入所有触发器控制每个触发器的状态让电路运行一个或多个时钟周期在正常模式下再把结果串行移出观察每个触发器的最终状态2.2 扫描链的工作流程典型的测试过程分三步扫描输入Shift-In设置 SE1将测试向量一串 0 和 1从扫描输入引脚送入经过几百几千个时钟周期每个触发器都被赋予了一个特定的值。捕获Capture设置 SE0给一个或几个时钟脉冲让电路在正常模式下运行。此时组合逻辑根据触发器的输出计算新值并将结果存入触发器。扫描输出Shift-Out再次设置 SE1将触发器里捕获的新值串行移出到扫描输出引脚同时可以移入下一组测试向量流水操作。效果你相当于能够“拍照”芯片内部任意时刻的状态并且能够“预设”芯片内部的状态。这大大提高了可控性和可观测性。2.3 多条扫描链如果芯片有 10000 个触发器只做一条扫描链那么移入移出就需要 10000 个时钟周期测试时间很长。通常的做法是将触发器分成多条并行的扫描链每条链有自己的扫描输入和输出。比如分成 10 条每条 1000 个触发器测试时间就缩短为 1/10。代价是需要更多的芯片引脚扫描输入/输出但通常可以复用功能引脚在测试模式下所以影响不大。3. ATPG自动生成测试向量3.1 什么是 ATPGATPG自动测试向量生成是软件工具做的事给定一个门级网表和故障模型它会自动算出一组测试向量即扫描链要移入的 0/1 序列使得这些故障能被检测出来。手动写测试向量是不现实的——百万门的设计故障数亿计。3.2 故障模型Fault ModelsATPG 工具并不是模拟真实的物理缺陷那样太复杂而是使用抽象的故障模型最常见的是固定故障Stuck-At Fault假设某条信号线永远 stuck at 0S-A-0或 stuck at 1S-A-1。这是最经典的模型能覆盖大部分制造缺陷。跳变故障Transition Fault假设信号无法在时钟周期内正确跳变慢上升或慢下降用于检测时序相关的缺陷需要在速测试at-speed test。桥接故障Bridging Fault假设两根信号线短路产生线与或线或行为。3.3 故障覆盖率故障覆盖率 检测到的故障数 / 总故障数× 100%通常设计要求达到 95%~99% 的 stuck-at 覆盖率。未覆盖的故障可能是不可测故障逻辑上无法被激活或传播比如冗余逻辑。ATPG 难测故障计算量太大工具放弃了。故意忽略的故障比如不影响功能的冗余电路。高故障覆盖率意味着流片后坏芯片被漏过的概率低。4. DFT 友好的 RTL 编码规范你的 RTL 写法会直接影响扫描链能否顺利插入、ATPG 能否高效生成向量。以下是几条黄金法则。4.1 避免组合环路组合环路输出直接或间接反馈到自身会让 ATPG 工具陷入死循环无法确定状态。必须用触发器打破环路。❌ 不好的写法组合反馈类似锁存器assign out enable ? in : out; // out 依赖自己✅ 好的写法用触发器always (posedge clk) begin if (enable) out in; end4.2 避免门控时钟Gated Clock门控时钟为了省电把时钟和使能信号相与后再送给触发器。在扫描模式下门控时钟可能被关闭导致扫描链无法正常工作。❌ 不好的写法门控时钟wire gated_clk clk enable; always (posedge gated_clk) q d;✅ 好的写法使用触发器的使能端always (posedge clk) begin if (enable) q d; end现代综合工具能够自动将这种写法转换成带门控时钟的时钟树同时保持 DFT 兼容性。4.3 所有触发器必须有复位未初始化的触发器在扫描链中会导致不确定的状态影响故障模拟和诊断。确保每个触发器都有异步或同步复位。✅ 好的写法always (posedge clk or negedge rst_n) begin if (!rst_n) counter 0; else counter counter 1; end4.4 避免异步逻辑异步置位/复位信号在扫描模式下需要特殊处理否则可能引起冲突。尽量使用同步复位。4.5 增加测试模式旁路对于复杂的逻辑块可以增加一个test_mode输入。在测试模式下让数据走简单的路径降低 ATPG 难度。module dft_friendly_module ( input clk, rst_n, input test_mode, input [7:0] data_in, output reg [7:0] data_out ); wire [7:0] functional_result complex_function(data_in); always (posedge clk or negedge rst_n) begin if (!rst_n) data_out 0; else if (test_mode) data_out data_in; // 测试时 bypass else data_out functional_result; end endmodule5. 存储器和 IP 的 DFT嵌入式存储器RAM/ROM不能直接放入扫描链因为它们是存储阵列不是触发器。通常使用存储器内建自测试Memory BIST—— 在芯片内部集成一个小的测试控制器自动对存储器写读模式并比对结果。第三方 IP拿到 IP 时一定要查它的 DFT 文档它是否包含扫描链是否支持测试模式是否有 BIST6. DFT 的代价面积扫描触发器比普通触发器大 20%~30%加上布线整体面积增加 5%~15%。功耗扫描移位时大量触发器同时翻转功耗很大低功耗扫描技术可以缓解。时序扫描多路选择器可能增加关键路径的延迟需要在综合时留出余量。但这些代价是值得的——没有 DFT你几乎无法测试复杂的芯片。7. 总结把“如何测试”刻在脑子里可测试性设计不是事后补救而是应该从 RTL 编写的第一天就开始考虑。扫描链把内部触发器串起来让测试时可以控制和观察内部状态。ATPG工具自动生成测试向量覆盖大部分制造缺陷。故障覆盖率是衡量测试质量的关键指标。DFT 友好的 RTL要避免组合环路、门控时钟、无复位触发器善用测试模式。存储器和 IP需要专门的 DFT 技术BIST、IP 文档。作为验证工程师你虽然不直接负责 DFT 插入但你的 RTL 质量直接影响测试的成败。如果你写的代码让 DFT 工具无法正常工作最终流片的芯片可能根本无法被有效测试或者测试成本高到离谱。一句话写 RTL 的时候多问自己一句——“这个信号在测试模式下会怎样” 这种思维习惯会让你成为更全面的芯片设计者。接下来我们将进入更具体的 DFT 实现细节比如扫描链插入、ATPG 流程等。但今天的内容已经足够你开始写出 DFT-friendly 的代码了。

更多文章