現在の自作CPUは、結構面積が大きくて通常のFPGAに乗り切らない。どうにか乗り切れるように、面積削減を検討している。 LSUの中で圧倒的に面積が巨大なのがSTQだ。STQが巨大な要因はいくつかある。
- LDQと異なり、各エントリはアドレスとデータの両方を管理する必要がある。
- ロード命令のフォワーディングをサポートする必要がある。この時、バイト単位での細かいフォワーディングをサポートすると、論理が増大する。
- ストアバッファへデータを移動する論理が必要である。データ移動時に、同じキャッシュラインへのマージ機能をサポートすると、論理が増大する。
それぞれについて対策を考える。
- アドレスの管理はどうしてもCAMになる必要がある。データの管理は、Distributed RAMに移動したい。
- フォワーディングを簡易化し、特定の条件でなければフォワーディングをサポートしない。複数エントリにヒットしてバイト単位でマージする必要がある場合などは、フォワーディングをキャンセルする。
- これにより、常にフォワーディングに必要なデータエントリを1つに限定し、Distributed RAMを使いたい。
- ストアバッファへのデータの移動時のマージ量を減らす。
2について考え、RTL実装を行った。複数エントリにヒットしてバイト単位でマージする方法を細粒度、1エントリのみをフォワードする方法を粗粒度と呼ぼう。 一応ランダムテストも含めてテストパタンはPASSする程度のクオリティに仕上がっている。
性能面:Dhrystoneを実行して、ROIのサイクル数を計測した。
- 細粒度:111,009
- 粗粒度:111,103
- 1パーセント未満の性能低下なので許容範囲内であろう。
面積:
- 細粒度:LUT=22,148 / LUTRAM=0 / FF=3,619
- 粗粒度:LUT=15,090 / LUTRAM=704 / FF=2,154
LUTRAMに移ってきた感じだ。各STQエントリの面積はあまり変わらない。
- STQエントリの面積:
- 細粒度:LUT=184 / FF=83
- 粗粒度:LUT=199 / FF=83