故障模型与特征提取:故障模型建立与特征信号选择

各位同学,咱们今天聊聊故障模型和特征提取。说实话,这部分内容在SoC诊断里属于「地基」一样的存在。你想想看,如果连故障长什么样都描述不清楚,后面再怎么分析也是白搭。

我个人习惯把故障模型比作「犯罪画像」——你得先知道坏人的特征,才能在芯片里把他揪出来。好,咱们直接进入正题。

一、故障模型建立

故障模型不是凭空想出来的,它是从实际芯片失效的物理机制里抽象出来的。我在项目中遇到过不少次,芯片回来跑着跑着就挂了,一查,其实就是某个晶体管的栅氧化层击穿了。嗯,这就是典型的Stuck-at故障。

1. Stuck-at 故障模型

这是最经典的模型,说白了就是某个节点「卡死」在0或者1上。比如一个信号线本该在0和1之间跳变,结果它永远停在0V了,那就是Stuck-at-0。

核心要点:

  • 单固定故障(SSF):一次只考虑一个节点故障
  • 多固定故障(MSF):多个节点同时故障,但分析复杂度指数级上升
  • 覆盖率高:通常能覆盖90%以上的实际物理缺陷

我曾经吃过一次亏。有个项目,ATE测试全过了,结果客户那边上电就死机。查了三天,最后发现是某个寄存器的复位信号有Stuck-at-1故障。从那以后,我要求团队在仿真时一定要把Stuck-at覆盖率做到98%以上。

2. Transition 故障模型

这个模型关注的是信号跳变的速度。你想想看,一个信号从0变到1,如果花的时间太长,那后面的电路就可能采到错误的值。

Transition故障分两种:

  • 慢上升(Slow-to-Rise):0→1跳变太慢
  • 慢下降(Slow-to-Fall):1→0跳变太慢

我建议大家在处理高速接口时,一定要把Transition模型加上。比如DDR接口,数据速率动不动就几Gbps,一个Transition故障就能让整个系统崩溃。

避坑指南:我曾经在某个AI芯片项目中,只做了Stuck-at测试,结果流片回来发现PCIe链路死活训练不成功。后来一查,是某个TX端的Transition故障导致眼图闭合。所以,高频电路一定要做Transition测试。

3. Bridging 故障模型

Bridging故障,说白了就是两根不该连在一起的线短路了。在深亚微米工艺下,这种故障越来越常见。

常见的Bridging模型:

  • Wired-AND:两根线短路后,输出是两者的与逻辑
  • Wired-OR:两根线短路后,输出是两者的或逻辑
  • Dominant:其中一根线「主导」另一根

我记得有个项目,芯片在高温下老是随机出错。用Bridging模型一查,发现是两条相邻的地址线在金属层有桥接。温度一高,金属膨胀,就短路了。你说巧不巧?

二、特征信号选择

特征信号选得好,诊断效率翻倍。选得不好,那就是在垃圾堆里找金子。

我个人总结了几条原则:

  1. 可观测性优先:选那些能直接看到结果的信号,比如状态机输出、数据总线
  2. 覆盖率优先:一个信号能覆盖多个故障点,那它就是好信号
  3. 稳定性优先:别选那些毛刺多、抖动大的信号,否则你分不清是故障还是噪声

实际案例:我在做某款5G基带芯片时,选择了PLL的锁定指示信号作为特征信号。为什么?因为这个信号一旦异常,直接说明时钟系统有问题。一个信号就能定位到PLL模块,省了多少事。

三、特征提取方法

信号选好了,怎么把特征「提」出来?这里我主要讲两种:时域和频域。

1. 时域特征提取

时域分析最直观,说白了就是看波形。但光看波形不行,得提取出有意义的参数。

常用的时域特征:

特征名称 描述 典型应用
上升时间 信号从10%到90%的时间 Transition故障检测
下降时间 信号从90%到10%的时间 Transition故障检测
建立时间 数据在时钟沿前稳定的时间 时序故障检测
保持时间 数据在时钟沿后保持的时间 时序故障检测
脉冲宽度 信号高电平或低电平的持续时间 毛刺检测

我建议在提取时域特征时,多用边缘检测算法。比如用Sobel算子或者Canny算子来找信号的跳变沿。嗯,这里要注意,采样率一定要够高,至少是信号频率的5倍以上。

2. 频域特征提取

有些故障在时域里看不出来,但一转到频域就原形毕露。比如时钟抖动,时域里可能只是几个ps的偏差,但在频域里就是明显的相位噪声。

常用的频域特征:

  • 频谱峰值:看看有没有异常的频率分量
  • 谐波失真:THD值异常说明信号质量有问题
  • 相位噪声:时钟系统的健康指标
  • 功率谱密度:PSD曲线突变说明有故障

实战技巧:我曾经用FFT分析一个ADC的输出,发现频谱里有个不该有的尖峰。顺着这个尖峰查下去,发现是电源纹波耦合到了参考电压上。你看,频域分析有时候比时域更直接。

3. 混合域特征提取

说实话,现在做诊断很少只用一种方法。我习惯把时域和频域结合起来。

举个例子:

// 伪代码:时频域联合特征提取
void extract_features(signal_t *s) {
    // 时域特征
    float rise_time = get_rise_time(s);
    float fall_time = get_fall_time(s);
    
    // 频域特征
    float *fft_result = perform_fft(s);
    float peak_freq = find_peak(fft_result);
    float phase_noise = calc_phase_noise(fft_result);
    
    // 联合判断
    if (rise_time > THRESHOLD && peak_freq > 1e6) {
        printf("检测到Transition故障,疑似驱动能力不足\n");
    }
}

重要提醒:特征提取不是越多越好。特征太多会导致「维度灾难」,反而降低诊断效率。我一般控制在10-20个关键特征,再多就用PCA降维。

四、总结与实战建议

好了,咱们把今天的内容串一下:

  • 故障模型是基础:Stuck-at、Transition、Bridging,三种模型各有侧重
  • 特征信号要精挑细选:可观测、高覆盖、稳定
  • 特征提取要灵活:时域看波形,频域看频谱,混合域更全面

最后说一句,这些方法不是死的。我在实际项目中,经常根据芯片的具体情况调整模型和特征。比如低功耗芯片,我会特别关注漏电流相关的故障特征。你想想看,每个芯片都有自己的「脾气」,诊断方法也得跟着变。

下一章咱们聊故障注入与仿真验证,到时候我会带大家手撸一个故障注入脚本。今天就到这儿,有问题随时交流。