FPGA開発日記

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

マルチポートRAMを使用するためのLVT (Live Value Table)の実装

自作CPUのレジスタファイルは非常に多くの読み込みポートと書き込みポートを使用しており、それだけで非常に多くのLUTを消費してしまう。例えば、ちょっと豪華なバックエンドを実装すると、

  • ALUが1パイプラインにつき2ポートの読み込み、1ポートの書き込み、これを2パイプライン
  • LSUが1パイプラインにつき1ポートの読み込み、1ポートの書き込み、これを2パイプライン、およびストアデータ読み込みのために1ポート
  • 分岐ユニット、CSR用ユニットなどでそれぞれ消費するポート

と重ね合わせていくと、読み込みのために数十ポート、書き込みのために数ポートが必要となる。

このとき、マルチポートにすればするほど大量にFPGAのLUTを消費してしまうということと、あまりにもマルチポートだとFPGAでBlockRAMに推論されないという問題がある。

もともとFPGAに内蔵されているBlockRAMという内蔵RAMは2ポートのマルチポートまで対応している。 2ポートよりもより多くのポートをサポートするために、LVT(Live Value Table)という方式を用いて、マルチポート化する方法がある。 この方式は複数のBlockRAMを用いることによりポートを分離独立することができ、読み込み、書き込みポートの負荷を分散させる目的がある。

この発想は、もともとFPGAには非常に潤沢なBlockRAMが搭載されているため、ある程度濫用しても問題ないというところからきている。

LVTをきちんと理解するために、ステップ・バイ・ステップで考えていこうと思う。

まずは1R1WのRAMを考える。読み込みポート・書き込みポートがそれぞれ1個ずつだ。 拡張したときの見た目をよくするために、左側に書き込みのためのポートを示して、上側から読み込みのリクエスト、下側に読み込みの出力を矢印として示している。

1R1WのRAMの概念図

さて、これを1Wのまま単純に読み込みポート数を2以上に増やすことを考える。以下のイメージで単純にポートを増やすと、そのために一気に回路の複雑度が増大する。

2-R/1-WのRAMの概念図

そこで、複数の読み込みポートを分割するために、RAMをコピーすることを考える。

  • 書き込み時には両方のRAMに書き込む
  • 読み込み時は独立したRAMから読み込む

これにより、読み込みポートがそれぞれで完全に分割され、回路の複雑度を削減することができるようになる。 これはそのまま1WのままNReadまで拡張することができる。書き込みポートのFanoutが増大するが、読み込みポートの増加による複雑度に比べれば、配線のコピーだけで済むため複雑度は大きくならないと思う。

さらにここから、今度は書き込みポートを増やすことを考える。1W1Rに立ち戻って、N-W/1-R、つまり読み込みポートを1つにして、書き込みポートを増やすことを考える。 書き込みポートを分割した場合、複数のRAMのコピーに対して、異なるポートから異なる値が書き込まれることになる。 ここで問題になるのは、「あるアドレスの情報に対して、だれが最新のデータを保持しているのか?」を管理することだ。

1-R/2-WのRAMの場合の基本的な考え方

そこで、Live Value Table(LVT)という概念を導入する。これは各書き込みポートで共有されたテーブルで「あるアドレスはどちらのRAMが細心の値を持っているのか?」というのを記録するテーブルで、書き込みポートが駆動するたびに、書き込んだアドレスに相当するエントリに対して自分の書き込みポート番号を記録する。 読み込み時には、それぞれのRAMにアクセスすると同時にLVTの街頭アドレスのエントリにアクセスし、どちらのRAMから取り出すのかを決定する。

これにより、書き込みポートを完全に独立させることができる。逆に言うと、複数のポートが同時にアクセスする部分はLVTに集約される。 結果的にLVTは書き込みポートの数だけ複雑度が増大するが、LVT自体が「エントリ数 = SRAMのエントリ数、エントリの幅 = 書き込みポートの数」になるため、エントリの幅を大きく抑えることができる。

1-R/2-WのRAMで、LVTを導入した場合の概念図

最終的に、2-R/2-Wまで拡張すると以下のようなイメージとなる。

2-R/2-WのLVTを用いたMuti-port RAMの概念図

さて、次はこれを実際のプロセッサの物理レジスタに適用して、どの程度回路面積が削減できるか見てみよう。