ZHCZ054A December 2024 – October 2025 AWR2544
单条 MFENCE 指令问题
AWR2544
MFENCE 指令用于暂停指令取指流水线,直至所有 CPU 触发的内存事务完成。
在极特殊情况下,MFENCE 可能允许其后续事务在前面的 STORE 操作完成前执行。
例如,
STORE_A
MFENCE
TRANSACTION_B
MFENCE 的实现机制是:暂停 CPU 直至内存系统确认无“进行中”事务,即处于空闲状态。这可防止 CPU 在 STORE_A 完成之前执行 TRANSACTION_B。存在一个很小的窗口期:当 STORE_A 从 L1D 移至 L2 且内存系统处于空闲状态时,内存系统可能过早声明自身为空闲状态。如果 TRANSACTION_B 必须严格在 STORE_A 之后执行,这可能导致程序行为异常。例如:假设 STORE_A 向 DDR3 写入数据,而 TRANSACTION_B 触发 EDMA 读取 STORE_A 写入的地址。MFENCE 应确保 STORE_A 在 EDMA 执行前提交,以便 EDMA 读取更新后的值。由于本公告所述问题,TRANSACTION_B 可能在 STORE_A 提交前触发 EDMA,导致 EDMA 读取到陈旧数据。
将单条 MFENCE 指令替换为连续两条 MFENCE 指令。当 STORE_A 从 L1D 传至 L2 时,如果内存系统过早指示空闲,此方案可通过恢复暂停状态来解决该问题。
关于一致性操作的说明:对于以下公告,除已列出的权变措施外,也可使用双 MFENCE 作为权变措施:
请注意,上述第二条公告不涵盖 L1D 和 L2 的块及全局写回操作。如果 L1D 和 L2 的块及全局写回操作后紧跟 MFENCE 和依赖于写回完成的事务,则应使用双 MFENCE 权变措施。
另请注意,当前版本的 MCSDK 软件包未包含此权变措施。该方案将在未来版本中提供