ARTICLE DETAIL

资讯详情

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

SRAM Compiler 的 SER 选项:软错误修复与 ECC 原理及工程实践

SRAM Compiler 的 SER 选项:软错误修复与 ECC 原理及工程实践 做芯片前端设计的同行应该都见过 SRAM compiler 那堆密密麻麻的 option。深度、宽度、column mux、单端口双端口这些一眼能看懂但真正让很多人犯嘀咕的是 Soft Error Repair (SER)。我第一次在配置单上看到这个选项时第一反应是记错了吧SRAM 这种静态存储器也能做“软错误修复”后来在车规项目里被可靠性指标逼着啃了一轮资料才把这块补上。这个疑问并不丢人。不同厂家的 SRAM compiler 对 SER 的叫法和行为并不完全一样有的是在阵列里加 ECC 逻辑有的是利用冗余行列做自动修复还有的是把两者打包成一个名字。做车规、通信、工业控制以及 AI 加速芯片的朋友如果不想在高可靠场景里被软错误坑上一把理解这个选项是绕不开的。顺便说一句网上直接搜 SER很大概率会看到搜索引擎、SEO 甚至 HTML 里 alt/title 之类完全不搭边的内容别被带偏芯片领域的 SER 和它们没什么关系。这篇文章就来把它讲清楚SER 到底修什么错、编译器给你生成的是什么、面积时序功耗要付出多少以及真正集成到 SoC 里有哪些坑。1. 先把 Soft Error 和 SER 的概念对齐1.1 位翻转是怎么发生的所谓 Soft Error中文经常叫软错误指的并不是电路本身坏了而是存储节点里的数据意外翻转。辐射粒子打到芯片上产生额外的电荷当这些电荷积累到一定程度就会把一个 SRAM 单元里锁存的数据从 0 变 1 或者从 1 变 0。粒子来源主要有两类一类是芯片封装材料和焊料里微量放射性元素衰变产生的 alpha 粒子另一类是中子中子是宇宙射线在大气层里不断产生的次级粒子海拔越高、数据中心放在高原或者航空电子设备上中子的影响就越明显。这里有一个关键概念叫临界电荷 Qcrit也就是让存储节点翻转所需要的最低电荷量。工艺越先进、工作电压越低、节点电容越小Qcrit 通常就越低粒子也就越容易把数据打翻。软错误和硬错误的本质区别在于硬错误是物理损伤比如金属线断掉、氧化层击穿修不好只能靠冗余替换软错误没有破坏任何物理结构重写数据之后一切恢复正常。所以文档里管它叫“soft”意思是暂时性、可恢复的。你可以把它想象成抽屉里的纸条被风吹乱位置换了但铅笔和纸都没坏。1.2 SER 和 redundancy 不是一回事很多工程师第一次接触 SER 时都会把“软错误修复”理解成“出错了就自动用备用行备用列顶上”这其实混淆了两条完全不同的技术路线。真正的软错误修复核心是“检测 纠错”也就是在数据旁边多存一些校验信息读取的时候发现错误并把它纠正回来。而用冗余行、冗余列去替换坏单元处理的是制造过程中产生的硬错误这类操作通常叫 Redundancy、Repair 或者 Hard Repair工作方式是在出厂测试阶段用 BIST 找到坏地址通过熔丝或者寄存器把访问重映射到备用的行列上。在 SRAM compiler 的选项列表里这两者经常出现在相邻的位置有些厂商还会做成一个复合选项比如“Soft Error Repair”其实同时包含了 ECC 和冗余修复。遇到这种情况你一定要翻开 IP 文档确认它到底做了什么。简单判断方法如果项目目标是应对 alpha 粒子、中子引起的随机位翻转那需要的是“运行期检测纠错”也就是通常说的 ECC 或奇偶校验如果目标是提升制造良率需要的是出厂阶段的“冗余替换”也就是 repair。两者可以共存但解决的问题不同别在评审会上混着说。2. SRAM compiler 的 SER 选项到底给了什么2.1 最常见的形态内置 ECC 逻辑现在大多数 SRAM compiler 里的 SER 选项实际落地形态是给宏内部加入 ECC 逻辑。数据写入的时候编译器生成的硬件会按算法计算校验位一起存进存储阵列数据读出来的时候硬件先做校验计算判断这一拍读出数据有没有发生位翻转如果只有 1 位错就地纠正后再把数据送到输出端。最常用的编码是 SECDED可以纠正 1 位错误并检测 2 位错误汉明距离是 4开销相对可控。这样做的好处非常明显对使用者来说这个 SRAM 的接口看起来和一个普通单端口 SRAM 差不多读操作返回的已经是纠错后的数据只是多了错误标志之类的辅助信号。编译器把编码器、解码器、错误纠正逻辑都封装在 macro 内部省掉了 SoC 层面手工搭 ECC 电路的麻烦。代价是读写路径变长、面积变大而且错误标志的处理必须挂在系统层否则纠错事件根本没法观测。之前有同事以为开了 SER 就万事大吉结果错误标志信号悬空没接跑到客户现场出了 transient error软件根本不知道排查了很久。2.2 配置项里可能出现的几种表达不同 SRAM compiler 的配置文件写法差异很大但意思大同小异。常见的关键字有 soft_error_repair、ecc、parity、secded、error_correcting_code有的甚至直接用 repair_mode 这种含糊的叫法。下面是一个比较典型的文本配置片段很多 compiler 支持从类似格式的文件里直接生成 memory instancesram_config { name u_sram_512x64; depth 512; width 64; column_mux 8; soft_error_repair enable; ecc_type secded; ecc_granularity 64; repair_latch_type none; }这里需要特别说明的是 ecc_granularity。它决定多少位数据共享一组校验位也就是 ECC 编码的最小字长。如果数据总线宽度是 64 位但编译器允许按 32 位分成两个 ECC 域那么每个 32 位域各带 6 个校验位总共 12 个校验位比 64 位整体编码的 7 个校验位多不少。看起来浪费但好处是单粒子事件如果同时打翻同一个 ECC 域里的两个相邻 bitSECDED 纠不过来的概率会变大域拆小一点破坏范围通常也小一点。实际选多大要看目标可靠性指标和面积预算的平衡。2.3 scrub 常常和 SER 一起出现还有一个绕不开的概念叫清洗 Scrubbing。ECC 能纠正在读的时候发现的错误但如果某个地址的数据位翻转后一直没人去读错误就安安静静地躺在那里。坏消息是存储单元放久了可能又有第二个粒子打中同一个 ECC 域等到系统终于访问这个地址时已经是 2 位错误SECDED 只能报错不能纠正数据就直接坏了。清洗的逻辑也很简单后台定期把整片 SRAM 读一遍发现 1 位错就用纠正后的正确数据重新写回去把潜在的错误“擦掉”。这个动作可以由硬件状态机做也可以由软件定期执行关键是周期要远小于两次错误之间的平均间隔这样才能把多比特错误率压下去。对应到 compiler 层面有些高级选项会直接生成内部 scrub 状态机有些则只提供 ECC 编解码清洗要靠 SoC 自己搭。对于系统里的 cache、寄存器堆这类高频访问存储每次读写本身就是一次机会自然清洗概率高但深度睡眠里保留数据的 SRAM如果不做 scrub几天甚至几小时后醒来可能已经攒下不可纠正错误。3. 打开 SER 之前把面积、时序、功耗的账算清楚3.1 校验位数量直接决定存储开销对数字后端工程师来说SER 选项不是免费的午餐第一笔账就是校验位带来的存储面积。以 SECDED 为例要满足纠 1 检 2 的汉明码约束校验位数量 k 需要满足2^k 大于等于数据位 m 加上校验位 k 再加 1。32 位数据需要 6 个校验位64 位需要 7 个128 位需要 8 个。直观一点看64 位数据的宏阵列存储位要多出 7/64 约 11%如果数据宽度只有 16 位校验位数是 5 个相对原始数据多了 31%。但这只是存储阵列的账。包含编码器、解码器、纠正逻辑和错误标志寄存器之后macro 总面积通常比不开 SER 时增加 20% 到 35% 左右。工艺越先进、数据宽度越窄逻辑部分的占比越高。所以上个项目有块 16 位宽的小 SRAM开 SER 后面积几乎翻倍最后只好改成 32 位打包方案把两个 16 位逻辑域合成一个 32 位 ECC 域才把开销压下来。做面积预算时千万别只按校验位的数量算一定要跑一版 compiler 的早期预估出来看后端每个 block 的面积余量都用得上这个数字。3.2 编解码逻辑给读写路径增加的延迟时序上的影响往往比面积更让人头疼。普通 SRAM 读操作地址译码之后数据直接上输出总线加上 SER 之后数据从存储阵列读出来还要经过 syndrome 计算、错误判断、逐位纠正才送到输出寄存器。这一串组合逻辑直接加在访问路径上访问时间明显变长。写操作相对好一点因为只需要根据写入数据生成校验位逻辑在数据通路上但也会影响建立时间。具体恶化多少看工艺和宏大小常见范围是访问路径变慢 5% 到 15%。如果设计频率卡得很紧最简单的办法是加一级流水线寄存器把 ECC 解码放到下一拍去做访问时间看起来恢复了但从地址到数据有效会多一个周期的 latency连带着总线协议、仲裁器、流水线都要适配。后端同事常常会问“这个宏能不能晚一拍出数”这个问题必须在配置阶段就想清楚而不是等到时序收敛时才发现。还有一点容易忽略带 SER 的宏在读数据的同时会多产生几个标志信号比如 uncorrectable_error、corrected_error这些信号从 macro 输出到 SoC 中断控制器的路径也要算进时序预算。3.3 后端集成中容易被低估的物理实现影响物理实现方面的坑比想象中多。首先是面积预估compiler 生成的带 ECC macro 往往比同容量普通 SRAM 大一圈布局规划阶段如果按老面积划 floorplan后面只能挤旁边的逻辑或者让数据绕路。其次是电源和功耗ECC 编解码逻辑是纯动态功耗每次读写都要翻转一大片逻辑如果这个 SRAM 是高频访问的共享缓存功耗增加可以到 20% 以上IR drop 分析时要把这部分 extra current 算进去。另外带 SER 的宏可能多出几个特殊 pin比如错误标志输出、测试模式下旁路 ECC 的控制输入、scrub 请求接口。后端在综合和 Floorplan 时如果没把这些 pin 的扇出和布线约束提前处理好很容易出现拥塞。低功耗设计里还要注意ECC 逻辑并不能在 retention 模式下维持纠错能力保留数据时如果关闭了 ECC 电源唤醒后原本的错误依然存在。我一直建议把 SER 相关的功耗分析和漏电分析单独做一张表不要只盯着 memory array 本身。4. 实际项目里配置 SER 的流程与踩坑记录4.1 配置前先确认 IP 版本和文档我见过最多的翻车现场不是选项没用对而是在错误的前提条件下用对了选项。SRAM compiler 的版本、Foundry 的 PDK、温度电压 corner都会影响 SER 相关功能的行为和时序。比如某个老版本支持 soft_error_repair secded但里面的 scrub 接口有 bug读改写时会把错误状态写坏升到新版本后才修复。所以开始配置之前先翻 release note确认你手里的 compiler 版本在这个工艺角、这个尺寸范围内支持 SER并且确认默认行为是什么。同时把 compiler 生成的 datasheet、lib、lef、verilog model 单独归档和普通 SRAM 区分开。因为带 SER 的宏在综合和后端工具里多出来的 pin、时序弧、test mode 接口很容易被统一的脚本漏掉。我们内部的做法是给每个带 SER 的 SRAM instance 加一个独立的 README记录配置参数、生成日期、compiler 版本、目标 FIT 指标这样后期出问题能回溯。4.2 初始化和复位策略是最容易翻车的地方假设你高高兴兴地开了 SECDED上电之后往 SRAM 里写数据然后读回来数据不对错误标志乱报第一反应是 IP 有 bug。先别急十个里面有八个是初始化没做对。带 ECC 的 SRAM校验位不会凭空正确上电那一刻存储阵列和校验阵列都是随机值数据位和校验位之间的汉明约束可能根本不匹配。这时候做第一次读操作ECC 逻辑会认为“这个地址里有 1 位错”自作主张地纠正出一个错误结果还对外报 corrected_error。解决办法必须固化到复位流程在系统允许正常访问这块 SRAM 之前先把所有地址完整地写一遍让数据位和校验位形成一致的合法码字。写什么值不重要全 0 或者全 1 都行关键是这个初始化循环不能跳过。对于某些保留在低功耗唤醒后不清零的 SRAM唤醒软件也要重新做一次校验一致性操作。如果 compiler 提供了初始化模式或者自动 scrubbing确认它是否会做全地址写入而不是只把数据清掉。4.3 MBIST 和错误注入验证模式要跟着改SRAM 规模上去之后生产测试基本都要跑 MBIST。普通 SRAM 的 MBIST 算法比如 March C在带 ECC 的宏上直接跑会有问题BIST 引擎写入的数据没经过正常 ECC 编码或者 ECC 逻辑把 BIST 的预期值“纠正”掉导致比对失败。所以 compiler 通常会提供一种 encode/compare 透传模式让 BIST 能够绕过或者适配 ECC。配置 SER 时必须把 test mode 相关 pin 一起规划进去并确认 MBIST controller 支持带 ECC 的 memory.验证阶段的错误注入也值得说。想验证“1 位翻转能被纠正”很多人直接在 RTL 里把某个数据 bit force 翻掉然后读出来发现数据还是对的就以为功能通过。这个结果其实是正确的ECC 确实把错误纠正了。但如果你的目的是验证“错误标志能不能报出来”得用更聪明的方式比如翻转某个数据 bit 同时绕过纠错逻辑观察原始 syndrome或者直接在存储阵列内部注入单 bit 翻转再观察整个链路。最容易被误解的还是“只翻转数据位”的情况数据位和校验位一起构成一个合法但不同的码字ECC 根本看不出错误仿真结果一片平静你以为没问题实际上你的测试向量压根没触发纠错逻辑。4.4 低功耗模式下的“隐形坑”现在很多 SoC 都有丰富的低功耗状态SRAM 可以保持供电以便快速唤醒也可以完全断电省漏电。SER 和这些状态紧密相关。如果 SRAM 在 sleep 状态下继续保持数据但 ECC 逻辑的时钟被关掉那么这段时间里发生的位翻转不会被发现、不会被修正等唤醒后访问时错误可能已经从 1 位发展成多位。如果 SRAM 直接断电唤醒后数据全丢那就必须重新初始化并确保初始化之后再开放访问否则又回到 4.2 的问题。还有一类更隐蔽的情况片内 retention 机制把 SRAM 内容搬到 retention latch再关掉宏电源。这个过程中如果数据被搬进 latch 后放了很久latch 本身也可能受粒子影响翻转唤醒写回时又产生坏码字。所以设计电源方案时不能认为“带了 SER 就有了免死金牌”要针对每个低功耗状态明确回答这个状态下数据是否需要保持如果需要谁负责 scrub唤醒后是否走初始化序列把这些答案写进功耗状态表功能验证才不会遗漏。5. 常见问题排查与选型参考5.1 仿真阶段最常见的几个异常仿真环境里带 SER 的宏最容易出现 X 态问题。RTL 模型里存储阵列没有初始化时输出是 XECC 逻辑对 X 做异或计算整个数据总线都是 X功能仿真一片红。处理方式不是盲目加 notifier 绕过去而是严格仿真上电初始化序列。你可以先单独跑一个小 test case只做全地址写初始化确认写完后读回数据稳定再开放后续访问。第二个常见问题是错误标志被黄金模型忽略。很多 SoC 验证环境里的参考模型只比对数据总线不比对 corrected_error、uncorrectable_error结果功能测试全通过但真正错误发生路径上的行为一点没验。建议在验证计划里明确错误标志必须接到可观测的中断或者寄存器并在断言里检查“有 1 位纠正事件时数据仍然正确”“有不可纠正错误时总线不能静默输出坏数据”。这样 SER 功能才算真正被验证了。第三个问题和时序仿真相关。带 ECC 的宏在时序模型里有更复杂的 timing arcs综合工具能识别但如果你在 testbench 里用理想延迟驱动验证环境可能完美错过建立时间违例。跑带 SDF 的后仿时要确保 ECC 编解码路径的时序约束不是随便过一下否则流片后可能只在某些电压温度下偶发出错这种问题最痛苦。5.2 软错误率评估要用系统视角做可靠性评估时不要只盯着 raw FIT 率。FIT 指的是每 10 亿设备小时内失效次数SRAM 厂商经常给出“每 Mbit 多少 FIT”的参考值。假设某块 SRAM raw FIT 20/Mbit容量 1Mbit那它平均每 10 亿小时会有 20 次软错误听上去很低。但一个 SoC 里可能集成几十 Mbit SRAM全 chip 的位翻转事件密度就会高很多。更重要的是加了 SECDED 之后单个 bit 翻转可以纠正真正致命的是不可纠正事件也就是同一个 ECC 域里出现 2 bit 及以上错误的概率。所以评估 SER 效果时要算系统级 UERUncorrectable Error Rate把 raw FIT、ECC 域大小、存储块容量、访问频率、scrub 周期全部放进去。还有一个很容易被低估的因素是故障注入率有些粒子事件不是打在单个 bit 上而是同时影响同一列上的多个 bit 或多个存储单元。SECDED 恰恰对这类多位事件很敏感。如果你项目的目标应用是铁路、医疗或者核电站控制那可能还需要更重的防护比如 TMR 或者块编码单纯靠 compiler 的 SECDED 不一定够。5.3 parity、SECDED、Scrubbing 怎么组合不同场景下选型的逻辑其实不复杂。如果数据坏了可以被系统容忍并重试比如 cache line 数据可以在别处重新加载那奇偶校验加中断处理就够了面积开销小很多。如果数据是不可重算的关键状态比如中断控制器里的配置寄存器、DMA 描述符、安全密钥存储应该用 SECDED并且要在错误不可纠正时触发安全机制比如锁存错误地址、请求系统复位而不是继续运行。Scrubbing 的加入与否取决于数据在 SRAM 里“待”多久。高频访问的紧耦合存储比如处理器寄存器堆每次访问都在动态刷新天然 scrub可以不加额外状态机深度 sleep 里保留数据的备份 SRAM就必须有显式 scrub 机制周期多长需要根据目标 FIT 和 ECC 域大小估算。一个常见经验是scrub 周期至少要比该容量下两次软错误的平均间隔短一个数量级以上这样多个错误在同一 ECC 域里累积的概率才足够低。5.4 一个容易被忽略的“文档/行为不一致”问题前面反复强调要读 datasheet是因为不同 compiler 对 SER 的命名和实现真的不一样。我遇过一个项目编译器选项名称叫 soft_error_repair同事以为开了 ECC跑完发现面积增加很多但读路径上根本没有纠错逻辑其实那个选项是“启动时用冗余行做软错误自动修复”也就是在加电阶段扫描坏单元并切换冗余路径运行期并没有 ECC。你说它错吧文档确实叫这个名字你说它对SOA 设计者根本没法用它来对抗粒子翻转。如何避免几个土办法第一生成宏之后直接看 compiler 输出的 datasheet里面会有 ECC 编解码模块名称、错误标志信号表第二做一次最短的 RTL 仿真主动翻转一个数据 bit确认输出端数据能恢复第三跟 FAE 或者编译器技术支持确认把“运行时 vs 出厂时”“软错误 vs 硬错误”这两个问题问死。网络上搜 SER 经常带出来一批完全无关的信息说明这个概念本身就容易被误读宁可多花半天验证也不要在设计评审后才发现选错了模式。6. 项目上沉淀下来的几点习惯踩过一轮 SER 的坑之后我养成了几个固定习惯。第一每个 project 里建一张 SER 配置表记录所有带 SER 的 SRAM instance、容量、位宽、ECC 域大小、错误标志接法、scrub 周期、初始化序列归属模块。这张表不光是给自己看更是为了系统验证和后端集成时大家有一个共同的事实基础。第二凡是带 SER 的宏验证计划里必须包含“主动错误注入 错误标志可观测”两条用例缺项就不允许 tape out。第三把初始化序列做成 SoC 上电代码里的一个标准模块和普通 SRAM 清零流程分开避免后续工程师把带 ECC 的宏当成普通 RAM 直接访问。最后再分享一个判断原则真正理解了 SER不是看你会不会开 compiler 选项而是能不能回答清楚“哪个阶段发生什么错误、由谁检测、由谁纠正、错误标志去哪里、不可纠正时系统怎么办”。把这五个问题写清楚SER 这个选项才算真正为你所用。
返回列表