FPGA開発日記

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

オープンソースの浮動小数点演算器FPNewの調査

前回、浮動小数点演算器のHardFloatを調査したが、そのままのデザインだとパイプラインレジスタが入っていないし、Rocket-Chip側のパイプライン形式のFPUを使うのも面倒なので、昔論文で読んだことのあったFPNewを使うとどんな感じだろうということでやってみた。

FPNewの論文は以下からアクセスできる。

arxiv.org

なるほど、PULPのプロジェクトの一つなのか。

github.com

これをそのままとりあえず自作RISC-Vプロジェクトに組み込んで、Verilatorを使ってコンパイルしてみることにした。

%Error-BLKANDNBLK: ../src/fpnew/src/fpnew_fma.sv:106:59: Unsupported: Blocked and non-blocking assignments to same variable: 'fpnew_32.inp_pipe_valid_q'
                                                       : ... In instance msrh_tb.u_msrh_tile_wrapper.u_msrh_tile.fpu_loop[0].u_msrh_fpu.u_fpu.u_msrh_fpnew_wrapper
  106 |   logic                  [0:NUM_INP_REGS]                 inp_pipe_valid_q;
      |                                                           ^~~~~~~~~~~~~~~~
                   ../src/fpnew/src/fpnew_fma.sv:118:10: ... Location of blocking assignment
  118 |   assign inp_pipe_valid_q[0]    = in_valid_i;
      |          ^~~~~~~~~~~~~~~~
                   ../src/fpnew/src/fpnew_fma.sv:130:7: ... Location of nonblocking assignment
  130 |       inp_pipe_valid_q[i+1] <= (flush_i) ? (1'b0) : (inp_pipe_ready[i]) ? (inp_pipe_valid_q[i]) : (inp_pipe_valid_q[i+1]);

あら、Verilatorでのコンパイルはサポートしていないのか?Non-BlockingとBlockingのassignmentが混在しているのが問題のようだ。

verilator.org

なるほど、SystemVerilogとしては許可されている構文だが、推奨はされていないという意味でErrorになっているのか。 おそらくシミュレーションできないわけではないので、このエラーは無視するようにVerilatorにオプションを追加する。

-Wno-BLKANDNBLK

さらにこれだけでなく結構な量の警告が出て、警告が出てくると基本的にVerilatorはエラー扱いにしてしまうので、これを無効化する。 警告を全部無視するのはかなりリスクがあるが、FPNewをコンパイルするためにはやむをえまい。

-Wno-fatal

ここまで行くと、一応VerilatorでのコンパイルC++生成が完了したようだ。次はシミュレーションを確認していきたい。