前回、浮動小数点演算器のHardFloatを調査したが、そのままのデザインだとパイプラインレジスタが入っていないし、Rocket-Chip側のパイプライン形式のFPUを使うのも面倒なので、昔論文で読んだことのあったFPNewを使うとどんな感じだろうということでやってみた。
FPNewの論文は以下からアクセスできる。
なるほど、PULPのプロジェクトの一つなのか。
これをそのままとりあえず自作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が混在しているのが問題のようだ。
なるほど、SystemVerilogとしては許可されている構文だが、推奨はされていないという意味でErrorになっているのか。 おそらくシミュレーションできないわけではないので、このエラーは無視するようにVerilatorにオプションを追加する。
-Wno-BLKANDNBLK
さらにこれだけでなく結構な量の警告が出て、警告が出てくると基本的にVerilatorはエラー扱いにしてしまうので、これを無効化する。 警告を全部無視するのはかなりリスクがあるが、FPNewをコンパイルするためにはやむをえまい。
-Wno-fatal
ここまで行くと、一応VerilatorでのコンパイルとC++生成が完了したようだ。次はシミュレーションを確認していきたい。