NaxRiscvのドキュメントを、改めて位置から読んでみることにしたいと思う。
メモリ・システム
ロードストアの統合
LSUの実装の特徴は以下の通りである。
- LQ / SQ : 通常、それぞれ16
- AGUからのロード : ロードレイテンシを削減するために、LQにロードパイプライン用のデータがない場合、LQのレジスタを介さずにAGUが直接、最新の計算結果を提供できる
- ロードヒット予測 : ロードのレイテンシを削減するため(6サイクルから3サイクルに)、キャッシュヒット予測機能があり、特定の命令を推測的に起動する
- ハザード予測 : ストアの場合、アドレスとデータは両方とも発行キューを通じて提供される。そのため、遅延したデータは遅延したアドレスも作成し、ストアからロードへのハザードが発生する可能性がある。これを削減するために、ハザード予測機能がロードに追加された。
- ストア to ロード・バイパス : 指定されたロードが同じサイズの単一ストアに依存している場合、ロード・パイプラインはストアのライトバックを待たずにストア値をバイパスすることがある
- 並列メモリ変換 : ロードの場合、レイテンシを低減するために、メモリ変換はキャッシュ・リードと並列に実行される。
- 共有アドレス・パイプライン : ロードとストアは、仮想アドレスを変換し、ハザードをチェックするために同じパイプラインを使用する。
共有およびライトバックパイプラインの図をいくつか示す:
MMU
MMUの実装の特徴は以下の通りである。
- 2D構成 : ページテーブルの各レベルに対して、パラメータ化された数のダイレクト・マップ・トランケーション・キャッシュを指定できる。
- ハードウェア・リフィル : これは安価であるため
- キャッシュ・ダイレクト・ヒット : タイミングを改善するために、命令キャッシュがMMU TLBストレージに対してウェイタグを直接確認できるようにする(面積を犠牲にして)。
RV32では、デフォルト構成は次のとおりである。
- 4ウェイ*レベル0(4KBページ)TLBの32エントリ
- 2ウェイ*レベル1(4MBページ)TLBの32エントリ
各ウェイを分散RAMに推論することで、TLBキャッシュの領域は低く抑えられる。
MMU設計の例をいくつか紹介しよう。
コヒーレンシ
CPU上では、メモリーのコヒーレンシは以下の方法で実装されている。
- メモリ・ブロック(データ・キャッシュ内)には、Permissionレベルがある(unloaded < shared < unique[dirty])。
- shared Permissionは読み取り専用アクセスのみを許可する。
- unique Permissionは読み取り/書き込みアクセスを許可する。
- データ・キャッシュが許可をアップグレードしたい場合、取得要求を発行する(リード・バス上)。
- データ・キャッシュが領域を解放したい場合、リリース要求を発行する(ライト・バス上)
- インターコネクトは、指定されたアドレスのデータ・キャッシュの権限をダウングレードできる(プローブバス上)
- プローブ要求は、データキャッシュのストアパイプラインを再利用して処理される
- CPUによるアトミックなロード/ストアアクセスを許可するために、ロックインターフェースにより指定されたアドレスの権限ダウングレードを防止できる
NaxRiscvネイティブのデータキャッシュ・インターフェースはメモリに対してカスタム仕様だが、Tilelinkにブリッジできるように作られている。...
SoCの観点では、複数のマスタを接続するために、L2コヒーレント・キャッシュまたはキャッシュレスのコヒーレンシ・ハブのいずれかを選択できる。
L2キャッシュ
L2キャッシュには以下の特性がある。
- Tilelinkインターフェースの提供(CPU/DMA用にアップ、メモリ用にダウン)
- L1と一体型(NaxRiscv用はD$のみ)であるため、必要なプローブのみを送信するが、常にL1のコピーを持つ。
- PLRUラインの排除
- ノンブロッキング
- マルチウェイ
- データメモリはシンプルなデュアルポートRAMとして実装(FPGAに最適
- アドレス/ソースに応じてアクセスを選択的にキャッシュ可能(ビデオDMAアクセスをキャッシュしない場合に有用
デフォルト構成におけるタイミングは以下の通り: - ヒットレイテンシ 5サイクル - ミスレイテンシペナルティ 4サイクル
アーキテクチャは主に以下の通り:
- リクエストは中央集権化されたタグフェッチ/コントローラに送られる。
- そのコントローラは、以下に説明するように、いくつかのパイプライン/FSMに供給することができる。
- プローブコントローラは、L1キャッシュからデータを削除する必要がある場合、L2キャッシュラインを退避させるか、または固有の許可を取得する必要がある場合に使用される
- キャッシュラインを再読み込みするか、キャッシュされていない読み取りアクセスを行う必要がある場合は、down.a を読み込む
- 例えば up.c.release の場合は、up.d に直接応答を送信する
- データコレクタにリクエストを送信し、データコレクタはメインメモリ/キャッシュに書き込み、さらに up.d にデータを送信する
- キャッシュヒットおよびキャッシュエビクト時に使用されるリードキャッシュにリクエストを送信する...