現在の自作CPUは,キャッシュのポリシとしてPIPTを採用している. PIPTというのは,Physically Index, Physically Taggedのことで,物理アドレスを使用してキャッシュのインデックスを参照し,物理アドレスを使用したタグの比較を行う.
これのメリットは,LSU内のデータパスを,
- PIPT : レジスタアクセス → アドレス計算 → 物理アドレスへ変換 → キャッシュアクセス
というのを,VIPTは
- VIPT : レジスタアクセス → アドレス計算 → 物理アドレスへ変換
- VIPT : アドレス計算 → キャッシュアクセス → 物理タグの比較
とすることで,LSU内のクリティカルパスを削減することができる.
で,単純にデータキャッシュのポートを全部このように変えればよいわけではなくて,一部はVIPT,一部はPIPTで作る必要があるように思う.
- LSUパイプラインからのアクセス:VIPT
- スヌープ用のポート:PIPT
- PTW用のポート:PIPT
- MSHRからの読み込みポート:PIPT
- Store Bufferからの読み込みポート:PIPT
とする必要があると思う.PIPTを用意しなければならない場所は結構あって,かついくつかのポートはマージできそうな気がしているので,この辺の調整をしていけばいいのだと思う.