描述
Arm Cortex-R5F 处理器包含 1 个 4 输入存储缓冲器,用于对数据先进行缓冲、合并和转发,然后再使用 AXI 主接口将数据写入高速缓存或 L2 存储器系统。
由于此错误,存储缓冲器可能进入所有现有写入都无法继续执行的状态。此状态可能会导致下列问题:
受影响的配置:
如按下列任一序列发生下述状况,则会发生此错误:
序列 1:
1) 使用数据高速缓存 ECC 来实现处理器,并启用高速缓存 ECC。
2) 处理器访问存储器位置,但此操作在 L1 数据高速缓存中未命中,导致读取并分配缓存行。
3) 处理器对回写可缓存位置执行写入,此操作在步骤 [2] 中的行填充 (linefill) 之前命中,但在行填充之后未命中。此写入操作会在步骤 [2] 重新分配行之前的周期内执行其高速缓存查找操作。
4) 随后,处理器会对步骤 [3] 中写入的缓存行执行读取和写入。此读取和写入操作可按任意顺序执行。写入的双字不同于步骤 [3] 中写入的双字。
序列 2:
1) 使用数据高速缓存 ECC 来实现处理器,并启用高速缓存 ECC。
2) 处理器读取回写可缓存存储器位置,但此操作在 L1 数据高速缓存中未命中,导致读取并分配缓存行,但不检测任何 ECC 错误。
3) 处理器对步骤 [2] 中读取的缓存行执行写入。在高速缓存中查找地址时,由于标签 RAM (tag-RAM) 中存在 ECC 错误,因此结果显示命中。
4) 随后,处理器对步骤 [2] 中读取的缓存行执行进一步写入,但写入的双字不同于步骤 [3] 中写入的双字。
5) 后续推理缓存读取同样检测到 ECC 错误。此读取操作可对相同的高速缓存集执行,因此会检测到相同的错误,或者也可对不同高速缓存集执行读取,在此情况下则需要第二个 ECC 错误才能满足此条件。
此外,这两组条件都要求两次访问之间存在特定的时序关系,因此,受到 AXI 总线上的传输事务时序以及存储缓冲器中其它正在执行的写入操作的影响。
如果上述任一序列发生后,发生如下操作,则将不会发生死锁:
1) 读取操作在高速缓存中未命中,导致行填充,并且
2) 对步骤 [1] 中读取的缓存行执行 2 次或 2 次以上的读取操作。
2 次写入的双字必须不同,但其中一次写入的双字可与步骤 [1] 中读取的双字相同。单一存储指令可生成 2 次此类写入,前提是该指令未自然对齐。
如果发生此状况,则部分写入数据可能丢失。并且后续可能还会向高速缓存分配不可缓存 (Non-cacheable) 或器件 (Device) 写入请求。
注:以上所有数值交叉引用均表示参考列表中的项。
解决方案
影响:
如果发生此错误,处理器将发生死锁或数据丢失。发生死锁时,处理器可生成中断,但最终在处理程序代码中将发生数据丢失或死锁。
根据大量现场器件的经验证明,此错误被分类为罕见。此问题仅在一个工程上出现过,其故障时间不仅长而且易变。
变通方法:
您可通过将 ACTLR.DBWR(位 [14])设置为 1 来避免此错误。对于向标准存储器多次突发写入数据的行为,此设置会禁用其内部传输最优化操作。
此外,此设置还会禁用直写和不可缓存的标准存储器(但不包括回写存储器)的处理器生成的 AXI 突发。
将该位设置为 1 可能降低处理器写入标准存储器的性能。在基准测试中,平均性能降低比例小于 1%,但执行大型块写入的例程(例如,memset 或 memcpy)时影响显著增大。
此变通方法对于 memset 和 memcpy 的影响与 L2 存储器系统的性能和特性以及所使用的指令序列密切相关。
如果您的应用允许,您也可以通过禁用高速缓存 ECC 来避免此错误。禁用方法为将 ACTLR.CEC(位 [5:3])设置为 b100。
此变通方法不会降低处理器性能,但禁用 ECC 会影响可靠性。
受影响的配置:
所有 Versal 器件。
解决方案:
请参阅此第三方勘误表 (Arm, Inc. 780125)。不对该问题进行修复。