FPGA開発日記

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

自作CPUにベクトル命令を追加する実装検討 (13. cvfpuを使ったベクトルFPU命令の実装)

現在自作CPUではFPUの演算器としてIPのcvfpu(FPNew)を使用している。これはかなりまともに使える演算器IPだと思うので、現在サポートしようとしているベクトル命令のFPU演算命令もFPNewを使ってサポートしていきたい。

スカラFPUの場合はcvfpu内の各ユニットを細かく借用して実装したが、ベクトルFPUの場合はcvfpu全体を使ってインスタンス化していきたい。

// --------------
// FPU Pipeline
// --------------
fpnew_top
  #(
    // FPU configuration
    .Features       (scariv_vec_pkg::FPNEW_VEC_CONFIG),
    .Implementation (scariv_vec_pkg::FPNEW_VEC_IMPL),
    .TagType        (scariv_vec_pkg::aux_fpnew_t)
    )
u_fpnew_top
(
 .clk_i  (i_clk),
 .rst_ni (i_reset_n),
 // Input signals
 .operands_i    (w_fpnew_ex1_rs_data    ),
 .rnd_mode_i    (w_ex1_fpnew_rnd_mode   ),
 .op_i          (w_ex1_fpnew_op         ),
 .op_mod_i      (w_ex1_fpnew_op_mod     ),
 .src_fmt_i     (w_ex1_fpnew_src_fp_fmt ),
 .dst_fmt_i     (w_ex1_fpnew_dst_fp_fmt ),
 .int_fmt_i     (w_ex1_fpnew_int_fmt    ),
 .vectorial_op_i(1'b1                   ),
 .tag_i         (w_ex1_fpnew_tag_in     ),
 .simd_mask_i   (1'b0                   ),
 // Input Handshake
 .in_valid_i (w_ex1_fpnew_valid ),
 .in_ready_o (                  ),
 .flush_i    (w_ex1_commit_flush),
 // Output signals
 .result_o (w_fpnew_calc_result),
 .status_o (w_fpnew_status     ),
 .tag_o    (w_fpnew_tag_out    ),
 // Output handshake
 .out_valid_o (w_fpnew_out_valid),
 .out_ready_i (1'b1              ),
 // Indication of valid data in flight
 .busy_o ()
);

とりあえず、簡単なベクトル浮動小数点演算命令が動くようになった。

GPR[14](95) <= 0000000000000044
4710 : 238 : PC=[000000008000200e] (M,59,01) 05077757 vsetvli a4, a4, e32, m1, ta, mu
GPR[14](135) <= 0000000000000010
4715 : 239 : PC=[0000000080002012] (M,60,01) d007f553 fcvt.s.w fa0, a5
FPR[10](42) <= ffffffff42000000
4715 : 240 : PC=[0000000080002016] (M,60,02) 5e055c57 vfmv.v.f v24, fa0
VPR[24](51) <= 42000000_42000000_42000000_42000000_42000000_42000000_42000000_42000000_42000000_42000000_42000000_42000000_42000000_42000000_42000000_42000000_
4715 : 241 : PC=[000000008000201a] (M,60,04) d005f553 fcvt.s.w fa0, a1
FPR[10](71) <= ffffffff42c80000
4719 : 242 : PC=[000000008000201e] (M,61,01) 5e055cd7 vfmv.v.f v25, fa0
VPR[25](38) <= 42c80000_42c80000_42c80000_42c80000_42c80000_42c80000_42c80000_42c80000_42c80000_42c80000_42c80000_42c80000_42c80000_42c80000_42c80000_42c80000_
4722 : 243 : PC=[0000000080002022] (M,62,01) 038c9f57 vfadd.vv v30, v24, v25
VPR[30](39) <= 43040000_43040000_43040000_43040000_00000000_00000000_00000000_00000000_43040000_43040000_43040000_43040000_43040000_43040000_43040000_43040000_
4722 : 244 : PC=[0000000080002026] (M,62,02) 00009fb9 c.addw  a5, a4
GPR[15](91) <= 0000000000000030
4722 : 245 : PC=[0000000080002028] (M,62,04) fef651e3 bge     a2, a5, pc - 30
4723 : 246 : PC=[000000008000200a] (M,63,01) 40f5873b subw    a4, a1, a5