ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

DFT口语化讲解:扫描链、复位信号与RTL改动实战

DFT口语化讲解:扫描链、复位信号与RTL改动实战 做DFT这些年最常被问的一句话不是“扫描链覆盖率多少”而是“你能不能把这个事儿用大白话讲给我听”。尤其是跟前端设计、验证、甚至老板汇报的时候DFT术语一甩出来对面眼神就开始发飘。后来我养成了一个习惯凡是讲DFT先给一段“口语样本”——用最通俗的说法把概念放出去再看对方反应决定要不要往深了讲。这篇文章就是把我平时用的那套口语化讲解整理成一份可以直接拿来用的“样本”。内容覆盖DFT是干什么的、扫描链时钟复位这些核心概念到底在解决什么问题再到大家搜得最多的“DFT插复位怎么改RTL”这个实操问题最后附上一些面试和汇报场景里的高频问答参考。不管你是刚接触DFT的学生、刚接手DFT任务的设计工程师还是想转岗DFT的老前端这篇都能帮你快速把“会做”变成“会讲”。1. 先把DFT这件事用“人话”讲清楚1.1 三个版本的口语样本给不同听众用同一套逻辑我给不同角色讲DFT开场几乎是固定的三句话芯片造出来之后怎么证明它是好的怎么在它坏掉的时候快速定位坏在哪DFT就是回答这两个问题而设计的一整套硬件逻辑。对内行我会把这句话翻译成专业版DFTDesign for Test通过在RTL中插入扫描链、BIST、边界扫描等结构让芯片在流片后能够被自动测试设备ATE高效地验证并通过ATPG生成的测试向量覆盖到制造缺陷。对外行比如老板或者非技术同事我会直接打个比方一颗芯片相当于一座盖好的大楼DFT就是提前在全楼埋好消防探头和检修通道。交房之后物业能随时检查每个房间有没有问题出了问题也能沿着通道快速找到是哪一层哪一间。这个“三段式”讲话法我用了很久核心顺序是先给结论解决什么问题、再给类比生活化锚点、最后才上术语对应到专业名词。好处是听的人不会在第一句话就被吓跑你后面的专业表达也更容易被接住。实际跟人沟通的时候我一般控制在30秒内把这三段讲完然后停下来问一句“要不要往细了看”基本不会冷场。1.2 为什么DFT岗位这些年越来越吃香很多人入行DFT是半路出家我也是。前端做了几年之后发现DFT的活儿并不是独立存在的它跟设计、验证、后端、封测、甚至产品那边全都咬合在一起而且越到先进制程越绕不开。一个显而易见的趋势是车规芯片和AI芯片对良率和可靠性的要求越来越高。车规芯片动辄要求DPPM百万缺陷率做到个位数没有良好的可测试性设计一颗芯片在整车上出了问题返工成本是芯片本身价格的几十倍甚至上百倍。所以不少车厂在选型时直接要求芯片厂商提供完整的DFT文档和测试覆盖率报告这已经成了投标的硬门槛。再看设计复杂度。一颗SoC里挂几十个时钟域、几千条复位树、上万级寄存器的深度流水这是常态。没有DFT结构光靠功能测试向量去测大规模芯片时间成本和向量体积根本不可接受。而DFT插入扫描链之后测试向量能自动生成覆盖率还能量化追踪这就是IC量产从“碰运气”变成“看数据”的关键一步。我个人的体会是DFT不是孤立的“插几根扫描链”那么简单它更像是在前端设计和物理实现之间的一层“测试架构设计”。谁能在早期RTL阶段就把可测试性想明白谁就能在流片后省下巨大的调试成本。这也是为什么我强烈建议前端设计工程师哪怕不做DFT岗位也至少要懂DFT的基本逻辑因为它直接影响你写的RTL能不能被高效地测试。2. DFT的核心概念扫描链、时钟与复位2.1 扫描链的原理与口语表达我先说我通常怎么给新人讲扫描链它是把芯片里成千上万个寄存器串联成一条或几条“移位寄存器链”测试模式下可以把数据一个一个从链头灌进去再从链尾读出来从而实现对内部状态的直接控制和观测。讲原理可以这样拆成三步。第一步芯片正常工作时功能模式每个寄存器各干各的谁都不管谁这是normal mode。第二步进入测试模式后寄存器之间通过额外的MUX逻辑串联起来形成长链这叫shift mode数据可以在时钟驱动下沿着链一步步移进去。第三步移完数据后再切回capture模式用一个或几个时钟脉冲让组合逻辑真正跑一遍把结果“抓住”存进寄存器然后再切回shift模式把结果移出来。这样一进一出内部任何一个节点的逻辑值都能被外部看到。这里有个关键点我想强调扫描链不是把寄存器的功能逻辑改掉了而是额外加了一条“旁路通道”。用生活化的说法每个寄存器就像每个房间里的电表平时各自计量各自房间的用电功能模式但电表之间本身连着一条总线扫描链供电局可以挨个抄表shift模式抄完表用户继续正常用电cap模式。这个比喻在面试里讲出来面试官一般都会点头。还有个容易混淆的点是扫描链和BIST的区别。扫描链是外部控制、外部观察需要ATE和测试向量BIST则是把测试逻辑做进芯片内部比如LFSR生成伪随机激励MISR压缩响应芯片自己测自己适合存储器这类规则结构。二者的口语区分可以直接记成扫描链是“外面派人来查”BIST是“内部装了摄像头自动查”。2.2 复位信号为什么是DFT的“老大难”一聊到“插复位怎么改RTL”先得把复位这个家伙在DFT里到底麻烦在哪搞清楚。我的体会是复位信号是DFT里隐患最多的信号之一因为它在功能模式下是“一切归零”的开关威力极大在测试模式下稍不注意就会把恰恰要观察的状态给清掉。最常见的坑是异步复位。设计中大量使用异步复位寄存器复位信号一拉低寄存器立刻清零不受时钟控制。这本身没问题但到了扫描测试阶段问题就来了扫描链shift的时候数据要靠时钟一步步移进寄存器如果复位信号在shift过程中不受控地抖动一下整个链里的数据瞬间清零前功尽弃。更麻烦的是异步复位路径上的毛刺、上电时序、复位释放顺序在ATE环境下都比仿真环境恶劣得多很多“仿真全绿上机全挂”的DFT问题都出在复位上。另一个常见坑是复位和扫描使能打架。扫描链的shift操作要求scan_en在整个shift期间稳定为高capture之前再拉低。复位信号如果跟scan_en有耦合或者复位释放的时序跟时钟边沿撞在一起就会产生setup或hold的竞争问题导致捕获的数据不确定。这种问题往往不是单点故障而是“复位时钟scan_en”三者交互出来的时序病理定位起来很费劲。还有一类不太被新人注意的点是部分寄存器的复位不受顶层复位控制。RTL里写了个内部逻辑生成局部复位或者某个子模块的复位信号由状态机控制这种“非端口复位”在DFT眼里就是不可控节点。不可控意味着测试时你可能没法把寄存器预置到确定状态覆盖率会莫名其妙掉一块查半天发现根源在复位树。所以DFT对复位的核心诉求只有一句话测试模式下复位信号必须完全可控、完全可观测且不能干扰shift和capture。这句话也是下文RTL改法的总纲。2.3 测试时钟与时钟mux跟复位并列的另一个“大佬”是时钟。DFT里常说“时钟可控”意思是测试模式下芯片用的时钟不能依赖PLL锁定也不能依赖晶振起振后的稳定时间因为ATE要精确控制每一个测试向量里的时钟沿。做法上常见的是在芯片顶层做一个时钟mux功能时钟func_clk和测试时钟test_clk二选一由test_mode信号选择。这样在测试模式下时钟完全由ATE直接供给频率、沿位置、脉冲个数都能精确控制。很多DFT实现里还会在mux输出端加一个ICG集成时钟门控或者直接用门控时钟确保时钟切换时不会产生glitch否则后端时钟树一做毛刺会被放大。这里我提醒一下新人时钟mux的RTL改法看起来简单——一个assign就完事——但真正的坑在综合约束和后端CTS时钟树综合。test_clk和func_clk必须被声明为不同的时钟域set_case_analysis要把test_mode固定好否则综合工具可能把两条时钟路径平衡掉做出一个又慢又怪的时钟树。我自己踩过一次RTL里mux写得很干净但综合时忘了把test_mode设为常量工具存了一条穿过mux的“虚拟长路径”导致时序报告里冒出一堆莫名其妙的不满足路径查了整整一天。另外如果你做的是超大规模SoC要留意跨时钟域的扫描链设计。扫描链里串了不同时钟域的寄存器不是不行但shift时所有时钟必须同频同时钟沿否则数据在链上会丢。实际工程里通常会让所有时钟域在测试模式下都mux到同一个测试时钟源甚至用同一个时钟门控去驱动这也就是常说的“scan时钟统一”。3. 实战插复位信号时RTL到底怎么改3.1 场景设定异步复位寄存器的DFT隐患现在我们把“DFT插复位怎么改RTL”这个具体问题拆开。先设定一个最典型的场景你的设计里有一堆异步复位寄存器顶层复位信号是rst_n低有效直接连到每个寄存器。功能上一切正常但要插入扫描链做DFT。隐患在哪我再说细一点。SCR扫描链shift时我们希望数据是完整的移位链每一位都只受时钟控制。但异步复位寄存器的复位置位端直连rst_n这个rst_n在ATE环境下从哪来通常是从测试pin直接进来的那么它在你shift过程中完全有可能被环境噪声、夹具接触电阻、甚至ATE本身的时序误差干扰出一根毛刺。更隐蔽的是测试模式下多个测试项之间切换时复位释放和扫描使能信号本身有先后顺序顺序错了复位刚好在shift过程中释放链里数据被清空覆盖率报告直接崩盘。所以对DFT来说一条基本铁律是所有异步置位/复位信号在测试模式下必须被隔离或者接管。什么叫做“接管”就是在test_mode有效时不复用功能复位路径改用测试专用的复位控制逻辑让复位和scan_en、时钟完全配合起来。3.2 RTL改法test_mode与复位mux我现在给你一个能直接落到工程里的改法。假设原始RTL是这样的module dut ( input wire clk, input wire rst_n, input wire data_in, output reg data_out ); always (posedge clk or negedge rst_n) begin if (!rst_n) data_out 1b0; else data_out data_in; end endmodule这里rst_n直接接在寄存器的异步复位端。DFT插入时我们要引入两个新信号test_mode全局测试模式和test_rst_n测试专用复位一般由ATE的复位pin产生。改法核心无非两种思路我分别说。第一种在复位路径上做mux测试模式下把功能复位替换成测试复位。module dut_dft ( input wire clk, input wire rst_n, input wire test_mode, input wire test_rst_n, input wire data_in, output reg data_out ); wire rst_n_eff; assign rst_n_eff test_mode ? test_rst_n : rst_n; always (posedge clk or negedge rst_n_eff) begin if (!rst_n_eff) data_out 1b0; else data_out data_in; end endmodule这个改法很直观test_mode为高时功能复位完全失效测试复位接管。配合scan_en在shift阶段保持高电平、test_rst_n在整个shift期间保持高电平不触发复位扫描链就能稳定移位。第二种不改复位端而是用MUX把复位导致的清零逻辑“屏蔽”掉。也就是寄存器仍然保留异步复位端但在功能逻辑上让复位不起作用wire rst_n_dft test_mode ? 1b1 : rst_n;这个做法其实是把异步复位信号在测试模式下拉成无效态效果上等价于第一种但要注意寄存器的异步复位端仍然挂着信号在物理实现上保持直接连接对STA静态时序分析和后端布局可能更友好。至于选哪种主要看你DFT flow里是否要求复位信号走独立的scan测试pin。我个人偏向第一种因为测试复位可控性更高而且能把“复位高有效/低有效”在测试模式下一并统一掉。哪种都不是让你随便改。有一个细节会被很多人漏掉test_mode本身的时序。test_mode信号一般不是普通寄存器输出它会在测试模式建立时被ATE拉高然后整个测试期间保持稳定。但你如果把它直接用在一个组合逻辑mux上就必须检查test_mode和rst_n、test_rst_n之间有没有组合竞争。最稳妥的做法是让test_mode经过一个同步器或者至少在后端做时钟沿对齐约束避免在时钟边沿附近翻转。3.3 改完之后的检查清单与常见坑改完RTL不能就撒手不管我自己做DFT review时有张固定检查清单分享给你。第一确认所有异步复位寄存器的复位端都已经在测试模式下被隔离。具体做法是在综合后反标网表里搜一下寄存器库里的异步复位引脚通常是CDN/CSDN/SDN这类pin看它们连的是功能复位网络还是已经接进了mux/test模式逻辑。第二确认复位mux的输出没有组合环路。如果复位信号经过mux之后再反馈到mux的选通端那就是噩梦。用形式验证工具检查一下rst_n_eff和test_mode之间是否存在组合路径必要时在test_mode路径上加一级延迟降低风险。第三确认scan_en和test_rst_n在shift阶段都是稳定的。这个在DFT仿真里是必查项拉高test_mode、拉高scan_en之后给一串连续时钟检查每一个移位寄存器输出是否按预期搬移期间test_rst_n绝对不能产生下降沿。第四别把功能复位网络直接短路到地或电源。有些新人图省事直接在顶层写assign test_rst_n 1b1然后发现测试复位根本进不了芯片因为ATE的那根pin被架空成常量了。测试专用pin必须从顶层端口进来最好给它加个pull-up/pull-down和ESD保护例化。第五改完RTL后建议补一轮DFT仿真至少覆盖三个场景shift模式扫描链移位正常、capture模式捕获时钟正常且复位不干扰、复位模式测试模式下复位能够正确清空寄存器。这三个场景都绿了才说明这次“插复位”的RTL改动基本合格。我还踩过一个非常典型的坑有些寄存器是异步置位不是复位也就是set端接信号。功能上这两个寄存器的行为逻辑完全不同但DFT检查时如果只盯着复位端set端漏掉了测试模式下一旦置位端被毛刺触发寄存器被强制置为1扫描链上的数据照样报废。所以注意检查清单里写的是“异步置位/复位端”不是只查复位。这个细节是很多DFT review漏项的重灾区。4. 面试与汇报中的DFT口语速查4.1 面试官常问的DFT问题及参考表达既然标题是“口语样本”面试场景自然跑不掉。我整理了几个高频题顺带给出我的参考表达。这不是标准答案但都是我实际面试和模拟面试时验证过效果的讲法。“什么是扫描链为什么需要它”我的参考表达扫描链是把设计中的寄存器在测试模式下串成移位寄存器链。它让我可以在不依赖功能时序的情况下把测试激励直接移入到电路内部每个寄存器的下一级组合逻辑输入并把结果移出来观察。这样ATP G工具才能自动生成高覆盖率的测试向量而不是靠人工写功能向量碰运气。“复位信号在DFT里有什么特殊处理”参考表达复位信号在DFT里最需要关注的是可控性。测试模式下我们会用test_mode信号把功能复位隔离改用ATE提供的测试复位这样扫描移位期间复位不会被毛刺触发。另外release时机要好不能跟capture时钟沿竞争我会通过DFT仿真和STA来确认这个时序关系没有违反。“scan_en信号在测试时怎么控制”参考表达scan_en在shift阶段为高让扫描链处于移位状态capture阶段拉低让组合逻辑正常捕获。它的时序要求很严格因为它们要协调所有寄存器的D端和扫描输入端的切换这个信号在DFT里是除了时钟和复位之外第三重要的全局信号。这几个问题面试官其实想考察的不是术语背得溜不溜而是你有没有真正理解“可控性”和“可观测性”这两个DFT的底层逻辑。所以你在回答时尽量把所有技术细节都落回到这两点上面试官基本都会认可。4.2 项目周会/评审中如何讲DFT项目周会上讲DFT跟面试又不太一样。周会上听众是队友和直属领导大家关心的是计划、阻塞、风险和资源不需要你再从头科普扫描链是什么。我一般用“一段话汇报法”先一句话说完成了什么进度再说卡在哪里风险/阻塞最后说下一步计划。举例“这周完成了top层扫描链的RTL插入所有异步复位寄存器已实现测试模式隔离覆盖率目标目前看能到98.5%但发现一个跨时钟域的复位释放时序有点紧周末会在DFT仿真里加一组case确认明天上报结论。”这里有个很容易犯的毛病在周会上讲得太细。DFT细节往往牵一发动全身你讲得越细听众越容易发散追问结果一个周会变成DFT专场。我的原则是结论先行细节只在被问到的时候展开。如果领导追问“时序紧到什么程度”再具体分享路径延迟数据。这不是藏信息而是尊重会议节奏和听众精力。评审会比周会更正式听众可能是前后端各个团队的负责人。我会提前准备一页胶片的“DFT风险清单”按高、中、低三档列出每个风险对应的缓解措施。比如复位风险高、异步复位寄存器太多且复位树复杂缓解措施是顶层test_rst_n统一接管并加仿真覆盖。这样评审会上一目了然也显得你做事有章法。4.3 从“会做”到“讲明白”的进阶技巧最后聊一个很多人问我“为什么我做了三年DFT面试时一紧张就讲乱”的问题。我的经验是这通常不是技术问题而是没有提前准备“口语脚本”。具体做法很简单把你负责过的一个DFT模块用不超过三句话讲清楚“它是什么、解决什么问题、我做了什么”。这三句话不是背稿子而是提前写出来反复念直到你能不看任何资料、不卡壳地讲出来。这个脚本甚至可以拆成两版一版是30秒版给老板和面试官一版是5分钟版留到深入交流时用。再分享一个小技巧讲DFT的时候多用“可控、可观测、覆盖率、ATPG、shift/capture”这些高频词但注意别堆砌。真正的表达高手是用最少的术语把逻辑讲通术语反而成了辅助。比如讲复位隔离时我会说“我把功能复位在测试模式下换成了ATE的复位pin这样扫描移位时它不会乱跳”这句话里没有一个生僻词但懂行的人一听就知道你干了什么。另外一个很实用的练习方法是“教新人”。我每年都会给团队的新人讲一次DFT入门课讲完之后你会发现很多你以为自己很明白的点被新手一提问就露馅了。能讲明白才说明你是真懂。所以这篇文章的标题虽然是“口语样本”本质上是逼着我把DFT的操作和逻辑“翻译”成普通话的过程。我自己这些年最大的体会是DFT做得好不好一半靠技术功底一半靠能不能把技术目标讲清楚让前后端兄弟团队愿意配合你。复位怎么改RTL、扫描链怎么插这些具体操作花点时间都能学会但能把“为什么要这么改、改了之后风险在哪里”说明白才是从执行者变成负责人的分水岭。希望这份口语样本能帮你少走几步弯路。
返回列表