キャッシュ(前編)

キャッシュとは

キャッシュの概要

前述したように、Cortex-M7にはハーバードキャッシュ(命令キャッシュとデータキャッシュ)を搭載しています。キャッシュのサイズは、マイコンベンダーのオプションになっていて、命令キャッシュとデータキャッシュで各々4KB~64KBを選ぶことができます。搭載しない(サイズ0KB)も選択できますが、おそらくそのようなベンダーはいないでしょう。

キャッシュはAXIMに付随している構成になっていますので、TCM経由の命令とデータは、扱うことができません。もし、TCMでキャッシュを搭載したい場合は、マイコンベンダーが独自のアーキテクチャで組み込む必要があります。

コアに搭載していますのでL1(1次)キャッシュと呼ばれています。もし、L2(2次)キャッシュを搭載したい場合は、ARM CoreLink L2C-310レベル2キャッシュコントローラの仕様に準拠して、マイコンベンダーが独自に組み込んでAXIインターフェースに接続すれば、AXIMが制御することができます。マイコンベンダーが独自のL2キャッシュを共有メモリ上にインプリメントすることも可能ですが、いずれにしろL1キャッシュとの一貫性はサポートされていません。

命令キャッシュは2-ウェイセットアソシアティブ、データキャッシュは4-ウェイセットアソシアティブ構造です。n-ウェイセットアソシアティブとは、キャッシュ内のラインを選択する方式の一つです。構成の詳細は、各々のキャッシュの章で述べます。どちらのキャッシュも、ECCをベンダーオプションで選択することが可能です。オプションを選択していない製品もありますので、製品のマニュアルを参照してください。

ユーザーがキャッシュを容易にメンテできるように複数のレジスタが準備されています。これらのレジスタを操作することにより、キャッシュの有効化/無効化、クリーン化が簡単にできるようになっています。サポートしている属性は「ライトスルー、書き込み割り当てなし」、「ライトバック、書き込み割り当てなし」、「ライトバック、書き込み割り当てあり」です。各々の説明は、豆知識5をご参照ください。

補足

話がすこしそれますが、冒頭でTCM用のキャッシュの話をしました。実際にCortex-M7を搭載した製品でTCMにキャッシュを搭載しているマイコンがあります。TCMにはITCMとDTCMがあるので、それぞれに命令キャッシュ、データキャッシュを組み込む必要があるように思えますが、アクセスが遅いメモリはFlashメモリで、DTCMに接続されるメモリは読み出し速度の速いSRAMという前提なので、DTCMにはキャッシュは不要です。

では、Flashに搭載されてITCMでアクセスされる領域におかれたデータはアクセスが遅くなるかというと、そんなことはありません。ITCM上に命令キャッシュ、データキャッシュを統合したキャッシュを搭載して、ITCMからデータを取り出すことができます。逆に、DTCMのSRAMに命令を置いても、ウエイトサイクル無しで、問題なく実行できます。

キャッシュのまとめ

  • ●最適性能を出すためのハーバードアーキテクチャ
  • ●命令およびデータ共に個別に設定可能なサイズ(各々4KB – 64KB)(これはマイコンベンダーに対するオプション。搭載サイズは、マイコン製品のマニュアルに明記されている。)
  • ●キャッシュはAXIM領域のみ(TCMやAHBPには対応していない)
  • ●命令キャッシュは2-ウェイセットアソシアティブ、データキャッシュは4-ウェイセットアソシアティブ
  • ●ARMv7E-Mシステムアーキテクチャに必要な拡張機能付
    • ・キャッシュメンテナンス操作の追加:キャッシュメンテナンスの為のレジスタ
    • ・システムソフトウェアはキャッシュを装備することにより影響を受ける
  • ●次の属性をフルサポート
    • ・ライトスルー、書き込み割り当てなし
    • ・ライトバック、書き込み割り当てなし
    • ・ライトバック、書き込み割り当てあり
  • ●ハードウエアの一貫性のサポートなし
    • ・共有メモリ上にL2キャッシュをインプリメントする場合、L1との一貫性はサポートされない
  • ●ECCはオプション(すべてのキャッシュECCは内部で処理される)

キャッシュの特徴

概要

キャッシュの歴史は古く、ARMができる前から色々なアーキテクチャが考えられてきました。私の持っているマイコンのアーキテクチャに関する本(昭和57年版)にも色々な方式が説明されています。ポイントは、キャッシュのヒット/ミスの判別方式と、ヒットした場合のデータ検索方法です。ヒットした場合、キャッシュ内のどこにヒットしたデータがあるかを、すばやく検索しなくてはなりませ。ヒットしてからデータを探し出すまでの一連のプロセスが1サイクルで実行されなければ、キャッシュの意味がありません。

最近の方式の代表的なものは3つあります。本記事はマイコンのアーキテクチャの説明ではないので、詳しくは説明しませんが、データ検索方法から次のようなものが挙げられます。

●ダイレクトマップ方式(Direct Mapped)

アドレスに対し、一つのラインを特定する方式です。特徴は内部構造が簡単に作れるということです。

●セットアソシアティブ方式(Set Associative)

ダイレクトマップ方式をいくつか並べたものです。n個並べたものをnウエイセットアソシアティブ方式と呼びます。n個のタグにより、ダイレクトマップ方式よりもヒット率を上げることができます。nの数が大きいほどヒット率は上がりますが、回路規模とのトレードオフになるので、各製品で最適なnが選択されます。

●フルアソシアティブ方式(Fully Associative)

アドレスと全てのラインを比較する方式です。ライン数が同じならば、他の方式よりもヒット率が高くなりますが、内部の回路が大きくなる欠点があります。

Cortex-M7のキャッシュ

命令キャッシュは、2-ウェイセットアソシアティブ方式が採用されています。この方式は、回路規模が比較的小さくできて、性能は4-ウェイセットアソシアティブと比較しても、そんなに劣りません。

データキャッシュは、4-ウェイセットアソシアティブ方式です。デュアルポートメモリの使用無しで、ロードのデュアルIssueのサポートを行います。32エントリー4ウェイセットアソシアティブ構造になっており、主要なキャッシュヒットおよび新しい割り当てにおいてアップデートされます。

どちらのキャッシュもECCをサポートしていますが、オプションですのでサポートしているかどうかは、製品のマニュアルをご確認ください。

命令キャッシュ 2-ウェイセットアソシアティブ

概要

Cortex-M7の命令キャッシュは2-ウェイセットアソシアティブの構成ですので下図のような構成になります。この例は16KBキャッシュです。1ラインは32バイトですので、2ウェイx256ラインx32バイト=16KBとなります。2-ウェイなので、タグの比較器が2個あって、アドレスのタグ部をデコードして、決まったタグ部出力を同時に比較して、合致するアドレスがあればヒットしたことになります。

図1

キャッシュRAM

Cortex-M7のマニュアルには「キャッシュ」と「キャッシュRAM」の2つの単語が混在して使われています。「キャッシュ」はキャッシュ全体、「キャッシュRAM」はキャッシュの中のRAM部分のことを指します。キャッシュの内部構造の説明の際には「キャッシュRAM」が使われています。

キャッシュRAMは、タグ部とデータ部で構成されています。タグ部はECCが無い場合、4x22ビットで、ECC付きの場合はECCの7ビット分が増えて、4x(22+7)ビットとなります。データ部はECCが無い場合、4x64ビットで、ECC付きの場合はECCの8ビット分が増えて、4x(64+8)ビットとなります。

タグ部とデータ部をあわせてセットと呼んでいます。上図の場合256セットの、2-ウェイということになります。タグ部に含まれるのは、タグ(tag)とインデックス(Index)とタグ値(tag value)と属性(outer attributes)と有効ビット(Valid bit)です(上図では有効ビットのみ記載)。データ部はその名の通りデータです。

命令キャッシュRAMのセット構成
RAM ECC無 ECC有
タグ部 4x22ビット 4x(22+7)ビット
データ部 4x64ビット 4x(64+8)ビット

エラーのリカバー

Cortex-M7プロセッサは、キャッシュ内のRAMにエラーを検出すると、クリーン→無効化→リトライを行うことによってリカバーすることができます。クリーンと無効化操作が完了後に、リトライアクセスを行います。

命令キャッシュでは、常にラインがクリーン(メインメモリとキャッシュのデータが一致している)なので、ラインを無効化するだけです。リトライアクセスにより正しい値を外部メモリから取りこみます。一方、オプションでECCを付けることができます。これは、単一ビットのエラー訂正のために用いられます。ECCの詳細はECCの章で述べます。

データキャッシュ 4-ウェイセットアソシアティブ

概要

Cortex-M7のデータキャッシュは4-ウェイセットアソシアティブの構成ですので下図のような構成になります。この例は8KBキャッシュです。1ラインは32バイトですので、4ウェイx64ラインx32バイト=16KBとなります。4-ウェイなので、タグの比較器が4個あって、アドレスのタグ部をデコードして決まったタグ部出力を同時に比較して、合致するアドレスがあればヒットしたことになります。

図2

キャッシュRAM

データキャッシュのキャッシュRAMも、タグ部とデータ部で構成されています。タグ部はECCが無い場合、4x26ビットで、ECC付きの場合はECCの7ビット分が増えて、4x(26+7)ビットとなります。データ部はECCが無い場合、8x32ビットで、ECC付きの場合はECCの7ビット分が増えて、8x(32+7)ビットとなります。タグ部に含まれるのは、タグ(tag)とインデックス(Index)とタグ値(tag value)と属性(outer attributes、上図ではCで記述)と有効ビット(Valid bit)とダーティビット(Dirty bit)です(上図ではVとDとCのみ記載)。

データキャッシュRAMのセット構成
RAM ECC無 ECC有
タグ部 4x26ビット 4x(26+7)ビット
データ部 8x32ビット 8x(32+7)ビット

ダーティビット(Dirty bit)

メモリがライトバック(WB)の場合、キャッシュに書き込んだデータを毎回メインメモリへ反映しないで、キャッシュのみを更新します。その為、そのラインがエビクション時にメインメモリにライトバックして、一致を取ります。すると、ある期間、メインメモリとキャッシュのデータが一致しません。そこで、キャッシュラインをダーティとしてマークして、タグメモリ上にダーティビットを設けて、メインメモリのデータと一致しているかどうかを管理します。

エラーのリカバー

データキャッシュでは、キャッシュラインはダーティになる可能性があります。RAMの訂正操作は、キャッシュのためのクリーン化と無効化操作の一部として行われます。これはライトバッファにおいて起こり、訂正されたデータは、外部メモリにライトバックされます。アクセスはリトライされ、正しい値が外部メモリから読まれます。もし、その時データが訂正できないならば、エラーは修復不能であるといえます。

キャッシュとメモリ属性

属性

メモリ属性はデフォルトでメモリ領域ごとに設定されていますが、MPU(MPU_RASR:MPU Region Attribute and Size Register)によりユーザーが定義することができます。これらの属性は、AXIM/キャッシュメモリ・システムの動作に影響をあたえます。

メモリタイプ

メモリのタイプは第6回の豆知識4で説明した3種類があります。

Strongly Ordered

プログラムに書いた順を守ってLoad、Storeを実行するメモリタイプ。(例えば、外部プライベート周辺バスROMテーブル領域)

Device

Load、Storeを実行することにより副作用があるタイプ。投機的実行や同じ動作を繰り返してはいけない。(例えば、外部周辺領域等)

Normal

通常のメモリタイプ。複数回読んでも値は同じ、複数回同じ値を書いても結果は同じ。(例えば、MCUの内蔵RAM等)

Shared(共有)/ Non-shared(共有されない)と排他的アクセス

Shared(共有)は、別のマスタと共有されるメモリにだけ適用されます。(一貫性が保証されます)。デフォルトでは、データ・アクセスがD-キャッシュにキャッシュされないようになっています。言い換えると、デフォルトでは、NormalとNon-shareableメモリ領域だけは、RAMでキャッシュすることができます。適切なキャッシュが有効な場合で、かつメモリタイプがキャッシュ可能な場合にキャッシングが起きます。CACR_ SIWTが1ならば、Shared cacheableメモリ領域もキャッシュすることができます。

メモリタイプ キャッシュ マージ 再スタート 排他的処理
Normal Shared 不可(*) 可能 可能 内部&外部
Non-shared 可能 可能 可能 内部のみ
Device Shared 不可 不可 不可 内部&外部
Non-shared 不可 不可 不可 内部のみ
Strongly Ordered Shared 不可 不可 不可 内部&外部
  • (*)CACR.SIWTが1に設定されていない限り。

Shared(共有)としてマークされているメモリ領域への排他的ストア命令のアクセスでなければ、ストアバッファはNormalメモリにいくつかのストアをマージすることができます。

キャッシュされていないShared 排他的トランザクションだけは、排他的外部インターフェースとしてマークされます。CACR.SIWTが1ならば、Sharedのキャッシュ可能なメモリ領域に対するロード/ストア排他的命令は、外部インターフェース上の排他的アクセスという結果にはなりません。

一方、Normalメモリだけは再スタート可能だと考えられます。つまり、複合ワード転送の場合に、割り込みが発生すると終わりまで行なわれずに途中で中断されて、割り込みの処理後に再開されるようになります。このとき、Non-sharedメモリへの排他的なアクセスのための内蔵排他的モニターだけ更新され、チェックされます。内蔵モニターの利用に加えて、必要に応じて、外部メモリ・インターフェースAXIMまたはAHBPを使っている外部モニターを使ってもSharedメモリへの排他的アクセスをチェックすることができます。