FPGA開発日記

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

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

自作RISC-Vアウトオブオーダコアの実装、FPUを実装している。RISC-VのISAIMC/IMFC/IMFDCに対応するためにいくつかのパラメータの変更を行う必要があった。

  • RV32IMC/RV32IMFC などの構成では、FLD命令やFSD命令などのFLEN=64などの命令を除外する必要がある。

いくつかのISAの条件において、命令を無効化する必要がある。 これらに対応するために、FPUのパイプラインをいくつか変更している。

これに関して、ISAの条件に応じてスクリプトで自動的に命令自体の定義を削除してしまうと、パイプライン中に埋め込んだ実装がコンパイル上でエラーとなってしまうという問題がある。

例えば、FSGNJ.D命令がFLEN=64の時のみ有効な命令だが、だからと言ってFLEN<64のコンフィグレーション時に命令の定義自体を削除してしまうと、パイプライン中の記述がコンパイルエラーとなってしまう。

    {
        "name":"fsgnj.d    f[11:7],f[19:15],f[24:20]",
        "length":"32", "xlen":["32", "64"], "flen":["64"],
        "field":["00100", "01", "XXXXX", "XXXXX", "000", "XXXXX", "10100", "11"],
        "inst_cat": [["inst_cat", "fpu"]],
        "reg": [["rd", "fd"], ["r1", "f1"], ["r2", "f2"]],
        "fpu_ctrl":[["size", "dw"], ["op", "fsgnj_d"]]
    },

JSONファイルの意味は以下の通り。

  • "xlen":["32", "64"]" : XLEN=32, XLEN=64で有効化する(逆にADDIWなどのXLEN=64でのみ有効な命令はxlen:[32]`とだけする
  • "flen":["64"] : FLEN=64で有効化する(FLEN=32, FLEN=0では違反命令とする
    OP_FSGNJ_D  : begin  // <-- ここ自体がコンパイルエラー
      w_ex2_res_data = { w_ex2_rs2_selected_data[riscv_pkg::FLEN_W-1], w_ex2_rs1_selected_data[riscv_pkg::FLEN_W-2:0]};
      w_ex2_fpnew_valid = 1'b0;
    end

そこで、命令の定義自体は残してデコーダから処理を抜いてしまう。これで、命令の定義自体はVerilogに残るが、デコード時にIllegal Errorとなるように修正する。

このような処置をいろいろ追加することで全体的にテストケースを通すことが出来るようになってきた。

  • RV32IMC
  • RV32IMFC
  • RV32IMFDC
  • RV64IMC
  • RV64IMFC
  • RV64IMFDC

でテストケースを確認していく。