AR# 47516

Zynq-7000 SoC, DDR - 控制器误处理 STREX 指令

描述

在某些高速缓存禁用的情况下,DDR 控制器不能正确地响应由 CPU 执行的独占存储 (STREX) 指令。

这可通过在启用高速缓存的可缓存内存空间内只执行 STREX 指令来避免。

解决方案

影响:轻微,系统锁定非常罕见。

解决方法:如果需要独占操作的主控器仅限于 ARM 内核,让需要独占操作的区域可以缓存并启用 L1 高速缓存,就可避免该问题。此外,如果其中一个主控器恰好在 PL 中,则可以在 PL 中实现独占监控器,并将从 ARM CPU 和架构主控器的访问路由至该监控器。

受影响的配置:向 DDR 内存控制器发出独占操作的系统。

受到影响的器件修订版:参考 (Xilinx 答复 47916) - Zynq-7000 设计咨询主答复记录。


在某些情况下,DDRC 在执行 STREX 指令时不产生适当的响应。以下独占操作序列展示了一个 STREX 指令处理不当的场景。

  • 主控器 0 通过 AEXOKAY 地址执行 EXCL RD(正确)
  • 主控器 1 通过 BEXOKAY 地址执行 EXCL RD(正确)
  • 主控器 1 通过 BEXOKAY 地址执行 EXCL WR(正确)
  • 主控器 1 通过 AEXOKAY 地址执行 EXCL RD(正确)
  • 主控器 0 通过 AOKAY 地址执行 EXCL WR(错误)
  • 主控器 1 通过 AEXOKAY 地址执行 EXCL WR(错误)
在这个序列中,主控器 0 从地址 A 执行独占读取 (LDREX)。在主控器 0 针对同一地址执行独占写入 (STREX) 以完成独占操作前,主控器 1 发出一个 LDREX/STREX 对并在地址 B 上完成独占操作,随后是从地址 A 完成 LDREX。在这种情况下,主控器 0 仍可通过针对地址 A 执行 STREX 在该地址上完成独占操作。但该操作不会重置主控器 1 的独占访问监控器。因此,来自主控器 1 的后续 STREX 指令将会收到一个错误的 EXOKAY 响应,这表明主控器 1 执行的写入操作是在没有完成的情况下完成的。

影响的详细信息:
这是一个罕见的问题,启用 L1 高速缓存时,在两个 ARM CPU 之间的最常见使用案例中并没有表现出来。但在一个禁用高速缓存的罕见场景下,独占访问可能会处理不当,主要取决于使用情况,它可能会造成锁死。

链接问答记录

主要问答记录

Answer Number 问答标题 问题版本 已解决问题的版本
53051 Zynq-7000 SoC - PS DDR Controller N/A N/A
AR# 47516
日期 06/13/2018
状态 Active
Type 设计咨询
器件