尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

边界扫描实战:从IEEE 1149.1到BGA板级测试与故障定位

边界扫描实战:从IEEE 1149.1到BGA板级测试与故障定位 最近手里有一块六层板量产前做板级测试时卡住了板子功能逻辑已经调通但用了三片BGA封装的FPGA、两片LPDDR还有几组高速差分对。飞针测试根本够不到BGA底下的引脚示波器探头也没有那么细常规的ICT治具又贵得离谱。同事说这要是放在十多年前老师傅直接拿万用表挨个点测试点就行可现在引脚间距已经压到0.5mm以下BGA焊盘扇出后内部网络根本看不见。这时候我才真正意识到2021年了JTAG边界扫描Boundary Scan不仅没被淘汰反而是板级测试里最可靠、性价比最高的一种手段。JTAG边界扫描的核心价值就是把芯片每一只管脚的状态拉出来变成一串可移位的数字从而在不直接接触引脚的情况下做互连测试、故障诊断甚至在线配置FPGA。它适合硬件工程师在PCB调测阶段排除短路虚焊也适合工厂端的治具测试还能帮嵌入式工程师在芯片被完全锁死之前想办法恢复调试口。这篇文章就把我从原理到实操踩过的坑完整梳理一遍。1. 边界扫描为什么在2021年依然值得翻出来重讲1.1 从一块塞满BGA的板子说起现代板卡的趋势就是把越来越多的功能塞进高密度封装里。BGA引脚间距从1.27mm到0.8mm再到0.5mm甚至0.4mm一颗芯片几百个引脚其中还有大量电源地引脚在网络上是直接并联的。你根本没法靠肉眼或者万用表判断相邻两个引脚之间有没有焊桥。这种情况下传统做法的成本让人头疼飞针测试精确但慢。单板测试时间动辄几十秒到几分钟量一大就扛不住。ICT治具速度快但针床治具昂贵改板一次就要跟着改治具重做周期长。人工目检加万用表只能照顾到顶层的、引脚稀疏的器件对BGA无能为力。边界扫描从另一个角度绕开了物理接触问题。它不需要探针接触到目标引脚只要芯片支持IEEE 1149.1并且PCB上把JTAG链路布通工具就能通过TAP口把每一只管脚的输入输出状态读回来、写出去。这就等于给每颗芯片的每个引脚装了一个虚拟探针。所以到了2021年这个技术不但没有老去反而因为高速接口和BGA器件的普及成为量产测试里不可缺少的兜底手段。特别在通信板卡、工控主板、汽车电子ECU这些高可靠性产品上JTAG边界扫描往往是ICT和飞针之外唯一能覆盖到BGA引脚的测试途径。1.2 同一套引脚两种完全不同的JTAG很多新手会把JTAG下载调试和JTAG边界扫描当成一回事其实它们共用物理接口但工作内容完全不同。调试下载JTAG通过内核的Debug Access Port访问CPU寄存器、内存用于烧录程序、断点调试。边界扫描JTAG通过IEEE 1149.1定义的TAP控制器访问芯片边界扫描寄存器用来测试引脚互连、采样输入状态、输出特定电平。同一个J-Link、ST-Link能对STM32烧录靠的是前者而XJTAG、JTAG Technologies这类测试工具能扫描整块PCB上的互连靠的是后者。很多芯片同时支持两种模式但进入哪个模式由TAP状态机和指令寄存器决定。我在实际项目中经常遇到这种情况软件工程师以为边界扫描工具也能像调试器一样读出内存硬件工程师以为调试器可以帮他做引脚短路测试。这俩虽然有重叠但选型时必须搞清楚目标。边界扫描工具不负责调试程序它只负责看和控制芯片引脚级状态所以排查板级硬件故障它的效率远高于调试器反过来要trace一段内核代码调试器的功能是边界扫描工具替代不了的。2. 引脚定义与电气设计边界扫描的物理底座2.1 TCK、TMS、TDI、TDO各自干什么IEEE 1149.1标准定义的JTAG口最少需要四根信号线加一根地线有些还会加一根可选的TRST复位线。它们的职责很简单TCK测试时钟由主机产生所有的TAP状态变化都发生在TCK上升沿。TMS测试模式选择在TCK上升沿被采样用来驱动TAP状态机在不同状态之间跳转。TDI测试数据输入串行数据从这根线进入指令寄存器或数据寄存器。TDO测试数据输出数据从这里串行送出回传给主机。TRST可选用来异步复位TAP状态机不是所有芯片都有。为什么TMS和TDI通常要上拉、TCK通常要下拉这跟TAP状态机复位有关。TAP的Test-Logic-Reset状态要求TMS连续五个TCK周期保持高电平。如果TMS悬空谁也保证不了它是个确定电平系统一上电TAP可能跑进未知状态。上拉到高电平之后只要主机不发时钟TAP就容易落到复位状态。TDI上拉同理防止数据在空闲时乱飘。TCK下拉则是保证静态电平时钟线处于低电平避免因为噪声误触发。实际Layout时这几个电阻的位置也很有讲究。应该放在JTAG连接器或者调试端口附近尽量靠近主控一侧。串阻可以加在主机与目标板之间常见33欧姆到100欧姆用来抑制反射。我的习惯是TCK、TMS、TDI各串33欧姆TDO不串或者串小阻值保证回传信号完整度。2.2 边界扫描单元、BSDL与TAP状态机如何协同边界扫描的本质是芯片内部有一串边界扫描单元BSC它们串联成一个边界扫描寄存器BSR每个BSC对应一个引脚。你可以把这个寄存器想象成一排可以串行进出的锁存器驱动模式把某个BSC写入1或0芯片对应引脚就会输出高或低电平。采样模式对某个BSC做捕获就能读到该引脚当前的输入逻辑。TAP状态机则是这串寄存器的调度中枢。标准的1149.1状态机有16个状态包括Test-Logic-Reset、Run-Test/Idle、Select-DR-Scan、Capture-DR、Shift-DR、Exit1-DR、Pause-DR、Exit2-DR、Update-DR、Select-IR-Scan以及对应IR侧的Capture、Shift、Exit1、Exit2、Update。整个过程像流水线先通过TMS切到IR扫描把一条指令写进指令寄存器比如EXTEST再切到DR扫描把测试向量通过TDI串行移入BSR然后执行最后把响应通过TDO移出来和期望值比对。BSDL文件Boundary Scan Description Language是这一切的说明书。芯片厂商会发布对应的.bsd文件里面定义了芯片每个封装的引脚名、边界扫描单元顺序、支持的指令、IDCODE值。工具软件拿到BSDL才能知道第几个BSC对应PB5、第几个BSC是控制引脚方向。没有BSDL边界扫描就等于闭着眼睛瞎抓。我见过不少团队在项目立项时根本不找芯片厂商要BSDL等到板子做出来想跑边界扫描才发现手里的芯片是早期工程样片厂商还没有正式发布BSDL文件。这个问题在大厂FPGA上还好一些小众MCU和SoC上特别容易踩。所以选型阶段就应该把BSDL文件纳入可交付资料清单让芯片代理确认支持边界扫描并提供对应型号的BSDL。2.3 多电压域和JTAG连接器设计JTAG的物理接口设计往往决定测试的成败。现代主板上同时存在3.3V、1.8V、甚至0.9V的IO电压而JTAG主机可能是5V或3.3V逻辑。电平不匹配轻则采集不到数据重则烧坏芯片引脚。推荐的做法是优先选择支持电压可调的JTAG测试器或者在板子上专门为边界扫描留一个电平转换区域。量产测试夹具上我习惯使用带缓冲的JTAG驱动板而不是直接把主机的杜邦线怼到板子上。缓冲芯片选74LVC1T45或者SN74AVC4T245这类可用的电平转换器件能同时解决驱动能力和电平匹配问题。连接器方面不同厂商偏爱不同的插座ARM标准的20针或10针JTAG常见于Cortex-M开发板Xilinx的14针JTAGSilicon Labs、NXP等厂商自己的调试接口定义设计时可以在板卡上放一个2x5或者2x7的通用JTAG排针把TCK、TMS、TDI、TDO、GND按照固定顺序引出来再留一个或者几个备用引脚。这样无论是工厂测试、FPGA在线升级还是售后排查都不用再飞线。3. 实操用边界扫描做一次板级互连测试3.1 工具链选型商业软件、OpenOCD/UrJTAG以及其他开源方案做边界扫描测试工具链分为两层底层是JTAG控制器硬件上层是运行在PC上的测试软件。商业方案有JTAG Technologies现在归Keysight、XJTAG、Asset InterTech功能很全支持自动生成互联测试向量、自动诊断开路短路但价格不便宜License和测试器硬件加一起是一笔不小的开销。如果预算有限开源方案也不是完全不能用。UrJTAG是老牌的开源JTAG工具支持BSDLLattice、Xilinx、Altera等一大批器件配合FT2232H或者FT232H这类便宜的USB转JTAG适配器就能跑起来。OpenOCD虽然主要面向调试下载但也支持部分边界扫描操作尤其适合在Linux环境下做自动化测试。我的体会是如果是研发阶段做故障定位UrJTAGFT2232H足够用成本几百块。如果是工厂量产需要自动化测试、日志追溯、测试项管理还是要用商业方案它的测试向量生成质量和对复杂板卡的诊断能力确实更强。开源和商业的差距主要体现在两大块一是互联测试向量生成的智能程度商业软件能从网表BSDL自动算出哪根线断了、哪里短路开源工具往往要你自己在脚本里描述网络期望值。二是对复杂扫描链拓扑的支持商业软件对菊花链、多电压域、时钟域异步的处理更成熟。3.2 从IDCODE到EXTEST扫描链完整性验证拿到一块板子第一步不是直接跑EXTEST而是先做扫描链完整性检查。所谓扫描链就是把板上所有支持JTAG的芯片按TDI-TDO首尾串起来形成一条链。测试器只需要一个JTAG口就能通过这条链访问所有器件。但链路中任何一颗芯片虚焊、电源没起来、或者TDI/TDO连线断开整条链都可能瘫痪。常见流程识别所有被测芯片的IDCODE。主机发送IDCODE指令然后串行移位读取每个器件的IDCODE。一个正常的链读到的IDCODE数量和顺序应该跟设计文件一致。用BYPASS指令验证。BYPASS让每颗芯片只延迟一个比特从TDI到TDO形成一条最短路径。如果这个环节能通过说明链路的基本电气连接是好的。检查TRST和TCK时序。TCK频率刚开始要压低比如1MHz等确认稳定再逐步提升避免高速反射导致采样错误。IDCODE阶段最有信息量的不是能不能读到而是读到的值是不是预期值。一次我测一块板子预期三颗器件的IDCODE分别是A、B、C结果读出来是A、B、C的反码。查了半天发现是TMS时序问题TAP状态机停留在Shift-DR状态之前导致移位错位。换了一根质量好一点的扁平线就好了。这个案例说明IDCODE不对别急着怀疑器件先检查电平、线序和时钟。3.3 生成测试向量并定位断线/短路当扫描链验证通过才好进入真正的互连测试。核心思路对发送端引脚通过BSR写入确定电平比如全0或全1。对接收端引脚通过BSR采样。如果采样值和期望值不一致说明发送端与接收端之间存在开路、短路或者电阻异常。控制BSR时方向控制位特别关键。很多芯片的BSR里每个IO引脚有输入采样单元、输出驱动单元和输出使能单元三个BSC。方向位没设对会导致输出端实际是高阻采样结果完全不可信。实测中一个常见的误判是短路其实来自芯片内部电源地的多引脚并联。比如一块PCB上所有GND引脚本来就是同一个网络你用边界扫描工具把相邻两个GND引脚驱动成不同电平自然会出现冲突。所以测试向量生成时要排除电源地和固定电平引脚让工具把这类引脚当成常量处理。一次在实际板上发现信号线A和信号线B之间报短路但万用表量度明明是断开的。后来用边界扫描工具逐段缩小范围定位到是BGA芯片内部的die bonding问题——引脚在封装内部短路了PCB本身是完美的。这个案例充分说明边界扫描的价值它测的是芯片管脚级的实际状态能把问题缩小到板内走线还是封装内部。4. 安全与可用性的平衡JTAG保护、禁用与恢复4.1 STM32禁用JTAG后边界扫描和调试分别会发生什么热词里有个高频问题STM32禁用JTAG如何恢复说明很多人对JTAG引脚复用有切肤之痛。STM32的PA13/PA14/PA15、PB3/PB4默认是JTAG/SWD复用功能但在实际项目中为了省引脚开发者经常通过代码把PA15JTDI、PB3JTDO、PB4JTRST配置成普通GPIO甚至把PA13/PA14SWDIO/SWCLK也释放掉。这里要分清楚只禁用JTAG但保留SWDPA13/PA14还可以用来下载调试边界扫描的JTAG口则没法用了。完全禁用调试端口所有调试相关引脚都变成GPIO无论是J-Link还是ST-Link都无法通过SWD接口连接。一旦完全禁用最直接的恢复手段是拉高BOOT0进入系统存储器Bootloader通过串口ISP擦除或修改选项字节把调试功能重新打开。STM32的选项字节里关于调试端口的配置可以通过ISP编程改写。不同系列细节有差异但思路一致不是物理烧死而是固件层面的锁定。注意关闭了JTAG调试口同时也意味着放弃了边界扫描能力。如果你所在的产品有量产板级测试需求JTAG引脚被复用成GPIO之前最好确认测试策略已经覆盖到对应引脚。我看到过硬件工程师为了省两个引脚把JTAG全部关掉结果量产测试时只能靠飞针慢慢量成本高了一截。省引脚还是保可测试性这是一个需要权衡的决定。4.2 汽车级芯片的调试端口安全策略S32K这类车规MCU的JTAG保护比STM32更严格因为安全生命周期管理是汽车电子认证的一部分。常见的做法是在芯片内部加入调试端口权限管理只有在芯片处于Open生命周期时调试器才能完全访问一旦进入Closed或Locked状态JTAG端口只提供极有限的访问权限甚至完全关闭。这带来的实际影响是研发阶段用的调试板可以放开所有调试能力但在正式产品或量产固件中往往会在安全策略里禁用或限制调试端口防止固件被读取和逆向。处理这类芯片的JTAG保护时强烈建议在硬件上保留一个独立的串行调试接口或编程接口作为备份这样即使JTAG被锁也能通过ISP或者其他方式恢复。同时要在固件版本管理和安全密钥管理上做配套避免开发板和生产板用了同一套安全状态配置导致产线测试时无法进入边界扫描模式。4.3 给硬件工程师的JTAG引脚分配建议结合我踩过的坑给准备在新项目里预留JTAG边界扫描能力的硬件工程师几条具体建议不要把带JTAG功能的引脚全部分配给低速GPIO。至少保留一个完整的JTAG口方便研发、量产和售后。在电路原理图里单独建一个Debug/Test页把JTAG连接器、电平转换、上下拉电阻、串阻集中放方便审查。扫描链顺序要清晰。如果板上有多个可测试器件优先按信号流向排链避免绕来绕去导致布线困难。给JTAG口加ESD保护。量产测试时经常热插拔一不留神就可能打坏TAP控制器或者芯片引脚。5. 避坑记录从扫描链不通到识别不到的排查链路5.1 高云JTAG识别不到这类问题的排查顺序很多人在FPGA开发板上遇到过下载器识别不到芯片。如果用的是高云GW1N系列这个问题尤其常见。不要急着怀疑芯片坏了先按这个顺序一层层查供电。JTAG需要芯片正常上电一些FPGA还有多组电源任何一组没起来都会导致IO不工作。用万用表量每个电源轨的电压看是否在规格范围内。配置引脚。高云FPGA的JTAG引脚和配置引脚经常是复用的。如果外部电路把模式选择引脚拉到了某种配置模式或者配置文件里禁用了JTAG识别不到就是必然结果。TCK/TMS/TDI/TDO线序。JTAG连接器种类繁多同样的2x5座子在不同板卡上引脚顺序可能完全不同。先找到丝印和原理图确认线序别上来就插。电平。调试器输出是3.3V还是1.8V目标板IO电压是多少。电压差太大时TDO回传可能读不到。链路后面的器件影响。如果扫描链上还有别的芯片且后面芯片TDI悬空或TDO短路可能导致整条链数据异常。这个排查链路其实适用于绝大多数JTAG识别不到问题先电源再线序再电平再链路最后才怀疑芯片本身。我见过最离谱的一次是下载线内部断了芯但表皮完好换了根线就好了。所以排查时备用线材一定要备齐。5.2 边界扫描测试过程中容易忽略的时序细节边界扫描的时序细节比很多人想象的更敏感。以下几点是我在实际项目里反复确认过的TCK频率不是越高越好。一些国产FPGA在4MHz以上时TDO建立时间可能不够导致主机采到错误数据。稳定起见先跑1MHz。TMS信号在TCK上升沿必须已经稳定。如果布线太长导致反射TMS的建立时间被压缩状态机会跳出正常工作区间。TDO是三态输出。多个器件共用TDO线时需要设计成菊花链的首尾串接而不是并行接在一起。并行接TDO意味着多个器件同时驱动一条线轻则信号打架重则烧器件。IDCODE寄存器长度不是固定的。不同器件可能返回32位、64位甚至更长工具软件会根据BSDL自动处理。如果你手动写脚本做扫描链访问千万不要硬编码长度。5.3 一些值得记住的排查顺序在做板级故障定位时我习惯遵循这样的优先级先跑IDCODE确认扫描链完整。再跑BYPASS隔离出是链路本身问题还是某颗芯片的问题。然后跑SAMPLE/PRELOAD在不影响运行的情况下采样引脚状态判断外围电路基本逻辑。最后才跑EXTEST强制输出电平做互连测试。这样一层层缩小范围比上来就跑EXTEST然后被一大堆错误淹没要高效得多。边界扫描工具报告的故障点只是一个疑似区域还要结合原理图、PCB网表和实际万用表测量来综合判断。最后再分享一个在实际项目里很管用的小技巧在做量产测试时把每一块板的JTAG测试结果保存成带序列号的日志并关联到产品SN。这样一旦售后出现批次性问题可以反查是哪一批板子在哪一道测试环节开始出现异常。边界扫描不只是一种测试手段更是一条能贯穿产品全生命周期的可追溯数据链。
返回列表