FPGA開発日記

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

自作RISC-Vアウトオブオーダコアの実装 (FPU命令のサポートとXLEN/FLENの違いによる実装変更)

自作RISC-Vアウトオブオーダコアの実装、FPUを実装している。FMADD命令の実装に関して、いくつか大幅な実装の変更を行う必要があった。

  • FMADD命令は浮動小数レジスタを3つ持っている。整数演算向けに、1命令で最大で2オペランドしかリネームする機構を持っていなかったので、これを3つに拡張する必要があった。
    • 幸いにもリネームの数については、リネームユニットでかなりパラメタライズしていたので、対して苦も無く拡張することが出来た。

これを対応する時点で、比較的FPNewを使ってFMADD演算をサポートすることができる。 問題はその後で、もう少しコンフィグレーションを増やした時に色々と考慮する必要が発生する。

まず、これまでレジスタの読み込みサイズ、データの授受のサイズをすべてXLENベースで設計していたが、FLENについても考慮する必要がある。 コンフィグレーションによってはRV32FDなど、XLEN=32にも関わらずFLEN=64になるような構成もあり、そうするとこれまでの設計ではデータの授受のパスが32ビットに縮退されてしまい、正しくデータを取り出すことが出来なくなってしまう。

そこで、XLENとFLENの最大値を取った新しいデータ構造alen_tを作成し、データの授受に使用するポートをすべてこれで置き換えてしまう。

localparam ALEN_W = riscv_pkg::XLEN_W > riscv_pkg::FLEN_W ? riscv_pkg::XLEN_W : riscv_pkg::FLEN_W;
typedef logic [ALEN_W-1: 0]   alen_t;
typedef logic [ALEN_W/8-1: 0] alenb_t;

ALENというのは勝手につけた名前で、Architectural Lengthの意味で付けた。これでデータフォワーディングパスを書き換えていく。 LSUの内部とかが、結構XLENをベースに実装して待っている要素が多いので、この辺も併せて書き換えていこう。