SystemVerilogで記述されたRISC-VプロセッサArianeについて解析を進めている。 まずはフロントエンドから。フロントエンドは命令をフェッチするところだが、以下のようなサブモジュールで構成される。
instr_realign
: 命令アライナ。命令フェッチ時に命令のプリデコードを行い、命令サイズから次のフェッチラインを判定する。instr_scan
: 命令内で分岐命令を特定し、分岐予測命令の判定に使用する。ras
: Return Address Stackbtb
: Branch Target Bufferbht
: Branch History Tableinstr_queue
: 命令キュー
となっている。命令アライナは命令を取り込んできてからプリデコードを行う。これは最大2命令フェッチ(32ビット幅バス)と最大4命令フェッチ(64ビット幅バス)で実装が切り分けられており、2命令フェッチのときを解説すると、
- 過去にUnalignedな状態(32ビットのうち上位16ビットが残り、次の16ビットが必要)な状態になって次の命令がフェッチされると、
- 下位16ビットを接続して32ビットの命令を作成
- 上位16ビットはRVC命令として判定できる場合はそのまま命令を生成、そうでない場合は再びUnalignedな状態を維持
- Unalignedではない状態から次の命令がフェッチされると、
- 下位16ビットがRVC命令として判定できるのならばRVC命令として生成する。そうでないならば32ビット命令として生成
- 下位16ビットがRVC命令として判定できる場合で
- 上位16ビットがRVC命令として判定できる場合は上位16ビットをRVC命令として判定。
- 上位16ビットがRVC命令として判定できない場合はUnalignedな状態に移行。
という構成になっている。
instr_scan
は命令の簡易スキャンを行う。ジャンプ命令などを命令デコードよりも前にデコードし、後続の分岐予測器などに活用する仕組みである。