前回の続き。多少は面積比較できる程度に環境が構築できてきたので、いろんな構成でもってVivadoで合成して面積を比較してみた。
まず大前提の問題として、Vivadoの面積レポートはとても読みにくい。まあSynopsysのDesign Compilerのように、単純にゲート数で比較することができないから大変だろうけど、もう少しCSVとか、テキストで解析しやすいようにしてくれればありがたいのだが。。。
とりあえず現状で調査した構成は以下の通りだ。パラメータについては、ソースコードを読みながら調査しているので、間違いがあるかもしれない。
Rocket DefaultConfig | Rocket DefaultSmallConfig | Rocket TinyConfig | boom-v1 BOOMConfig | boom-v2 BOOMConfig | Freedom E300 Arty | ||
---|---|---|---|---|---|---|---|
コア機能 | ビット幅 | 64 | 64 | 32 | 64 | 64 | |
VM | 指定なし(あり) | なし | なし | 指定なし(あり) | 指定なし(あり) | なし | |
演算器 | mulUnroll | 8 | 指定なし(なし) | 8 | 8 | 不明 | 指定なし(なし) |
mulEarlyOut | あり | 指定なし(なし) | 指定なし(なし) | あり | 不明 | 指定なし(なし) | |
divEarlyOut | あり | 指定なし(なし) | 指定なし(なし) | あり | 不明 | 指定なし(なし) | |
FPU | 指定なし(あり) | なし | なし | 指定なし(あり) | あり | なし | |
Dキャッシュ | rowBits | システムバスと同じサイズ | システムバスと同じサイズ | システムバスと同じサイズ | 64 | システムバスと同じサイズ | |
セット数 | 指定なし(64) | 64 | 256 | 64 | 64 | 256 | |
ウェイ数 | 4 | 1 | 1 | 4 | 8 | 1 | |
TLBエントリ数 | 32 | 4 | 4 | 8 | 8 | 4 | |
MSHR数 | 0 | 0 | 0 | 2 | 4 | 0 | |
ブロックバイト数 | CacheBlockBytes | CacheBlockBytes | CacheBlockBytes | 不明 | CacheBlockBytes | ||
命令キャッシュ | rowBits | システムバスと同じサイズ | システムバスと同じサイズ | システムバスと同じサイズ | 不明 | システムバスと同じサイズ | |
セット数 | 64 | 64 | 64 | 64 | 64 | 64 | |
ウェイ数 | 4 | 1 | 1 | 4 | 8 | 1 | |
TLBエントリ数 | 32 | 4 | 4 | 8 | 8 | 4 | |
ブロックバイト数 | CacheBlockBytes | CacheBlockBytes | CacheBlockBytes | 不明 | 不明 | ||
TotalLUT | 28734 | 6318 | 4646 | 115043 | 93773 | 4803 | |
TotalFF | 13187 | 2657 | 2221 | 44852 | 26971 | 2241 |
面積を比較したものをGraphにすると以下のようになる。すべてVivado 2017.2 ZYNQをターゲットにして合成した。
Rocket CoreのDefaultConfigを基準として、DefaultSmallConfigやTinyConfigはとことん小さくした構成だ。 一方でBOOMConfigは非常に大きなものとなっており、原因としてはやはりコア内の面積比率が大きく、リオーダバッファや分岐予測器などが面積を消費しているものと思われる。