注意 : この日本語版文書は参考資料としてご利用ください 最新情報は必ずオリジナルの英語版をご参照願います PIC32MZ の L1 キャッシュの使い方 AN1600 本書は PIC32MZ デバイスファミリにおけるレベル 1 (L1) CPU キャッシュの実装に関する情報を提供します また キャッシュシステムに関連するリスクと それらへの対処法についても解説します さらに 熟練ユーザ向けに MPLAB Harmony 統合ソフトウェアフレームワークのキャッシュ管理ルーチンと microaptiv コアの専用命令を使ってキャッシュを管理する事で 性能の最適化を図る方法についても解説します Note: 本書には キャッシュのアーキテクチャまた実装に関する全般的な解説や キャッシュ管理に関する詳細な説明は記載していません それらに関しては microaptiv マイクロプロセッサコアのソフトウェアユーザマニュアル (www.imgtec.com から入手可能 ) を参照してください PIC32MZ アーキテクチャに関する知識があると 本書をよりよく理解できます 参考資料として PIC32 ファミリリファレンスマニュアル セクション 50. microaptiv コア採用デバイスの CPU (DS60001192) を推奨します この文書は www.microchip.com から入手できます 背景 CPU キャッシュは メインメモリのアクセス速度を補うために使う分離されたメモリブロックです レベル 1 キャッシュには CPU の動作速度と同じアクセス速度を持つメモリを使います このため レベル 1 キャッシュにアクセスする場合 CPU は命令またはデータを待機する必要はありません レベル 2 およびレベル 3 キャッシュはレベル 1 キャッシュと一緒に使われます これらのキャッシュのアクセス速度は CPU よりも低速ですが メインメモリよりは高速です PIC32MZ デバイスファミリでは L1 キャッシュだけを使います レベル 1 (L1) キャッシュは命令キャッシュとデータキャッシュに分割されます CPU は メモリに対して直接アクセスする事も キャッシュ経由でアクセスする事もできます PIC32MZ デバイスファミリから最高の性能を引き出すには キャッシュの使用が必須です メモリとキャッシュ間のアクセスは どちらの方向も 1 クロックサイクル内で発生します これに対し システムバス経由のアクセスは複数クロックサイクルを要します PIC32MZ アーキテクチャ以下では PIC32MZ アーキテクチャの動作とコンフィグレーションの鍵となる L1 キャッシュと 2 つのセグメントについて説明します フラッシュプリフェッチモジュールフラッシュプリフェッチモジュールは 128 ビットデータパス (32 ビット CPU バスの 4 倍のバス幅 ) を介してプログラムフラッシュメモリをフェッチする事によってフラッシュ待機ステートを隠蔽するために使います コードが分岐しない限り 次の命令は常にこのモジュールから得られます 分岐では 次のラインをロードする間にストールが発生します このモジュール内のレジスタは フラッシュ待機ステートを定義し プリフェッチ動作を有効にします プリフェッチモジュールの詳細については PIC32 ファミリリファレンスマニュアル セクション 41. L1 CPU キャッシュ搭載デバイス用プリフェッチモジュール (DS60001183) を参照してください メモリ管理ユニット (MMU) 全ての PIC32 アーキテクチャにおいて CPU は仮想アドレス空間を介してメモリと周辺モジュールにアクセスします 仮想アドレス空間は 5 つのセグメント (KSEG0 ~ KSEG3 と KUSEG) に分割されます 仮想 KSEG0 および KSEG1 アドレスは 物理アドレス空間の最初の 512 MB に配置されます ブートフラッシュ プログラムフラッシュ データメモリには KSEG0 と KSEG1 のどちらを介してもアクセスできます 特殊機能レジスタ (SFR) には KSEG1 を介してのみアクセスできます KSEG1 にはキャッシュは一切適用されません KSEG0 のキャッシュポリシーは設定可能です これは起動コード内のキャッシュ初期化中に設定します PIC32MZ アーキテクチャはTLB (Translation Look-aside Buffer) 方式のメモリ管理ユニット (MMU) を採用しています TLB は KUSEG/KSEG2/KSEG3 に対して仮想から物理へのアドレス変換を実行するよう設定できます これらのセグメントのキャッシュ適用属性は CPU コプロセッサ 0 (CP0) EntryLo0 および EntryLo1 レジスタを使ってTLBを設定する際に定義します コプロセッサ 0 レジスタの詳細については PIC32 ファミリリファレンスマニュアル セクション 50. microaptiv コア採用デバイスの CPU (DS60001192) を参照してください 2015 Microchip Technology Inc. DS00001600C_JP - p. 1
PIC32MZ の L1 キャッシュの使い方 L1 命令キャッシュ / データキャッシュ図 1 に示すように CPU はシステム RAM に対して直接またはキャッシュ経由でアクセスできます フラッシュメモリに対しても同様に 直接またはキャッシュ経由でアクセスできます DMA は常に RAM に直接アクセスします CPU - キャッシュ間を除く全てのアクセスにはシステムバスを使います リセット時は キャッシュ非適用アクセスを使って KSEG1 からコードを実行します このプロセスは 起動コードでキャッシュを初期化するまでキャッシュが使えないために必要です キャッシュが初期化された後は キャッシュを使って KSEG0 からコードを実行する事で 性能を最適化できます CPU が命令またはデータをキャッシュ適用メモリからフェッチすると システムは要求されたデータがキャッシュ内に存在するかどうか確認します 存在する場合 データはキャッシュから読み出され 性能上のペナルティは生じません これを キャッシュヒット と呼びます 要求されたデータがキャッシュ内に存在しない場合 ハードウェアは必要なデータをプログラムフラッシュメモリまたはデータ RAM からキャッシュにフィルします CPU は キャッシュへのフィルが完了するまで待機した後に データを読み出す必要があります これを キャッシュミス と呼びます キャッシュミスの場合 キャッシュフィルに要する時間に比例した性能ペナルティが生じます キャッシュのサイズは プログラムフラッシュまたはデータ RAM のサイズの整数分の 1 に固定されています PIC32MZ のキャッシュは 4 way セットアソシエティブ です これは キャッシュを同じサイズの 4 つの部分 (way) に分割し アドレスレンジ全域に配分する事を意味します 各 way は複数のキャッシュラインで構成されます キャッシュラインは キャッシュとフラッシュまたは RAM 間で転送可能な最小サイズのデータです 全てのメモリア位置は キャッシュ内のいずれか 1 つのセット位置にマップ ( 割り当て ) され そのセット内で 4 つの way の中の 1 つにマップできます つまり 各メモリ位置は キャッシュ内の 4 つの位置の中のどれかにマップできるという事です 各キャッシュラインは対応するタグを有し このタグはエントリのメモリ割り当て情報とステータスビットを格納します PIC32MZ のキャッシュは仮想インデックス / 物理タグ付き (VIPT) 方式を採用しており キャッシュラインタグはメモリ内のデータの物理アドレスを保持します ステータスビットは キャッシュライン内のデータが有効かどうかと ロックされているかどうかを示します また データキャッシュの場合にのみ dirty かどうかを示します キャッシュ動作の詳細は PIC32 ファミリリファレンスマニュアル セクション 50. microaptiv コア採用デバイスの CPU (DS60001192) を参照してください キャッシュミスが発生した時に そのメモリ位置に割り当てられているライン (4 way のどれも ) が利用できない場合 いずれか 1 つのラインを追い出す必要があります ハードウェアは 最長時間未使用 (LRU) アルゴリズムを使って 追い出すラインを選択します その名が示す通り 最後に使われてから最も長い時間使われていないキャッシュラインを追い出します 追い出しによってキャッシュ内のラインが開放され そのラインに新しいメモリ位置からのデータがフィルされます 以前に CPU が書き込んだデータがラインに格納されている場合 このデータを RAM へ書き戻した後に 新しいデータをラインにフィルします このプロセスを キャッシュライトバック と呼びます CPU が書き込んだキャッシュデータが RAM 内のデータと一致しない場合 ( この状態を dirty と呼ぶ ) キャッシュデータを置換する前にライトバックする必要があります CPU がメモリにアクセスする唯一のエンティティである場合 キャッシュはシステム動作に対して事実上透過的です PIC32MZ では DMA モジュールと DMA 対応周辺モジュールもメモリにアクセスします 既にキャッシュに転送済みのメモリ位置に対して DMA 書き込みが発生した場合 キャッシュの内容は RAM の内容と一致しなくなります この場合 キャッシュ内のデータの状態を stale と呼びます 同様に DMA モジュールへの転送のために CPU によって更新されたメモリ位置は dirty となるため DMA がそのデータをフェッチする前にメモリへ書き戻す必要があります DS00001600C_JP - p. 2 2015 Microchip Technology Inc.
AN1600 図 1: PIC32MZ のキャッシュ実装 ( 概略図 ) System Bus Flash Controller I-Cache Reads Instruction Cache I-Cache Fills Flash Flash Prefetch Buffer Uncached instruction and data reads MIPS32 Execution Core Uncached instruction and data reads Uncached writes and write throughs Write Buffer D-Cache Writes D-Cache Write Backs Data Cache RAM D-Cache Reads D-Cache Fills DMA Writes DMA and DMA Enabled Peripherals DMA Reads キャッシュコヒーレンシ キャッシュコヒーレンシ とは キャッシュ内のデータが対応する物理メモリの内容に同期しているかどうかを表します コヒーレンシを管理するには 同期が必要かどうかを判断し 必要な時にだけ同期維持動作を実行します キャッシュとメモリ間の同期は様々な状況で失われます そのような状況は CPU が別のバスマスタとメモリを共有している場合に発生します 以下では そのような状況について いくつかの例を挙げて説明します これらの状況では ソフトウェアによってコヒーレンシを管理する必要があります キャッシュコヒーレンシを無視すると しばしば予測も対処も困難な致命的問題が生じます 2015 Microchip Technology Inc. DS00001600C_JP - p. 3
PIC32MZ の L1 キャッシュの使い方 DMA とキャッシュコヒーレンシ DMA を使う場合 キャッシュコヒーレンシに配慮してシステムを設計する必要があります これには DMA モジュールと DMA 機能を内蔵した各種周辺モジュール ( フラッシュコントローラ等 ) が含まれます DMA を使う場合 以下の条件を確保する必要があります DMA モジュールがデータを必要とする時に CPU によって書き込まれたデータが RAM 内に存在する事 - DMA がメモリを読み出す時に キャッシュに書き込まれたデータが RAM にも書き込まれているとは限りません ( キャッシュは dirty かもしれません ) DMA によって更新されたメモリの内容を CPU が正しく読み出す事 - DMA によって RAM に書き込まれたデータがキャッシュにも格納されているとは限りません ( キャッシュは stale かもしれません ) フラッシュの更新とキャッシュコヒーレンシ PIC32MZ は実行時にフラッシュメモリを再プログラミングできます フラッシュを再プログラミングした場合 更新されたメモリ位置に対応するキャッシュラインは全て stale となります 更新されたフラッシュメモリ位置に CPU がアクセスする前に キャッシュを無効化する必要があります 更新されたフラッシュ領域の用途に応じて 適切なキャッシュを無効化する必要があります つまり フラッシュ領域がデータを格納している場合はデータキャッシュ (D キャッシュ ) を無効化し 実行可能コードを格納している場合は命令キャッシュ (I キャッシュ ) を無効化する必要があるという事です RAM からのコード実行とキャッシュコヒーレンシ RAM からコードを実行するには 最初に RAM にコードを書き込む必要があります RAM への書き込みは D キャッシュを介して発生し RAM からの実行は I キャッシュを介して発生します 命令が実行される前に 命令を格納した D キャッシュラインを RAM へ書き戻す必要があります その結果としてIキャッシュラインが stale となる場合 そのラインを無効化する必要があります キャッシュの実装キャッシュポリシー KSEG0 のキャッシュ適用性属性は CP0 コンフィグレーションレジスタ内の 3 つのビットを使って制御します これらの 3 ビットによって KSEG0 領域全体のキャッシュポリシーが決まります TLB を使って KUSEG KSEG2 KSEG3 のいずれかにマップしたメモリの場合 各メモリ領域のキャッシュポリシーは TLB コンフィグレーションレジスタ内で別々に指定できます 以下の 4 通りのキャッシュポリシーがサポートされます キャッシュせず キャッシュ可能 : 非コヒーレント / ライトバック / ライトアロケート有効 キャッシュ可能 : 非コヒーレント / ライトスルー / ライトアロケート無効 キャッシュ可能 : 非コヒーレント / ライトスルー / ライトアロケート有効 各キャッシュポリシーの詳細は以下の通りです キャッシュせず : キャッシュ非適用として指定したメモリ領域内のアドレスは キャッシュから読み出されません キャッシュ非適用メモリ領域への書き込みは キャッシュの内容を変更する事なく 直接メインメモリに書き込みます ライトバック / ライトアロケート有効 : ロードと命令フェッチは最初にキャッシュを検索し 目的とするデータがキャッシュ内に存在しなければ メインメモリを読み出します データストア動作では 最初にキャッシュを検索して ターゲットアドレスがキャッシュ内に存在するかどうか調べます 存在する場合 キャッシュの内容を更新しますが メインメモリには書き込みません ストアでキャッシュルックアップミスが発生すると メインメモリを読み出して そのラインをキャッシュ内へ移動し 新しいストアデータとマージします 従って キャッシュミス時のアロケーションポリシーは リードアロケートまたはライトアロケートです データストアは way 選択配列内の適切な dirty ビットを更新する事で そのラインに変更されたデータが格納されている事を示します dirty データを格納したラインがキャッシュから退出した時点で そのデータはメモリに書き戻されます ライトスルー / ライトアロケート無効 : ロードと命令フェッチは最初にキャッシュを検索し 目的とするデータがキャッシュ内に存在しなければ メインメモリを読み出します データストア動作では 最初にキャッシュを検索して ターゲットアドレスがキャッシュ内に存在するかどうかを調べます 存在する場合 キャッシュの内容を更新し メインメモリにも書き込みます ストアでキャッシュルックアップミスが発生すると メインメモリのみに書き込みます 従って キャッシュミス時のアロケーション方式は リードアロケートのみです ライトスルー / ライトアロケート有効 : ロードと命令フェッチは最初にキャッシュを検索し 目的とするデータがキャッシュ内に存在しなければ メインメモリを読み出します データストア動作では 最初にキャッシュを検索して ターゲットアドレスがキャッシュ内に存在するかどうかを調べます 存在する場合 キャッシュの内容を更新し メインメモリにも書き込みます ストアでキャッシュルックアップミスが発生すると メインメモリを読み出して そのラインをキャッシュ内へ移動し 新しいストアデータとマージします さらに ストアデータをメインメモリにも書き込みます 従って キャッシュミス時のアロケーションポリシーは リードアロケートまたはライトアロケートです 補遺 A: キャッシュポリシーとコヒーレンシ では MPLAB XIDE 上で仮想および物理メモリにデータを書き込む簡単なプログラムを使って 各キャッシュポリシーがキャッシュと物理メモリの内容に与える影響 ( キャッシュコヒーレンシ ) について説明します DS00001600C_JP - p. 4 2015 Microchip Technology Inc.
AN1600 各ポリシーの長所と短所表 1 に 各キャッシュポリシーの長所と短所を示します PIC32MZ ファミリの既定値キャッシュポリシー ( 開発ツールに同梱の起動コードが適用するポリシー ) は ライトバック / ライトアロケート有効 です KSEG0 ポリシーの変更に関しては MPLAB XC32 C/C++ Compiler User s Guide (DS51686) を参照してください 起動コードには キャッシュの初期化方法を示すソースコードも含まれます 表 1: キャッシュポリシーの比較 ポリシー 長所 短所 キャッシュせず キャッシュコヒーレンシ問題は発生しない 各メモリアクセスでは バス転送時間とメモリ待機ステートが生じるため 性能が大幅に悪化する ライトバック / ライトアロケート有効 ライトスルー / ライトアロケート無効 ライトスルー / ライトアロケート有効 最高の性能が得られる 全てのトランザクションでキャッシュを使い 必要時にのみメモリにアクセスする メモリは常に更新されるため 書き込み時のキャッシュコヒーレンシ問題は生じない メモリは常に更新されるため 書き込み時のキャッシュコヒーレンシ問題は生じない メモリへの書き込み時にキャッシュもフィルするため 書き込んだデータは直ちに CPU から読み出せる アプリケーションは メモリの読み出しと書き込みの両方向でコヒーレンシ問題に対処する必要がある 各 CPU 書き込みでバストランザクションが生じるため CPU によるメモリバス帯域幅の使用率が増加する 連続した書き込みでもメモリに書き込まれる CPU 読み出し時のキャッシュコヒーレンシ問題に対処する必要がある 各 CPU 書き込みでバストランザクションが生じるため CPU によるメモリバス帯域幅の使用率が増加する 連続した書き込みでもメモリに書き込まれる CPU 読み出し時のキャッシュコヒーレンシ問題に対処する必要がある メモリへの書き込み時にキャッシュもフィルするため 必要なデータをキャッシュから追い出してしまう可能性がある KSEG0 と KSEG1 MIPS コアでは 使用する仮想アドレスに応じて 物理メモリの最初の 512 MB をキャッシュ適用または非適用のどちらかに指定できます この 512 MB 領域は キャッシュ適用時に KSEG0 として参照され キャッシュ非適用時に KSEG1 として参照されます KSEG0 のアドレスレンジは 0x80000000 ~ 0x9FFFFFFF です KSEG1 のアドレスレンジは 0xA0000000 ~ 0xBFFFFFFF です 特殊機能レジスタは KSEG1 内にのみ存在する事を除けば KSEG0 と KSEG1 はどちらも同じ物理メモリを参照します KSEG0 を介するアクセスはキャッシュ適用可能ですが KSEG1 を介するアクセスはキャッシュ非適用です KSEG0 のキャッシュ適用性属性は CPU コプロセッサ 0 (CP0) コンフィグレーションレジスタを使って設定できます 既定値設定は ライトバック / ライトアロケート有効 です PIC32MZ の場合 リンカはデータセクションをキャッシュ適用 KSEG0 セグメントに割り当てます ( リンカスクリプトの指定に従う ) MPLAB 開発ツールは 実行時のヒープ割り当てとリンク時のデータ変数割り当てのための関数を提供します KSEG1 におけるリンク時コヒーレント割り当てには coherent 変数属性を使います 例 1 のコードは KSEG1 に割り当てる 1024 エレメントの符号なし整数配列を作成します 既定値のスタックはキャッシュ適用 KSEG0 領域に割り当てられるため キャッシュ非適用メモリの実行時割り当てはヒープから行う必要があります MPLAB 開発ツールは 実行時にキャッシュ非適用変数を作成するための関数として malloc と free に機能的に等価な 2 つの関数 (pic32_alloc_coherent と pic32_free_coherent) を提供します 例 2 に 1024 エレメントのキャラクタバッファを割り当て 使用後にこれをヒープに返す関数を示します 2015 Microchip Technology Inc. DS00001600C_JP - p. 5
PIC32MZ の L1 キャッシュの使い方 例 1: リンク時コヒーレント属性の使用 unsigned int attribute ((coherent)) buffer[1024]; 例 2: 実行時のコヒーレントメモリの割り当て / 解放 #include <xc.h> void myfunction(void) { char* buffer = pic32_alloc_coherent(1024); if (buffer) { /* do something */ } else { /* handle error */ } if (buffer) { pic32_free_coherent(buffer); } } 表 2: アドレス変換マクロ マクロ名 KVA_TO_PA(v) PA_TO_KVA0(pa) PA_TO_KVA1(pa) KVA0_TO_KVA1(v) KVA1_TO_KVA0(v) IS_KVA(v) IS_KVA0(v) IS_KVA1(v) IS_KVA01(v) 例 3 に KSEG1 から KSEG0 の位置に定義されている変数にアクセスする方法を示します 概要 カーネル (KSEG) 仮想アドレスを物理アドレスに変換します 物理アドレスを KSEG0 仮想アドレスに変換します 物理アドレスを KSEG1 仮想アドレスに変換します KSEG0 仮想アドレスを KSEG1 仮想アドレスに変換します KSEG1 仮想アドレスを KSEG0 仮想アドレスに変換します アドレスがカーネルセグメント仮想アドレスである場合に 1 と評価し それ以外の場合に 0 と評価します アドレスが KSEG0 仮想アドレスである場合に 1 と評価し それ以外の場合に 0 と評価します アドレスが KSEG1 仮想アドレスである場合に 1 と評価し それ以外の場合に 0 と評価します アドレスが KSEG0 または KSEG1 仮想アドレスである場合に 1 と評価し それ以外の場合に 0 と評価します 例 3: アドレス変換マクロのサンプルコード /* Declare a variable.by default it is defined in KSEG0 */ int Var1InKseg0 = 5; /* Declare a pointer to the same variable type and assign */ /* it the translated address using the address translation */ /* macro */ int *pvar1inkseg1 = KVA0_TO_KVA1(&Var1InKseg0); /* Assign x the value of the variable from the cache */ x = Var1InKseg0; /* Assign y the uncached value */ y = *pvar1inkseg1; DS00001600C_JP - p. 6 2015 Microchip Technology Inc.
AN1600 PIC32MZ のキャッシュ管理命令 Imagination Technologies Limited の MIPS コアは キャッシュを管理するための専用アセンブリ命令を備えています 各命令は単一キャッシュラインに対して動作します これらの命令の使い方と動作の詳細については Imagination Technologies Limited のウェブサイト (www.imgtec.com) を参照してください CACHE 命令 CACHE 命令は 主に起動時のキャッシュ初期化用に使います コヒーレンシを管理するために CACHE 命令は以下のように使えます キャッシュアドレスヒットで無効化 - 指定されたアドレスのキャッシュを検索し ヒットが発生するとキャッシュラインを無効化 ( 追い出し ) します キャッシュラインがdirtyであってもライトバックは実行しません キャッシュアドレスヒットでライトバック - 指定されたアドレスのキャッシュを検索し ヒットが発生してラインが dirty であれば キャッシュラインをメモリに書き込みます キャッシュのフィル - 指定されたアドレスからのデータを命令キャッシュ (I キャッシュ ) にフィルします データキャッシュ (D キャッシュ ) のフィルには PREF 命令を使います フェッチとロック - 指定されたアドレスからのデータを命令キャッシュまたはデータキャッシュにフィルし そのデータをキャッシュ内でロックします キャッシュ命令を使ってキャッシュを無効化するまで データはキャッシュ内でロックされます MPLAB Harmony のキャッシュ管理関数 MPLAB Harmony 統合ソフトウェアフレームワークは キャッシュ管理を容易にする各種の関数を備えています これらの関数は MIPS アセンブリ命令を使って アドレスの全域または一部領域でキャッシュ操作を実行します これらの関数はデバイス制御 (DEVCON) システムサービスライブラリに含まれています キャッシュの管理には これらの関数を使う事を推奨します これらの命令により 実行時に以下のキャッシュ操作を実行できます 初期化 フラッシュ ( キャッシュ全体 データまたは命令もしくはその両方 ) クリーン ( アドレスレンジ データまたは命令 ) 無効化 ( アドレスレンジ データまたは命令 ) ロック ( アドレスレンジ データまたは命令 ) 同期 KSEG0 ポリシーの設定または読み出しこれらの関数に関する詳細な説明と使い方を示すサンプルアプリケーションについては MPLAB Harmony の最新文書を参照してください PREF 命令プリフェッチ命令 (PREF) を使うと ソフトウェアで以下のキャッシュフィル動作を指定する事によって D キャッシュの性能を最適化できます 書き込み動作向けにキャッシュラインをフィルする - キャッシュラインを予約しますが メモリには最終的に新しいデータが書き込まれるため メモリからキャッシュへのフィルは実行しません 読み出し動作向けにキャッシュラインをフィルする - キャッシュラインを予約し メモリの内容をキャッシュにフィルします Streamed および Retained オプションを使う事で ストリームしたデータが保持データを追い出さないキャッシュ階層を指定できます ライトバックと無効化により キャッシュラインを解放し キャッシュラインが dirty であればメモリに書き戻す事ができます これは nudge とも呼びます SYNCI 命令 RAM から実行する場合 メモリを初期化する際に D キャッシュと I キャッシュの両方を使います SYNCI 命令は 実行コードを RAM にプログラミングする際に使います これにより 両方のキャッシュを同期させて 効果的な命令書き込みが行えます SYNCI 命令は 指定されたアドレスに対して D キャッシュのライトバックと I キャッシュの無効化を適用します これらの命令に関するマクロサポートについては MPLAB XC32 C/C++ Compiler User s Guide (DS51686) と関連する ReadMe ファイルを参照してください 2015 Microchip Technology Inc. DS00001600C_JP - p. 7
PIC32MZ の L1 キャッシュの使い方 キャッシュコヒーレンシ問題の対処法以下では キャッシュコヒーレンシ問題に対処するためのオプションについて説明します DMA DMA モジュールは常に物理メモリにアクセスし キャッシュを有効にする場合はキャッシュコヒーレンシ問題に対処する必要があります キャッシュポリシーの既定値は ライトバック / ライトアロケート有効 ですが ライトスルー / ライトアロケート有効 または ライトスルー / ライトアロケート無効 に変更できます DMA モジュールが使用するメモリにアクセスする場合 開発の初期段階では ライトバック / ライ トアロケート有効 キャッシュポリシー ( 既定値 ) を適用して KSEG1 を使う事を推奨します これは最も単純な方法でありながら ほとんどの場合に十分な性能が得られます プロジェクトをデバッグした後は DMA 共有メモリへのアクセスを KSEG1 経由に変更し CACHEおよびPREF 命令を使ってコヒーレンシを管理する事で 性能を向上させる事ができます 複数の DMA バスマスタを使うシステムでは ソフトウェアによるキャッシュ管理を必要な箇所にのみ適用 ( つまり 1 度に 1 つの DMA モジュールに対してのみ実装 ) する事で デバッグプロセスを簡素化できます 表 3 に DMA キャッシュコヒーレンシ管理オプションを示します 表 3: DMA キャッシュコヒーレンシ管理オプション 方法概要使用目的 ライトバック / ライトアロケート有効 ポリシー -DMA 共有メモリへのアクセスに KSEG1 を使用 ライトバック / ライトアロケート有効 ポリシー - DMA 共有メモリへのアクセスに KSEG0 を使用 - ソフトウェアによるコヒーレンシ管理 ライトスルー ポリシー - ソフトウェアによるコヒーレンシ管理 キャッシュポリシーは ライトバック / ライトアロケート有効 に設定しますが CPU はキャッシュ非適用 KSEG1 を使って全ての DMA 共有メモリを参照します これは最も単純なキャッシュ管理アプローチです キャッシュポリシーは ライトバック / ライトアロケート有効 に設定し CPU はキャッシュ適用 KSEG0 を使って DMA 共有メモリを参照します MPLAB Harmony 統合ソフトウェアフレームワークが提供するキャッシュ管理関数を使ってキャッシュコヒーレンシを管理します ( 必要に応じてキャッシュラインを無効化してデータをライトバック ) この方法では最高の性能が得られますが ソフトウェアでキャッシュを管理する必要があります キャッシュポリシーはライトスルーモードを使って設定します KSEG0 を使って DMA 共有メモリを参照でき 書き込み時にキャッシュコヒーレンシ問題は発生しません 読み出し時は CACHE または PREF 命令を使ってキャッシュコヒーレンシを管理するか 全ての読み出しに KSEG1 を使う必要があります ライトスルーポリシーでは キャッシュデータをライトバックする必要はありませんが システムバス帯域幅の使用量が増加します プロジェクトが動作できるようになるまでの初期段階では このアプローチを推奨します 最高の性能を達成する必要がある場合 このアプローチを使います 最高の性能を達成する必要がある場合 このアプローチを使います DS00001600C_JP - p. 8 2015 Microchip Technology Inc.
AN1600 フラッシュの更新フラッシュメモリの一部を不揮発性ストレージとして使う場合またはブートローダアプリケーションで使う場合 フラッシュの更新が発生する可能性があります フラッシュプログラミング 行プログラミングを行う場合 フラッシュコントローラは DMA を使って RAM の内容を読み出し 以下の方法でフラッシュメモリに書き込む事ができます キャッシュ非適用 KSEG1 を使って行データを初期化する キャッシュ適用 KSEG0 を使って行データを初期化し NVM 書き込み命令を実行する前に CACHE ライトバック命令または MPLAB Harmony キャッシュ管理ルーチンを使って キャッシュした内容を RAM に書き込む 不揮発性データストレージ 不揮発性データストレージフラッシュアプリケーションでは フラッシュの書き込みは必ずフラッシュコントローラを介して発生するため ライトバックに関する問題は生じません フラッシュメモリ位置が再プログラミングされると キャッシュされたラインは stale になります 以下のオプションが利用できます KSEG1 を介して不揮発性データストレージにアクセスする - これらのメモリ位置へのアクセスが頻繁に発生しないのであれば バス帯域幅を大きく消費しないため この方法を推奨します 任意のキャッシュポリシー ( キャッシュせず を除く ) を使って KSEG0 経由でアクセスする - 再プログラミングされたフラッシュメモリ位置に対応するキャッシュ位置を無効化する必要があります RAM からのコード実行後でコードとして実行する予定のデータを RAM に書き込む場合 I キャッシュと D キャッシュの両方が使われます この問題に対処するため SYNCI 命令が用意されています RAM に書き込んだ実行可能データを実行する前に SYNCI 命令を使って両方のキャッシュを同期させます 効率的なデータの配置キャッシュは データに空間的局所性を持たせた場合に最高の性能を発揮します 既に説明したように キャッシュとの間で双方向に転送可能な最小のデータサイズは 1 キャッシュラインです PIC32MZ の場合 キャッシュラインのサイズは 4 ワード (16 バイト ) です 複数ワードにまたがる静的データに関しては キャッシュラインの境界に配置するよう宣言する事で 性能を最適化できます これにより 4 ワードのデータ構造体が 2 つのキャッシュラインにまたがる ( すなわち 1 つのキャッシュラインに書き込むのに比べて 2 倍の時間がかかる ) 事を防ぎます 1 ワードの静的変数に関しては 一緒に使う物同士をキャッシュラインが最少数となるようにグループ化する事で 性能を向上させる事ができます これを行うための 1 つの方法は キャッシュラインの境界に配置した構造体の中でそれらの変数を宣言する事です まとめ PIC32MZ ファミリのデバイスを使って最高の性能を達成するには L1 CPU キャッシュを使う必要があります DMA を使う場合 コヒーレンシ問題を防ぐために キャッシュ管理に配慮してプロジェクトを設計する必要があります システムの要求性能に応じて 複雑さの異なる各種の方法でキャッシュコヒーレンシを管理する事ができます ブートロード 一般的に アプリケーションコードを更新するためのブートロードは頻繁には実行しませんが 大容量のフラッシュメモリにアクセスするため キャッシュ全体を使う可能性があります このため ブートロードしたコードを実行する前に I キャッシュ全体を無効化する事を推奨します 新しいコードの実行を開始する前にブートローダがリセットを実行する場合 起動コードがキャッシュを初期化するため 特別な操作は不要です しかし リセットが実行されない場合 新しいコードを実行する前にキャッシュを無効化する事を推奨します 2015 Microchip Technology Inc. DS00001600C_JP - p. 9
PIC32MZ の L1 キャッシュの使い方 補遺 A: キャッシュポリシーとコヒーレンシ 以下では MPLAB X IDE を使った 4 つの例を通して キャッシュコヒーレンシに対するキャッシュポリシーの影響を示します いずれの例でも KSEG0 と KSEG1 を介してデータメモリを変更します 例 1: データメモリへの キャッシュせず 書き込み 例 2: データメモリへの ライトバック / ライトアロケート有効 書き込み 例 3: データメモリへの ライトスルー / ライトアロケート有効 書き込み 例 4: データメモリへの ライトスルー / ライトアロケート無効 書き込み単純化のために これらの例は KSEG0 および KSEG1 ポインタを使ってSRAM 内の同一メモリ位置を参照します KSEG0 ポインタは CPU からのキャッシュ適用メモリアクセスに対応し KSEG1 ポインタはキャッシュ非適用メモリアクセスに対応します キャッシュは CPU による KSEG1 メモリアクセスを一切関知しません これは物理メモリへの DMA アクセスと同じです DS00001600C_JP - p. 10 2015 Microchip Technology Inc.
AN1600 A.1 例 1: データメモリへの キャッシュせず 書き込み キャッシュせず ポリシーの場合 同じメモリ位置に異なるデータを 2 回書き込みます 最初の書き込みでは KSEG0 ポインタを使い 2 回目の書き込みでは KSEG1 ポインタを使います その後 同じ KSEG0 および KSEG1 ポインタを使って そのメモリ位置の値を別々のグローバル変数に読み戻します この場合 どちらの変数も 2 回目に書き込んだ値を示すはずです ( 図 A-1 参照 ) 図 A-1: 2015 Microchip Technology Inc. DS00001600C_JP - p. 11
PIC32MZ の L1 キャッシュの使い方 そこで MPLAB X IDE を使って仮想メモリと物理メモリを調べると 図 A-2 と図 A-3 に示すように どちらも 2 回目に書き込んだ値を格納している事が分かります 図 A-2: 図 A-3: DS00001600C_JP - p. 12 2015 Microchip Technology Inc.
A.2 例 2: データメモリへの ライトバック / ライトアロケート有効 書き込み ライトバック / ライトアロケート有効 キャッシュポリシーの場合 CPU は KSEG0 アドレスを使う場合にキャッシュへ書き込みます そのラインを追い出さない限り データは SRAM へ書き戻されません KSEG1 アドレスを使う場合 CPU はキャッシュをバイパスして直接 SRAM に書き込みます 従って 最初に書き込んだデータはキャッシュ内に格納され 2 回目に書き込んだ値は SRAM 内に格納されているはずです ( 図 A-4 参照 ) 図 A-4: AN1600 2015 Microchip Technology Inc. DS00001600C_JP - p. 13
PIC32MZ の L1 キャッシュの使い方 そこで MPLAB X IDE の [Watch] ウィンドウ ( 図 A-5 図 A-6) で仮想メモリと物理メモリを調べると 同じメモリ位置に異なるデータが格納されている事が分かります つまり キャッシュがコヒーレントではないという事です キャッシュ内のデータを SRAM へ書き戻すまで このキャッシュラインは非コヒーレントのままです 図 A-5: 図 A-6: DS00001600C_JP - p. 14 2015 Microchip Technology Inc.
AN1600 図 A-7 ~ 図 A-9 に示すように KSEG0 書き込みを削除した場合 キャッシュには書き込まないため KSEG0 読み出しを実行するとデータは物理メモリからフェッチされ キャッシュはこの時点で更新されます ( リードアロケート ) 図 A-7: 2015 Microchip Technology Inc. DS00001600C_JP - p. 15
PIC32MZ の L1 キャッシュの使い方 図 A-8: 図 A-9: キャッシュせず 以外の全てのキャッシュポリシーでは キャッシュは常にリードアロケートする事に注意してください これはデバッグ時に重要な影響を及ぼします というのは デバッグエグゼクティブの実行または print/display へのデータ読み出しによってキャッシュのコヒーレント / 非コヒーレントに違いが生じる可能性があるからです DS00001600C_JP - p. 16 2015 Microchip Technology Inc.
A.3 例 3: データメモリへの ライトスルー / ライトアロケート有効 書き込み ライトスルー / ライトアロケート有効 ポリシーの動作は ライトバック / ライトアロケート有効 ポリシーと似ていますが キャッシュに書き込まれたデータは物理メモリにも書き込まれるという点で異なります これは KSEG1 書き込みを削除すると KSEG0 読み出しと KSEG1 読み出しがどちらも同じデータを返す事によって説明できます ( 図 A-10) 図 A-10: AN1600 2015 Microchip Technology Inc. DS00001600C_JP - p. 17
PIC32MZ の L1 キャッシュの使い方 図 A-11 に示すように 両方の書き込みを実行した場合は非コヒーレントです キャッシュは KSEG1 への書き込みを一切関知しないため 最初の書き込みがまだ有効であると見なします 図 A-11: DS00001600C_JP - p. 18 2015 Microchip Technology Inc.
A.4 例 4: データメモリへの ライトスルー / ライトアロケート無効 書き込み ライトスルー / ライトアロケート無効 とは 書き込み時に対応するラインが既にキャッシュ内に存在する場合にのみキャッシュを更新する事を意味します ラインがキャッシュ内に存在しない場合 データを物理メモリに直接書き込み キャッシュには書き込みません KSEG0 書き込みと KSEG1 書き込みを実行すると 最初の書き込みはキャッシュに書き込みません このため KSEG0 読み出しを実行すると KSEG1 読み出しと同じデータが返されます ( 図 A-12 参照 ) 図 A-12: AN1600 2015 Microchip Technology Inc. DS00001600C_JP - p. 19
PIC32MZ の L1 キャッシュの使い方 しかし 図 A-13 に示すように KSEG0 書き込みの前にダミー読み出しを実行すると リードアロケーションによって異なる結果が得られます 図 A-13: DS00001600C_JP - p. 20 2015 Microchip Technology Inc.
Microchip 社製デバイスのコード保護機能に関して次の点にご注意ください Microchip 社製品は 該当する Microchip 社データシートに記載の仕様を満たしています Microchip 社では 通常の条件ならびに仕様に従って使用した場合 Microchip 社製品のセキュリティレベルは 現在市場に流通している同種製品の中でも最も高度であると考えています しかし コード保護機能を解除するための不正かつ違法な方法が存在する事もまた事実です 弊社の理解ではこうした手法は Microchip 社データシートにある動作仕様書以外の方法で Microchip 社製品を使用する事になります このような行為は知的所有権の侵害に該当する可能性が非常に高いと言えます Microchip 社は コードの保全性に懸念を抱くお客様と連携し 対応策に取り組んでいきます Microchip 社を含む全ての半導体メーカーで 自社のコードのセキュリティを完全に保証できる企業はありません コード保護機能とは Microchip 社が製品を 解読不能 として保証するものではありません コード保護機能は常に進歩しています Microchip 社では 常に製品のコード保護機能の改善に取り組んでいます Microchip 社のコード保護機能の侵害は デジタルミレニアム著作権法に違反します そのような行為によってソフトウェアまたはその他の著 本書に記載されているデバイスアプリケーション等に関する情報は ユーザの便宜のためにのみ提供されているものであり 更新によって無効とされる事があります お客様のアプリケーションが仕様を満たす事を保証する責任は お客様にあります Microchip 社は 明示的 暗黙的 書面 口頭 法定のいずれであるかを問わず 本書に記載されている情報に関して 状態 品質 性能 商品性 特定目的への適合性をはじめとする いかなる類の表明も保証も行いません Microchip 社は 本書の情報およびその使用に起因する一切の責任を否認します Microchip 社の明示的な書面による承認なしに 生命維持装置あるいは生命安全用途に Microchip 社の製品を使用する事は全て購入者のリスクとし また購入者はこれによって発生したあらゆる損害 クレーム 訴訟 費用に関して Microchip 社は擁護され 免責され 損害をうけない事に同意するものとします 暗黙的あるいは明示的を問わず Microchip 社が知的財産権を保有しているライセンスは一切譲渡されません 商標 Microchip 社の名称と Microchip ロゴ dspic FlashFlex KEELOQ KEELOQ ロゴ MPLAB PIC PICmicro PICSTART PIC 32 ロゴ rfpic SST SST ロゴ SuperFlash UNI/O は 米国およびその他の国における Microchip Technology Incorporated の登録商標です FilterLab Hampshire HI-TECH C Linear Active Thermistor MTP SEEVAL Embedded Control Solutions Company は 米国における Microchip Technology Incorporated の登録商標です Silicon Storage Technology は その他の国における Microchip Technology Incorporated の登録商標です Analog-for-the-Digital Age Application Maestro BodyCom chipkit chipkit ロゴ CodeGuard dspicdem dspicdem.net dspicworks dsspeak ECAN ECONOMONITOR FanSense HI-TIDE In-Circuit Serial Programming ICSP Mindi MiWi MPASM MPF MPLAB 認証ロゴ MPLIB MPLINK mtouch Omniscient Code Generation PICC PICC-18 PICDEM PICDEM.net PICkit PICtail REAL ICE rflab Select Mode SQI Serial Quad I/O Total Endurance TSHARC UniWinDriver WiperLock ZENA Z-Scale は 米国およびその他の国における Microchip Technology Incorporated の登録商標です SQTP は 米国における Microchip Technology Incorporated のサービスマークです GestICとULPPは その他の国におけるMicrochip Technology Germany II GmbH & Co. & KG (Microchip Technology Incorporated の子会社 ) の登録商標です その他 本書に記載されている商標は各社に帰属します 2013, Microchip Technology Incorporated, Printed in the U.S.A., All Rights Reserved. ISBN: 978-1-63276-666-3 QUALITY MANAGEMENT SYSTEM CERTIFIED BY DNV == ISO/TS 16949 == Microchip 社では Chandler および Tempe ( アリゾナ州 ) Gresham ( オレゴン州 ) の本部 設計部およびウェハー製造工場そしてカリフォルニア州とインドのデザインセンターが ISO/TS-16949:2009 認証を取得しています Microchip 社の品質システムプロセスおよび手順は PIC MCU および dspic DSC KEELOQ コードホッピングデバイス シリアル EEPROM マイクロペリフェラル 不揮発性メモリ アナログ製品に採用されています さらに 開発システムの設計と製造に関する Microchip 社の品質システムは ISO 9001:2000 認証を取得しています 2015 Microchip Technology Inc. DS00001600C_JP - p. 21
各国の営業所とサービス 北米本社 2355 West Chandler Blvd. Chandler, AZ 85224-6199 Tel:480-792-7200 Fax:480-792-7277 技術サポート : http://www.microchip.com/ support URL: www.microchip.com アトランタ Duluth, GA Tel:678-957-9614 Fax:678-957-1455 オースティン (TX) Tel:512-257-3370 ボストン Westborough, MA Tel:774-760-0087 Fax:774-760-0088 シカゴ Itasca, IL Tel:630-285-0071 Fax:630-285-0075 クリーブランド Independence, OH Tel:216-447-0464 Fax:216-447-0643 ダラス Addison, TX Tel:972-818-7423 Fax:972-818-2924 デトロイト Novi, MI Tel:248-848-4000 ヒューストン (TX) Tel:281-894-5983 インディアナポリス Noblesville, IN Tel:317-773-8323 Fax:317-773-5453 ロサンゼルス Mission Viejo, CA Tel:949-462-9523 Fax:949-462-9608 ニューヨーク (NY) Tel:631-435-6000 サンノゼ (CA) Tel:408-735-9110 カナダ - トロント Tel:905-673-0699 Fax:905-673-6509 アジア / 太平洋アジア太平洋支社 Suites 3707-14, 37th Floor Tower 6, The Gateway Harbour City, Kowloon Hong Kong Tel:852-2943-5100 Fax:852-2401-3431 オーストラリア - シドニー Tel:61-2-9868-6733 Fax:61-2-9868-6755 中国 - 北京 Tel:86-10-8569-7000 Fax:86-10-8528-2104 中国 - 成都 Tel:86-28-8665-5511 Fax:86-28-8665-7889 中国 - 重慶 Tel:86-23-8980-9588 Fax:86-23-8980-9500 中国 - 東莞 Tel:86-769-8702-9880 中国 - 杭州 Tel:86-571-8792-8115 Fax:86-571-8792-8116 中国 - 香港 SAR Tel:852-2943-5100 Fax:852-2401-3431 中国 - 南京 Tel:86-25-8473-2460 Fax:86-25-8473-2470 中国 - 青島 Tel:86-532-8502-7355 Fax:86-532-8502-7205 中国 - 上海 Tel:86-21-5407-5533 Fax:86-21-5407-5066 中国 - 瀋陽 Tel:86-24-2334-2829 Fax:86-24-2334-2393 中国 - 深圳 Tel:86-755-8864-2200 Fax:86-755-8203-1760 中国 - 武漢 Tel:86-27-5980-5300 Fax:86-27-5980-5118 中国 - 西安 Tel:86-29-8833-7252 Fax:86-29-8833-7256 アジア / 太平洋中国 - 厦門 Tel:86-592-2388138 Fax:86-592-2388130 中国 - 珠海 Tel:86-756-3210040 Fax:86-756-3210049 インド - バンガロール Tel:91-80-3090-4444 Fax:91-80-3090-4123 インド - ニューデリー Tel:91-11-4160-8631 Fax:91-11-4160-8632 インド - プネ Tel:91-20-3019-1500 日本 - 大阪 Tel:81-6-6152-7160 Fax:81-6-6152-9310 日本 - 東京 Tel:81-3-6880-3770 Fax:81-3-6880-3771 韓国 - 大邱 Tel:82-53-744-4301 Fax:82-53-744-4302 韓国 - ソウル Tel:82-2-554-7200 Fax:82-2-558-5932 または 82-2-558-5934 マレーシア - クアラルンプール Tel:60-3-6201-9857 Fax:60-3-6201-9859 マレーシア - ペナン Tel:60-4-227-8870 Fax:60-4-227-4068 フィリピン - マニラ Tel:63-2-634-9065 Fax:63-2-634-9069 シンガポール Tel:65-6334-8870 Fax:65-6334-8850 台湾 - 新竹 Tel:886-3-5778-366 Fax:886-3-5770-955 台湾 - 高雄 Tel:886-7-213-7828 台湾 - 台北 Tel:886-2-2508-8600 Fax:886-2-2508-0102 タイ - バンコク Tel:66-2-694-1351 Fax:66-2-694-1350 ヨーロッパオーストリア - ヴェルス Tel:43-7242-2244-39 Fax:43-7242-2244-393 デンマーク - コペンハーゲン Tel:45-4450-2828 Fax:45-4485-2829 フランス - パリ Tel:33-1-69-53-63-20 Fax:33-1-69-30-90-79 ドイツ - デュッセルドルフ Tel:49-2129-3766400 ドイツ - ミュンヘン Tel:49-89-627-144-0 Fax:49-89-627-144-44 ドイツ - プフォルツハイム Tel:49-7231-424750 イタリア - ミラノ Tel:39-0331-742611 Fax:39-0331-466781 イタリア - ベニス Tel:39-049-7625286 オランダ - ドリューネン Tel:31-416-690399 Fax:31-416-690340 ポーランド - ワルシャワ Tel:48-22-3325737 スペイン - マドリッド Tel:34-91-708-08-90 Fax:34-91-708-08-91 スウェーデン - ストックホルム Tel:46-8-5090-4654 イギリス - ウォーキンガム Tel:44-118-921-5800 Fax:44-118-921-5820 01/27/15 DS00001600C_JP - p. 22 2015 Microchip Technology Inc.