Kotaro7750's diary

低レイヤを中心とした技術ブログ、たまに日記

自作RISC-V32IMインオーダプロセッサ 煌

半年前くらいから自作プロセッサをほそぼそと開発していたが,インオーダパイプラインプロセッサとしては割と高性能だと思うものができたので簡単に紹介していく.

github.com

大まかな特徴

RISC-V32IM準拠

これに関してはそのまま.RISC-V32IMの内,システム系の命令以外を実装している.プロセッサ上でlinuxとか動かすんだったら考える必要があるが,そこまでは考えてないのでやってない.

5段パイプライン

以下のブロック図のような命令フェッチ,デコード,実行,メモリアクセス,レジスタ書き込みの5段ステージ構成となっている.

f:id:Kotaro7750:20200629101815p:plain
ブロック図

それぞれのステージのストールやフラッシュの制御信号を作るのはControllerモジュールが中央集権的に行っている.

強めの分岐予測器

強めと言っても商用プロセッサクラスの強さではなく,個人開発レベルでは強めかなくらいの気持ち.グローバル2レベル適応型分岐予測器とBTBによる分岐先予測を実装している.効果については後述.

グローバル2レベル適応型とは,プログラム全体の分岐履歴と,予測したい命令のプログラムカウンタを合わせたインデックスを持つテーブルに2bit飽和カウンタが並べられているもの. この構成にすることで,どの命令についての予測か・過去の系列がどのようなものだったかという2つを混ぜた予測ができる.

評価

CoreMarkによる評価

DIGILENT社製NEXYS VIDEOボード用に合成し,100MHzで動かした結果が下である.

2K performance run parameters for coremark.
CoreMark Size    : 666
Total ticks      : 1310801051
Total time (secs): 13
Iterations/Sec   : 230
Iterations       : 3000
Compiler version : GCC9.2.0
Compiler flags   : 
Memory location  : STACK
seedcrc          : 0xe9f5
[0]crclist       : 0xe714
[0]crcmatrix     : 0x1fd7
[0]crcstate      : 0x8e3a
[0]crcfinal      : 0xcc42
Correct operation validated. See readme.txt for run and reporting rules.

CoreMark/MHzは2.3とインオーダとしては結構いいんじゃないかと思う.ちなみに最近発表されたBOOMのV3は6とか7とかだったような気がするのでアウトオブオーダプロセッサには手も足も出ない感じ.

分岐予測器の性能

本当はベンチマークとして何を使うかも重要なんだろうが,入手してないのでCoreMarkを1イテレーションだけ走らせたものをVivado上で10ms実行してみたときの性能で評価する.

実装 分岐予測精度 制御ストール発生頻度 ミス率 Takenミス率 NotTakenミス率
グローバル2bit飽和カウンタ 59% 7.5% 55% 58% 47%
グローバル2レベル適応型 94% 0.5% 44% 51% 11%

非公式ベンチマークではあるが分岐予測精度は90%を超えた.ただ性能に直結するミス率は飽和カウンタに比べるとそこまで改善されていない.分岐先予測がボトルネックとなってTakenミス率の改善がないからだと考えられる.