Verify通过还报错?拆一次CRC校验的实现机制就明白问题在哪 点击:4 | 回复:0



禾洛半导体

    
  • 精华:0帖
  • 求助:0帖
  • 帖子:4帖 | 0回
  • 年度积分:152
  • 历史总积分:202
  • 注册:2025年12月29日
发表于:2026-02-13 10:17:22
楼主

量产烧录线遇到一种故障,排查起来特别耗人:烧录器报告Verify校验通过,良率报表一片绿,结果芯片上板后不开机、功能异常,甚至干脆锁死再也连不上调试器。

更诡异的是,同样的程序文件、同样的烧录参数,时好时坏。产线工程师换插座、换烧录器、换芯片批次,折腾一圈,问题还在。

有人说这是“幽灵坏片”。其实不是。Verify通过还出问题,根子往往不在硬件,而在你对CRC校验的理解还停留在黑盒阶段。

一、你用的Verify是哪一种

很多人以为“校验”只有一种:烧录完读回来和源文件比对,一致就是OK。

实际上,量产烧录环境里的Verify分两种,机制完全不同。

第一种:数据记录比对(Verify by Data Record)

这是最传统的校验方式。烧录器把芯片内容读出来,和PC端下发的hex文件逐字节对比。这个逻辑看起来无懈可击,但它有一个致命缺陷:比对双方用的是同一份数据记录

什么意思?如果hex文件本身有误、或者烧录器在解析hex时发生位宽解析错误、或者地址映射理解偏差,那么烧录和校验会基于同一个错误的数据源进行。两个错误互相对比,结果当然“一致”,结论是“PASS”,但芯片里的东西根本就是错的。

第二种:CRC校验(CRC Test)

CRC校验不依赖外部数据文件。它的做法是:先找一片确认完好的芯片,执行一次“学习”(Learn)操作,把这片芯片的内容压缩成一个CRC特征值存下来。量产时,烧录器对每一颗芯片执行同样的CRC压缩算法,将结果与之前存下的特征值比对。

这种校验方式绕开了数据文件这个公共误差源。CRC校验通过,说明当前芯片的内容与“黄金样本”一致,而不是与某个可能本身就有问题的hex文件一致。

理解了这两个机制的区别,很多疑难杂症的排查方向就清晰了。

二、四个真实案例,四种CRC翻车现场

案例1:CRC计算结果对不上,问题出在芯片硬件bug

某款基于Cortex-M0+内核的MCU,采用I2C BSL方式烧录。开发一套烧录工具时,CRC算法完全参照官方BSL协议文档实现,本地计算结果与芯片返回的CRC始终对不上。

换了地址范围,换0x00填充、0xFF填充,结果依然不匹配。

折腾两周,芯片原厂应用支持回复:该芯片存在Cache bug,首次读取0x0~0x8地址时返回全0xFF。无论实际写入什么数据,第一次读一定是错的。CRC校验正好踩在这个坑里。

解决方案:要么避开这个地址范围做CRC,要么先做一次虚拟读。这不是算法问题,是硅片级缺陷。

案例2:Bit-reversal理解反了,CRC外设算出来总不对

某款MCU内置硬件CRC外设,开发者在参考手册指导下编写代码,却发现计算结果始终与手册示例不符。

反复核对寄存器配置,确认多项式、初始值、输出异或全部一致。最后发现,问题出在“位反转”(bit-reversal)的理解上。

手册里写着“输入数据位反转”,开发者理解为按位取反(bitwise NOT)。其实不是。Bit-reversal是把整个字节/半字/字的高低比特位顺序倒过来,解决的是大小端字节序的适配问题,与逻辑取反完全是两回事。

这个问题教科书不讲,但量产烧录时如果上位机与芯片的CRC配置不一致(比如一个用了位反转,一个没开),校验失败率能到100%。

案例3:CRC特征值是从错误芯片“学”来的

某FPGA方案,量产烧录时偶发CRC校验失败。换另一品牌Flash后故障消失。

查到最后发现:研发阶段用的“黄金样本”是从一块搭载A品牌Flash的开发板上“学”来的特征值,而量产用的是B品牌Flash。

两种Flash在空片状态、擦除状态下的读值行为存在细微差异——比如空片读回是0xFF还是0x00,擦除后读出电平稳定时间不同。这些差异不会影响正常功能,但足以让CRC压缩结果不同。

这不是CRC算法失效,是“黄金样本”选错了。

案例4:CRC校验通过,但芯片被锁死

某款车规级多核MCU,烧录过程中某段扇区CRC报错,随后调试器无法连接,调试软件提示DEVICE_LOCKED。

分析发现,UCB(用户配置块)区域被破坏了。芯片启动时读UCB,发现CRC校验失败,认为配置信息非法,主动锁死调试接口。

诡异的是,烧录器的Verify报告是“PASS”。为什么?

因为烧录器校验时只校验了代码区,根本没去读UCB区域。CRC覆盖范围没有对齐芯片的启动校验范围,烧录器说Pass,芯片上电自检说Fail。各自校验的内容完全不同,结论当然无法互通。

三、排查CRC类问题的工程清单

如果你在产线遇到Verify通过但功能异常,或者CRC mismatch间歇出现,按这个顺序查:

第一步:确认CRC的参考源

  • 是Data Record比对,还是CRC Test?

  • 如果是CRC Test,“黄金样本”芯片是否确认完全合格?

  • 黄金样本与量产芯片的Flash型号、工艺版本是否一致?

第二步:确认CRC算法配置完全一致

  • 多项式是CRC32、CRC16还是自定义?

  • 初始值是多少?输出是否异或?

  • 输入输出是否做了位反转?字节序是大端还是小端?

  • 这些参数在烧录器固件、上位机软件、芯片内部CRC外设三者之间必须完全对齐

第三步:确认CRC覆盖的内存范围

  • 芯片上电自检时会对哪些区域做CRC?

  • 烧录器Verify时覆盖的区域是否与之完全重叠?

  • 配置字、UCB、OTP区域是否被排除在校验范围之外?

第四步:确认有没有踩硬件坑

  • 芯片勘误表里有没有关于CRC、Flash读取、Cache的已知问题?

  • 首次访问特定地址是否有异常返回值?

四、一个建议

量产烧录的校验逻辑,建议做“双保险”:

CRC Test做主校验,确保芯片内容与经过充分验证的黄金样本一致。

Data Record Verify做辅校验,放在CRC之后随机抽样执行,用来发现烧录器固件版本错配、hex文件解析错误这类系统性风险。

两者分工明确,互不替代。

Verify通过不等于芯片能用。这句话不是玄学,是CRC校验机制在量产落地时必然存在的缝隙。把缝隙填上,那些“幽灵坏片”自然会现形。




热门招聘
相关主题

官方公众号

智造工程师