現在自作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