FPGA開発日記

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

SystemVerilogで記述されたRISC-VプロセッサArianeのフロントエンドの構成

SystemVerilogで記述されたRISC-VプロセッサArianeについて解析を進めている。 まずはフロントエンドから。フロントエンドは命令をフェッチするところだが、以下のようなサブモジュールで構成される。

  • instr_realign : 命令アライナ。命令フェッチ時に命令のプリデコードを行い、命令サイズから次のフェッチラインを判定する。
  • instr_scan : 命令内で分岐命令を特定し、分岐予測命令の判定に使用する。
  • ras : Return Address Stack
  • btb : Branch Target Buffer
  • bht : Branch History Table
  • instr_queue : 命令キュー
f:id:msyksphinz:20190824164124p:plain
Arianeのフロントエンドの構成。

となっている。命令アライナは命令を取り込んできてからプリデコードを行う。これは最大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は命令の簡易スキャンを行う。ジャンプ命令などを命令デコードよりも前にデコードし、後続の分岐予測器などに活用する仕組みである。