AR# 47548

Zynq-7000 SoC、APU - 同じメモリ ロケーションへの読み出しアクセスの順序が変わってしまうことがある

説明

SMP 環境のプロセッサ動作で、ある読み出しアクセスが、同じメモリ ロケーションにアクセスする後続の読み出しにバイパスされてしまうことがあります。[Normal Memory Write-Back Shared] になっているメモリ領域への読み出しアクセスに対してのみ、この問題は発生します。

これはよく発生する問題ではなく、回避策が複数あります。

ソリューション

影響:

深刻な問題ではありません。回避策は複数あります。

回避策:

マルチプロセス コードのほとんどはこの問題が発生するような形式では書かれていません。したがって、この問題は、この読み出し順序に依存したコードのごく限られたエリアに影響するものと見られます。詳細は「回避策の詳細」セクションを参照してください。

対象となる構成:

プロセッサの 1 つまたは両方を使用するシステム

対象となるデバイス リビジョン:すべて修正予定はありません。(Xilinx Answer 47916) - 「Zynq-7000 SoC デバイス - シリコン リビジョン間の相違点」を参照してください。

 

ARM アーキテクチャおよび一貫性に関する一般的なルールでは、アクセス順序を監視するため、読み出しは同じメモリ ロケーションにアクセスする必要があります。一部の内部再生パス構造のため、プロセッサで、ある読み出しアクセスが同じメモリ ロケーションにアクセスする後続の読み出しにバイパスされることがあり、値がプログラム順序どおりではなくなってしまいます。

この問題は、SMP モードのプロセッサで [Normal Memory Write-Back Shared] と設定されているメモリ領域でのみ発生します。

回避策の詳細

  • 特定の読み出し順序が求められる揮発性のあるメモリ エリアで、標準 LDR ではなく LDREX 命令を使用します。
  • この厳しい順序ルールが必要な LDR の間に DMB 命令を挿入します。これは、ツール チェーン統合に推奨される回避策です。

DMB バリア命令なしのシーケンス

DMB バリア命令ありのシーケンス

結果、プロセッサ 2 で間違って Rx == <valueB> および Ry == <valueA> となることがある。

データ順序は保持される。

 

 

プロセッサ 1

プロセッサ 1

STR <valueA>, [loc]

STR <valueA>, [loc]

 

 

STR <valueB>, [loc]

STR <valueB>, [loc]

 

 

プロセッサ 2

プロセッサ 2

LDR Rx, [loc]

LDR Rx, [loc]

 

DMB

LDR Ry, [loc]

 

 

LDR Ry, [loc]

 

DMB

この問題は、LDREX、LDREXB、LDREXH および LDREXD を除く、すべてのタイプのメモリ ロード命令に影響します。

高位言語の場合、コンパイラにより最適化が行われるか、または同じメモリ ロケーションへの複数のアクセスの順序が再度決定されるので、揮発性として宣言されているメモリ ロケーションのみにこの問題が発生するものと考えられます。また、この問題の引き金となるコンディションを防ぐには、2 つのロード間にバリア操作を介入させることで十分であり、ロックフリーのプログラミング メソドロジのみが問題の影響を受けます。

注記: 標準メモリにアクセスしない限り LDREX の使用は予測がつきません。このため 2 番目のシーケンスは、メモリの揮発性オブジェクトにアクセスするための一般的な回避策としては使用することはできません。

アンサー レコード リファレンス

マスター アンサー レコード

Answer Number アンサータイトル 問題の発生したバージョン 修正バージョン
47916 Zynq-7000 SoC デバイス - シリコン リビジョン間の相違点 N/A N/A
AR# 47548
日付 06/13/2018
ステータス アクティブ
種類 デザイン アドバイザリ
デバイス