4. 硬件冗余技术(下):TMR的粒度选择与优化

好,咱们接着聊TMR。上一节我们把三模冗余的基本原理讲透了,这一节重点说说粒度——说白了,就是你在哪个层次做三份拷贝。

我个人习惯把TMR的粒度分成三个层级:系统级、模块级、门级。每个层级各有各的脾气,选错了,功耗和面积直接爆炸。

4.1 TMR的粒度选择

4.1.1 系统级TMR

系统级TMR,就是把整个芯片复制三份。三个独立的芯片跑同样的程序,输出通过多数表决器决定。

  • 优点:设计最简单,几乎不需要修改原有逻辑
  • 缺点:面积和功耗直接翻三倍,而且三个芯片的同步是个大麻烦
  • 适用场景:对可靠性要求极高、对成本不敏感的系统,比如卫星上的主控计算机

我踩过的坑

我曾经在一个星载项目中用了系统级TMR,结果三个芯片的时钟相位差一直调不好。最后不得不在每个芯片入口加FIFO做同步,面积又多了10%。

4.1.2 模块级TMR

模块级TMR,是把芯片内部的关键模块复制三份。比如CPU里的ALU、寄存器堆、Cache控制器,每个都做成三份。

  • 优点:比系统级灵活,可以只保护关键路径
  • 缺点:模块间的接口需要做同步,设计复杂度上升
  • 适用场景:大部分航天级芯片的标配做法

嗯,这里要注意:模块级TMR的投票器位置很关键。我建议把投票器放在模块的输出端,而不是内部每个寄存器后面。否则面积会失控。

4.1.3 门级TMR

门级TMR,就是每个逻辑门都复制三份。这是最细粒度的冗余,也是面积开销最大的。

  • 优点:能检测并纠正任意单点故障
  • 缺点:面积翻三倍以上(因为还要加投票器),功耗也翻三倍
  • 适用场景:极少用,除非是那种一颗单粒子翻转就能要命的场景

警告:门级TMR的布线复杂度极高。三个副本之间的走线必须等长,否则时序会出问题。我曾经见过一个项目,门级TMR做完后时序收敛不了,最后不得不降频运行。

4.2 TMR的局限性

TMR不是万能的。你想想看,如果它完美无缺,那所有芯片都用TMR不就行了?

4.2.1 功耗问题

三倍冗余意味着三倍功耗。对于星载设备来说,功耗是硬约束。我见过一个项目,TMR做完后功耗超标40%,最后不得不降级成DMR(双模冗余)加检错。

4.2.2 面积问题

面积不只是三倍。投票器、同步逻辑、时钟树,这些都会额外增加面积。实际经验是:模块级TMR的面积大约是原来的3.2到3.5倍。

4.2.3 同步问题

这是最头疼的。三个副本的时钟必须严格对齐,否则投票器会输出错误结果。我习惯的做法是:

  1. 三个副本共用同一个时钟源
  2. 时钟树做平衡设计
  3. 在投票器前加一级同步寄存器

小技巧:如果三个副本的路径延迟差异较大,可以在每个副本输出端加一个可编程延迟链。这样可以在测试阶段手动调整对齐。

4.3 TMR的优化技术

既然TMR有这么多局限,那怎么优化呢?我常用的两个方法:局部TMR和选择性TMR。

4.3.1 局部TMR

局部TMR,就是只对芯片中容易出错的区域做三模冗余。比如:

  • SRAM单元(最容易发生单粒子翻转)
  • 状态机(一旦出错,系统行为不可预测)
  • 关键控制信号路径

其他不那么关键的区域,比如数据通路,可以用检错码(ECC)来保护。这样面积和功耗能省不少。

4.3.2 选择性TMR

选择性TMR更精细。它不是对整个模块做TMR,而是对模块内部的特定路径做TMR。比如:

  • 只对时序裕量不足的路径做TMR
  • 只对扇出较大的节点做TMR
  • 只对组合逻辑深度较大的路径做TMR

说白了,就是用EDA工具做故障注入分析,找出最脆弱的那些点,然后只保护它们。

我的经验:选择性TMR可以把面积开销控制在1.5倍以内,同时达到90%以上的故障覆盖率。性价比很高。

4.4 案例:基于TMR的FPGA抗辐照设计

最后,咱们看一个实际案例。我在一个低轨卫星项目中,用Xilinx的Kintex-7 FPGA做了一个抗辐照控制器。

设计思路是这样的:

  1. 把FPGA内部的关键状态机做成模块级TMR
  2. 把片上BRAM用ECC保护(而不是TMR,因为BRAM本身有纠错能力)
  3. 把配置存储器用TMR保护(FPGA的配置位一旦翻转,整个逻辑都会乱掉)
  4. 在FPGA外部加一个看门狗,检测三个副本是否同步

代码示例(Verilog,模块级TMR的投票器):

module voter #(
    parameter WIDTH = 8
)(
    input  [WIDTH-1:0] a, b, c,
    output [WIDTH-1:0] y
);

    // 三选二多数表决
    assign y = (a & b) | (b & c) | (a & c);

endmodule

这个投票器很简单,但很实用。注意:这里用的是组合逻辑,没有加寄存器。如果你需要流水线,可以在投票器前后各加一级寄存器。

避坑指南:投票器本身也可能被单粒子击中。所以投票器也要做三模冗余——三个投票器,每个的输出再送进一个投票器。嗯,听起来有点递归,但确实有必要。

实际测试结果:这个设计在轨运行了两年,没有发生过一次因单粒子翻转导致的系统故障。而同一颗卫星上另一个没有做TMR的FPGA,半年内就发生了三次故障。

所以,TMR虽然贵,但值这个价。

TMR粒度选择与优化决策树 TMR粒度选择 系统级TMR 模块级TMR 门级TMR 面积×3,功耗×3 同步问题最严重 面积×3.2~3.5 可选择性保护关键模块 面积×3.5以上 布线复杂,时序难收敛 优化技术 局部TMR 选择性TMR 只保护易出错区域 只保护脆弱路径

好了,这一节的内容就到这里。TMR的粒度选择,说白了就是面积、功耗、可靠性之间的权衡。没有最好的方案,只有最适合你项目的方案。

专注资料整理