自作CPUのキャッシュについて,VIPTを導入して実装を開始した. データキャッシュについては,VIPTとPIPTの両方をサポートする必要があり(LSUパイプラインはVIPT,それ以外のポートはPIPT),そのあたりの詳細を詰めている.
とりあえずPIPTのままで維持していいポートはそのままで,LSUのアクセスポートのみをVIPTに置き換えている.
VIPTでは、キャッシュのインデックス・アクセスのためには仮想アドレスを用い、タグ比較には物理アドレスを使用する。 例えば、512ビット(=64B)で4-wayを持つキャッシュにおいて、32KBの容量を用意したい場合、キャッシュのライン数は以下のようになるだろう。
インデックス
仮想アドレスのうち、下位の64B分(6ビット)はキャッシュライン内のため省略する。すると上位の128インデックス分(7ビット)がキャッシュ・インデックス・アクセスのために使用される。
![](https://cdn-ak.f.st-hatena.com/images/fotolife/m/msyksphinz/20240515/20240515015130.png)
ところが、仮想アドレスが物理アドレスに変換されると、一致しているのはアドレスのページ内ビット(12ビット分)のみであり、上記の例だと一番上の12ビット目は仮想アドレスと物理アドレスで異なる可能性がある。
![](https://cdn-ak.f.st-hatena.com/images/fotolife/m/msyksphinz/20240515/20240515015404.png)
この一番上のビットをColor Bitと名付け、以降ではこれを引き回していくことになる。