1. 细粒度TMR:从粗放到精准的容错演进
记得我第一次接触FPGA容错设计时,用的还是最基础的三模冗余(TMR)方法——直接把整个系统复制三份。结果一综合,资源占用直接飙到原来的300%以上,差点把项目预算吓跑。后来才知道,这种"粗粒度TMR"在单粒子效应频发的环境中其实很难真正发挥作用,因为一个高能粒子可能同时影响多个冗余模块。
细粒度TMR就像是从"大刀阔斧"变成了"精雕细琢"。它不是简单地把整个系统复制三份,而是在设计中的每个局部进行精细化的三重化和表决。我在实际项目中测试过,细粒度TMR的资源开销可以控制在150%-250%之间,比传统的300%+要友好太多了。
根据三模化的程度不同,细粒度TMR主要分为四种策略:局部TMR(LTMR)、分布式TMR(DTMR)、全局TMR(GTMR)和块TMR(BTMR)。每种策略都有其独特的适用场景和权衡点,接下来我会结合自己的实战经验,详细解析这四种策略的具体实现和选择要点。
2. 局部TMR(LTMR):最经济的入门选择
2.1 LTMR的核心原理
LTMR是细粒度TMR中最轻量级的方案,它只对设计中的触发器进行三重冗余,在输出端添加表决器进行表决。输入数据、控制信号和时钟都由冗余触发器共享,组合逻辑单元则保持不变。
我在一个低功耗航天项目中用过LTMR,当时资源紧张但又需要基本的容错能力。LTMR的资源开销只比原设计增加了约80%,确实是最经济的选择。但要注意的是,这种方案无法保护时钟信号、复位信号以及数据路径中的单粒子瞬态效应(SET)。
2.2 LTMR的实战注意事项
LTMR最大的风险在于潜在的SET效应。因为三个冗余的触发器共享同一个数据路径,数据路径上的任何一个SET都可能同时影响到三个冗余触发器,导致表决失败。我在早期项目中就踩过这个坑——当时以为LTMR已经足够,结果在辐射测试中出现了多次表决失败。
后来通过仿真分析发现,当SET脉冲宽度超过时钟周期的1/3时,就可能同时影响多个触发器。解决方法是在关键路径上插入延时单元,或者采用更保守的时序约束。这里有个实用的Verilog示例:
// LTMR触发器实现示例
module tmr_dff (
input clk,
input rst,
input d,
output q
);
// 三个冗余触发器
reg ff1, ff2, ff3;
always @(posedge clk or posedge rst) begin
if (rst) begin
ff1 <= 1'b0;
ff2 <= 1'b0;
ff3 <= 1'b0;
end else begin
ff1 <= d;
ff2 <= d;
ff3 <= d;
end

93

被折叠的 条评论
为什么被折叠?



