ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

软错误测试实战:JEDEC JESD89A标准解析与FIT计算指南

软错误测试实战:JEDEC JESD89A标准解析与FIT计算指南 简介JEDEC JESD89A2006(R2012) 标准是固态技术协会制定的半导体器件软错误测量与报告规范完整英文原版共94页详细定义α粒子和地面宇宙射线诱发位翻转、数据错误等软错误现象的判定与分类方法。该版本于2006年发布、2012年重申属于当前有效标准面向芯片设计、制造、测试和可靠性验证工程师适用于航空航天、数据中心及高可靠工业电子等辐射敏感领域。压缩包内含1个PDF文档约763KB文字层可检索复制覆盖软错误测量原理、计算模型、报告格式及实验设备要求等核心内容。读者可依据标准搭建辐射试验环境、制定错误率评估流程也可用于高校课程或研究生课题学习。已有309人学习下载既能作为系统学习的教材也能在工程评审中快速查询条款是可靠性工作中实用的权威参考资料。1. 不要把软错误当成随机故障JEDEC JESD89A 在管什么服务器偶发不可纠正 ECC换掉 CPU、内存、主板都没用最后发现是封装塑封料里的 α 粒子打翻了 SRAM 节点——这种事放在十年前还能靠“玄学”解释放到今天JEDEC JESD89A:2006(R2012) 就是用来把这类“软错误”变成工程问题的依据。它是一套测量与报告规范α 粒子、地面宇宙射线中子、器件与系统级软错误率怎么测、怎么加速、怎么算 FIT、怎么报 MBU全在 94 页里给了统一口径。你不需要背下全部条文但你要做 SER 评估、出货报告或故障归因时绕不开它。这篇按我实际做可靠性测试的路径来讲先立物理概念再落到 JESD89A 推荐的测量配置然后写数据处理脚本最后讲报告里常被审阅人挑刺的几个细节。对新入行的人按章节顺序能把一个最小软错误测试跑起来对已经做过几年的人后半部分是交叉验证与报告防坑。2. 软错误不是玄学α 粒子和地面宇宙射线中子的物理输入2.1 封装材料里的微量放射性杂质是 α 粒子的主要来源α 粒子不是只有核废料才有。芯片封装用的塑封料、焊料、陶瓷基板、金线键合区甚至部分底部填充胶都可能含有极微量的铀和钍杂质。U-238 和 Th-232 衰变链放出的 α 粒子能量通常在 39 MeV 之间射程在硅里只有几微米到几十微米。粒子穿过反偏 PN 结耗尽区时沿轨迹电离出电子空穴对被电场收集后形成一个瞬态电流脉冲。如果收集到的总电荷大于存储节点的临界电荷 Qcrit锁存器的状态就会被翻转表现为一个软错误。Qcrit 不是固定常数。它随工艺节点、电源电压、节点电容和驱动管强度变化。同一颗芯片在 1.2V 下测得的软错误率和在 0.9V 下测得的软错误率可以差一个数量级原因就是低电压下 Qcrit 下降更容易被粒子打翻。JESD89A 报告里要求写清楚测试电压不是一个形式要求而是因为电压直接决定了结果能不能复现。2.2 地面宇宙射线主要贡献是高能中子和热中子来自外太空的一次宇宙射线进入大气层后会打出一系列次级粒子。真正影响地面半导体器件的主要是高能中子能量可以从几百 keV 到几百 MeV 都有。高能中子本身不带电进到硅里以后与 Si 原子核发生非弹性散射或核反应产生 α 粒子、质子、γ 等次级荷电粒子再由这些产物电离出电荷。因为中子与硅核反应的截面在很宽的能量范围内没有单一尖锐峰值室内模拟地面环境时不能只用一条单能束而应该用宽谱中子源去近似地面中子谱。热中子也不能忽略特别是工艺里用了含硼材料或者 BPSG 介质层的情况。热中子被 B-10 吸收后产生 α 粒子和 Li-7这个反应的截面非常大。现代铜互连和后道工艺已经很少用 BPSG但封装材料、底层介质或者某些特殊工艺里仍然可能残留敏感材料。JEDEC 系列里做封装材料 α 发射率测量时会同时关注放射性杂质含量逻辑是一样的。2.3 按 JESD89A 口径对错误分类而不是只看“翻转了几个 bit”软错误测试的原始日志通常是“地址 bitmask 时间戳”。但报告里不能只给一个总错误数需要按类别拆分。下表是我在实验室里常用的分类口径错误类别典型现象报告关注点SBU单个地址单个 bit 翻转FIT/Mbit 主指标最容易统计MBU同一 word 或相邻地址多个 bit 翻转对 ECC 设计和 scrubbing 策略影响大SEFI控制逻辑、状态机异常挂死通常单独列不能混入存储位翻转硬错误反复读到同一个 bit 错误不属于软错误报告里单列排除间歇错误重读次数不同温度/电压相关需要与软错误一起说明复测条件这里有一个常见误区看到同一地址的 bitmask 里有多个 bit就立刻当成一次 MBU。实际上一次 α 粒子或中子核反应可以在相邻节点沉积电荷但也可能只是测试程序扫描太慢把两次独立的 SBU 凑到了同一个读数里。JESD89A 的做法是先按时间窗和地址相邻关系做聚类再判定事件类型。2.4 用一段 Python 把原始日志聚成 SBU/MBU 事件下面这段代码处理一个简单的 CSV 日志日志字段包括 timestamp、addr、bitmask 和 readback 次数。它先把同一时间戳、同一地址的多个 bit 合并为一次事件再按 bit 数区分 SBU 和 MBU。import csv from collections import defaultdict def classify_sbe_mbe(log_path: str): groups defaultdict(list) with open(log_path, r, encodingutf-8) as f: for row in csv.DictReader(f): # row: {timestamp: ..., addr: ..., bitmask: ..., retry: ...} groups[(row[timestamp], row[addr])].append(int(row[bitmask], 16)) sbe 0 # Single-Bit Event mbe 0 # Multi-Bit Event for (ts, addr), bitmasks in groups.items(): total_bits sum(m.bit_count() for m in bitmasks) if total_bits 1: sbe 1 else: mbe 1 return sbe, mbe print(classify_sbe_mbe(ser_log.csv))代码逻辑不复杂重点在groups的键是“时间戳 物理地址”组合。同一轮读回里同一个地址出现了多个不同 bitmask说明一次扫描周期内该 word 至少有两个 bit 变化大概率归为 MBE。但如果你把时间窗拉太大比如两次扫描间隔 1 秒这个聚类结果就会把真正无关的 SBU 合并成 MBE。所以参数上我一般会让日志生成端保持扫描周期固定并在分析时额外检查同一分组的时间戳是否连续。3. 从 JESD89A 测量程序落到台架α 源、中子束与 DUT 测试循环3.1 先决定器件级还是系统级再选加速条件JESD89A 涵盖两个层级器件级测试和系统级测试。器件级通常把芯片开盖或者直接用裸片做辐照DUT 工作在简单的 memory 读写模式下回读路径越短越好这样测到的是芯片本征软错误率。系统级则是把整块板卡或整机放进辐照环境运行真实业务由内存控制器、ECC、scrubbing 这些机制去兜底。系统级结果更接近真实部署但会引入“屏蔽窗口”。如果内存控制器每 8 小时才做一次 scrubbing那一次翻转发生后最多要等 8 小时才被发现期间可能被业务改写覆盖掉。这种情况下统计到的错误率低于真实物理错误率。JESD89A 的报告模板里对这两种层级有不同字段测试报告开头第一行就应该写清楚“器件级”还是“系统级”否则后面所有 FIT 数据都失去可比性。3.2 α 源测试的台架参数先看通量和距离做 α 源加速测试工程上常用 Am-241 作为 α 源。实验台架里最重要的三个物理参数是源活度、源到 DUT 的距离、以及空气间隙。α 粒子在空气中的射程远小于中子距离拉大会让能量在空气里衰减最终打得到芯片的粒子谱就偏离了封装材料里实际发射的情形。我一般会把源到片子的距离控制在 35 mm必要时用氦气吹扫减小能量损失。下面是几个我实际使用的经验参数不是 JESD89A 原文数值但按这个范围起步结果通常不会离谱参数建议值对结果的影响源活度0.110 μCi活度过低需要太长测试时间过高容易饱和源到 DUT 距离35 mm距离越大 α 能量衰减越多软错误率偏低每组测试时长以累计错误数 100 为准只看小时数会导致置信区间过宽DUT 电压与目标应用一致电压越低 Qcrit 越低错误越多温度控制在 ±2 ℃温度影响节点漏电和收集效率通量标定也不可省。Am-241 源出厂有标称活度但表面镀层会吸收一部分 α 粒子所以测试前最好用表面势垒探测器实测发射率。环境本底 α 通量通常在 0.0010.01 α/(cm²·h) 这个量级而加速源可以做到每平方厘米每小时几百甚至上千个 α 粒子这个比值就是加速因子 AF。3.3 中子束测试能量谱比总通量更重要中子束测试通常拿到的是宽谱束流也就是从热中子到几百 MeV 中子都有。加速因子不能简单用一个“通量倍数”代替因为地面环境的中子谱形在不同纬度、海拔下会有差异。正确做法是把测试束流的中子谱按能量分 bin再和参考地面中子谱加权得到等效加速倍数 MEDFMean Effective Dose Factor。如果项目只用一条单能中子束比如 14 MeV 单能中子那结果只能用于工艺对比不能直接外推到整机现场。组网时还要注意束流覆盖面积是否大于 DUT 敏感区域。芯片面积大而束斑小会造成部分 die 未被辐照换算 FIT 时低估。对此我一般会在 DUT 前面放一个中子探测器阵列测完一个剂量段后在坐标网格上做均匀性归一化用实际照射到敏感区的注量参与计算。3.4 一个可落地的 JESD89A 测试循环框架下面的 Python 框架不是一个成品驱动而是把“写 pattern → 读回 → 重读三次 → 分类”这条 JESD89A 测试链路的骨架列出来。实际接入设备时把write_pattern、read_region、read_word替换成驱动或寄存器读写函数即可。def run_ser_loop(regions, pattern, retries3): soft_errors [] hard_errors [] for region in regions: write_pattern(region, pattern) readback read_region(region) for addr in find_diff_addrs(pattern, readback): reads [read_word(addr) for _ in range(retries)] # 三次重读结果一致且不等于期望值判为硬错误 if reads.count(reads[0]) len(reads) and reads[0] ! pattern: hard_errors.append(addr) else: soft_errors.append(addr) return soft_errors, hard_errorsregions是要测试的物理地址区间集合pattern是测试向量通常用 0x5A 和 0xA5 交替或棋盘格用于暴露相邻节点之间的耦合翻转。retries3是区分软硬错误的常用重读次数。参数上建议把 retries 设成 23 次因为中子引起的翻转不会稳定复现而硬错误每次读回都一样。如果 retries 设得太大真实软错误可能被错误地归成硬错误如果设成 1则无法区分偶发读数异常。4. 数据归并、加速因子与 FIT 报告把 JESD89A 的数字算对4.1 从加速测试原始计数换算到 FIT/Mbit加速测试得到的是“测试时间内的错误数”要变成 JESD89A 报告里常用的 FIT1 FIT 1 error per 10⁹ hours需要经过两步先用加速因子折算到现场环境再按被测存储容量归一化。加速因子 AF 的定义是测试条件下的粒子通量除以现场环境通量。对于 α 源测试AF 就是实测源发射率除以目标应用环境的 α 通量对于中子束测试AF 是测试束的等效地面中子注量率除以现场中子注量率。换算公式写成代码就是def fit_per_mbit(ne, test_hours, af, mbit): # ne: 加速测试的软错误事件数 # test_hours: 有效辐照时间小时 # af: 加速因子无单位 # mbit: 被测有效存储容量Mbit field_errors_per_hour ne / test_hours / af fit_value field_errors_per_hour * 1e9 / mbit return fit_value这里有两个容易踩坑的地方。第一ne应该用事件数还是 bit 数JESD89A 默认分开报告SBU 计数和 MBU 计数都要给再给出各自端口后的 FIT/Mbit。如果只是拿总 bit 数去除以容量会把一个 MBU 当成多个独立软错误导致错误率高估。第二mbit不是芯片总容量而是实际参与测试且被 readback 覆盖到的位数。有的测试程序只检查了部分地址空间mbit应该按这个覆盖范围写。4.2 低计数场景必须用泊松置信区间软错误是稀有事件特别是系统级测试或者高海拔现场测试往往只有几个甚至零个错误。零错误不等于软错误率为零只能说在给定置信度下真实均值低于某个上限。JESD89A 报告评审中常见的一句话是“0 FIT”没有置信度可言。泊松分布置信区间可以用卡方分布计算。下表是工程报告里最常用的几个数值实际错误数90% 置信下限90% 置信上限95% 置信下限95% 置信上限002.3003.6910.114.740.035.57105.4317.084.8018.39当 n0 时95% 置信上限 3.69 的意思是若真实均值是 3.69测出 0 个错误的概率也有 5%所以单次测试 0 错误只能报告“95% 置信度下 FIT 上限为 3.69/测试小时数”不能报告“0 FIT”。4.3 一个带置信区间的完整换算脚本把 FIT 计算和置信区间放在同一个脚本里可以避免在 Excel 里来回粘贴出错。from scipy.stats import chi2 def poisson_ci(observed: int, conf: float 0.95): alpha 1 - conf if observed 0: lower 0.0 else: lower chi2.ppf(alpha / 2, 2 * observed) / 2 upper chi2.ppf(1 - alpha / 2, 2 * (observed 1)) / 2 return lower, upper def report_fit(ne, test_hours, af, mbit, conf0.95): lo, hi poisson_ci(ne, conf) base 1e9 / (test_hours * af * mbit) return lo * base, hi * base # 例10小时内测到5个软错误AF1000容量256Mbit print(report_fit(5, 10, 1000, 256))chi2.ppf(alpha/2, 2*observed)是卡方分布的分位数参数2*observed是自由度。这个函数的逻辑适用于 n 较小的情况当 n 大于 100 时用正态近似也不会差太多但报告里用这个方法更稳。脚本输出的是一个区间而不是单一数字。4.4 JESD89A 报告字段里最容易缺的是“屏蔽时间”一份可以拿去评审的软错误测试报告至少要有测试环境、辐照条件、器件条件、错误分类、统计结果五组字段。统计结果部分尤其要写清楚读回周期或 scrubbing 周期。系统级测试如果开了 ECC 校验和周期性 scrubbing实际暴露窗口是两次 scrubbing 之间的间隔而不是总测试时长。我在装报告模板时会专门加一列“暴露窗口”并附上测试代码里扫描周期的时间戳间隔。否则同一份错误计数有人拿总时长算有人拿有效暴露窗口算最后得到的 FIT 能差出好几倍。5. 投测后最容易翻车的四个 JESD89A 细节5.1 封装材料的 α 发射率别只信“低 α”三个字JESD89A 测试的是器件受到的软错误但它无法替你回答“封装材料到底放出多少 α 粒子”。如果样品来自整机拆解或者组装之后报告结论里必须注明封装材料来源。我一般会要求封装厂同时提供 α 发射率数据测量方法直接引用配套的 JEDEC JESD22-A116。如果对方只给出“低 α”或“符合标准”而没有具体数值就按常规塑封料的发射率做一次敏感性分析把最坏情况写进报告附注。5.2 用注入故障校准“检测窗口”软件测试循环的读回不是瞬时的。假设一个扫描周期需要 20 ms粒子在刚扫完某个地址后立刻翻转那这个错误要等到下一轮才能被发现。被业务系统覆盖改写后错误可能彻底消失最终计数会低于实际翻转数。校准做法是在 DUT 里人为注入已知数量的 bit 翻转让这些注入点随机分布在一个扫描周期内再统计能被测试程序发现的比例。这个比例就是检测覆盖率最终软错误事件数应该除以覆盖率。5.3 温度与电压漂移会让 FIT 曲线失真JESD89A 允许报告某个特定工作点下的 FIT但工程上为了节省时间很多人会连续跑十几个小时不监控温度和电压最后只留一个均值。对 SRAM 类节点来说温度升高时漏电流增加节点维持能力变弱电压下降则 Qcrit 减小。两个因素叠加足以掩盖真实软错误率变化。测量时我至少会在每组数据上打一个“温度范围 电压范围”标记而不是只写标称值。5.4 海拔修正系数要写进报告而不是留在现场解释地面宇宙中子注量随海拔上升显著增加。同一颗芯片在海平面测得一个 FIT在海拔 1500 米的地方可能变成 2 倍以上在 3000 米以上可能超过 5 倍。JESD89A 的报告模板里包含环境场景但很多人只填“城市地面”而不写海拔。我的习惯是额外给出三档修正系数1 km、2 km、4 km并且在每档后面附带对应的中子注量倍率。这样客户拿到的不是单一数字而是一条随环境变化的 SER 曲线。报告最后一页附上这个修正表评审时就不会再追问“你测的是哪里”。本文还有配套的精品资源点击获取
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进