跳转至

故障检测与处理

本章介绍 Cortex-M7 处理器的故障检测与处理特性。

1. 关于故障检测与处理

Cortex-M7 处理器的故障检测与处理特性:

  • 向系统报告任何检测到的错误。
  • 纠正任何检测到的且可纠正的错误。

当系统级芯片报告故障时,日志和状态必须提供识别故障源所需的全部信息。其目标是尽可能多地检测和纠正错误,并将它们标识给系统。

对于 RAM 上的 ECC(Error Correcting Code,纠错码),所有显式出现的错误都必须报告,以最小化错误传播。

1.1. RAM 与逻辑保护

处理器以两种不同的方式保护存储器和逻辑。

  • RAM 使用 ECC 保护。
  • 各处理器的逻辑通过带诊断比较的复制来保护。这在锁步(lock-step)实现中称为冗余逻辑(redundant logic)。

这两者是独立的,可以分别使用。

处理器使用 SEC-DED(Single Error Correction and Double Error Detection,单错纠正双错检测)ECC 来检测和纠正 RAM 中的错误。借助专用错误寄存器,有限数量的硬错误(即永久错误)可以被检测和纠正,同时保持正常运行。

1.2. 错误分析

处理器外部的监视器负责分析已通知的错误,并在证明该错误为软错误后将损坏的条目标记为可重用。此分析可以通过处理器 MBIST 接口直接读写 RAM 来完成。

2. 缓存 RAM 保护

以下小节描述 RAM 保护:

  • 保护方法。
  • RAM 保护摘要。
  • ECC 码。
  • RAM 配置。
  • 性能影响。

2.1. 保护方法

以下小节描述如何管理 RAM 错误:

  • 检测错误。
  • 从错误中恢复。
  • 处理永久错误。
  • 错误 bank 寄存器行为。

检测错误

Cortex-M7 处理器使用 ECC 检测缓存 RAM 中的错误。

从错误中恢复

Cortex-M7 处理器可以通过清理并无效化(clean and invalidate)与重试(retry)从缓存中检测到的 RAM 错误恢复。当检测到错误时,如表 14-1 所示,相应的索引/路(index/way)被清理并无效化。清理并无效化操作完成后,请求方重试其访问。ECC 还可用于纠正 RAM 中的单比特错误。

指令缓存

在指令缓存中,缓存行始终是干净的,因此无效化该行就足够了。重试的访问随后从外部存储器取回正确的值。

数据缓存

在数据缓存中,缓存行可能是脏的。RAM 内容的纠正作为缓存清理并无效化操作的一部分完成。这发生在写缓冲区中,纠正后的数据被写回外部存储器。重试的访问随后从外部存储器读取正确的值。如果数据无法纠正,则该错误不可恢复。

处理永久错误

永久错误按如下方式处理:

一般行为

如果 RAM 上出现硬错误(即永久错误),清理、无效化并重试方案可能导致死锁,访问会被持续重放。为防止这种情况,提供了错误 bank 寄存器来将故障位置屏蔽为不可用和无效。存储器系统的每一侧都有两个 bank。当检测到错误时,该位置被推入 bank,在读取和分配新缓存行时屏蔽该位置的相应有效位。因此,除非该条目被复位,否则该行不再被使用。由于实现细节,存在一小段时间该行仍被系统看到,但已从分配池中移除。

错误 bank 的深度决定了系统可以支持多少错误。达到此限制时,系统可能活锁(livelock)。处理器向系统提供指示损坏位置数量的信息,以便在错误 bank 变满之前监视其状态。这种情形可能导致潜在死锁。该信息通过若干引脚报告,用于指示错误 bank 的使用情况,即显示错误 bank 为空或至少遇到过一个错误。

错误 bank 寄存器行为

指令侧和数据侧使用相同的算法选择要更新的 bank:

  • 如果存在非有效、未锁定的 bank,则它总是优先于有效 bank 被分配。
  • 如果两个 bank 都有效,或都非有效,且两者都未锁定,则由每次分配时更新的轮转(round-robin)计数器选择要填充的 bank。
  • 如果有一个 bank 被锁定,则总是分配另一个 bank,无论它是否已经有效。
  • 如果两个 bank 都被锁定,则不进行分配。

2.2. RAM 保护摘要

表 14-1 显示不同类型的 RAM 如何受到保护。

RAM 类型 保护 可恢复错误 不可恢复错误 硬错误支持
数据 tag RAM SEC-DED ECC 错误表现为单比特错误 错误表现为多比特错误 最多两个硬错误
数据缓存数据 RAM SEC-DED ECC 错误表现为单比特错误 脏行上的错误表现为多比特错误
指令 tag RAM SEC-DED ECC tag 或 RAM 中存储的有效位上的任何错误(单比特或双比特) 无ᵃ
指令缓存数据 RAM SEC-DED ECC RAM 中存储的数据上的任何错误 无ᵃ

a. 指令缓存从不为脏,因此缓存 RAM 错误总是可以通过无效化缓存并重试指令来恢复。

2.3. ECC 码

当实现时,指令缓存和数据缓存具有:

  • 独立的 32 位 ECC 码,含七个校验位,分别用于:
  • 指令缓存 tag RAM,即 RAM 索引、tag 值、外部属性和有效位。
  • 数据缓存数据 RAM。
  • 数据缓存数据 tag RAM,即 RAM 索引、tag 值、外部属性、有效位和脏位。
  • 一个 64 位 ECC 码,含八个校验位,用于指令缓存数据 RAM。

2.4. RAM 配置

表 14-2 显示当处理器实现有 4KB 指令和数据缓存时,带或不带 ECC 的 RAM 配置。

RAM 不带 ECC 的 RAM 组存储 带 ECC 的 RAM 组存储
数据 tag RAM 4x26 位 4x(26+7) 位
数据数据 RAM 8x32 位 8x(32+7) 位
指令 tag RAM 4x22 位 4x(22+7) 位
指令数据 RAM 4x64 位 4x(64+8) 位

2.5. 性能影响

在无错误系统中,主要的性能影响是数据侧非完整存储(non-full stores)的读-改-写(read-modify-write)方案的成本。如果存储缓冲区槽未包含至少一个完整的 32 位字,它必须读取该字才能计算校验位。这可能发生,因为软件仅使用字节或半字存储指令写入内存区域。数据随后可以写入 RAM。这种额外的读取会对性能产生负面影响,因为它阻止该槽被用于另一次写入。

存储器系统的缓冲和未完成能力掩盖了部分额外读取,对于大多数代码而言可以忽略。然而,Arm 建议尽可能少使用可缓存的 STRB 和 STRH 指令,以降低性能影响。

注意: 由于 RAM 返回的数据上增加了 XOR 树,可能存在频率影响。

3. 逻辑保护

处理器逻辑可以通过一个重复的冗余处理器来保护,即第一个处理器的精确副本。两个处理器共享相同的受 ECC 保护的 RAM 和相同的输入引脚。第二个处理器延迟两个时钟周期,以便该冗余系统可以检测输入中的毛刺(glitch)。

两个处理器的输出在每个周期进行比较,以检测任何错误。第一个处理器的输出被延迟,以便与第二个处理器同步。该机制依赖于这样一个事实:处理器中发生的任何错误最终都会在处理器输出上可见,或者本身即为安全故障(safe failure)。

在一个处理器中检测到错误时,两个处理器在执行代码序列之前都会被复位,使它们处于相同的初始状态。然后它们可以从先前获取的快照重新开始执行。

处理器提供了用于比较两个处理器所需逻辑的模板。