FPGA開発日記

カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages , English Version https://fpgadevdiary.hatenadiary.com/

L1Dキャッシュのキャッシュライン置き換え方法再考 (2. 実装と確認)

自作CPUのL1Dキャッシュアップデートポリシ再考、少し実装を始めた。

基本的な方針としてはL1Dのアップデートは2種類に分類する。

  1. タグを更新せずにキャッシュラインをアップデート。1サイクル目でタグを確認し、ヒットすれば(Evictionされていなければ)、2サイクル目にデータを書き込む
  2. タグを更新するキャッシュラインのアップデート。L2からデータをロードする場合など。1サイクル目でタグを更新し、2サイクル目でデータを書き込む

この時に気をつけなければならないのは、読み込みリクエストの際は1サイクルでキャッシュラインを読み出すので、書き込み直後の次のサイクルにデータを読み込む場合には古いデータが読めてしまう。この場合はL1D内でコンフリクトを検出してパイプラインに再起動を促す。

こうすると、MissUnitによるL2から読み込んだデータとの書き込みとLSUパイプラインからのデータの読み込みが見事にぶつかり、結果的に必ずL1Dキャッシュ側でコンフリクトが発生してリプレイとなり性能が低下する。

この場合は、LSUパイプラインでは、L1Dキャッシュからの読み込みだけではなく、MissUnitから直接データをロードできるように工夫する必要があるように思われる。このためのフォワーディングパスが必要だろう。

とりあえず、簡単に実装したところでテストパタンを実行した。単純なものはPassできるが、複雑な仮想アドレスを使用するケースではFailしてしまう。もうちょっとデバッグが必要かな。