FPGA開発日記

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

自作RISC-VコアをYosysで合成する試行 (3. sv2vによるデザイン全体の修正)

f:id:msyksphinz:20220103010108p:plain

結構時間が空いてしまった。sv2vによるSystemVerilogのデザインをVerilogに修正する作業の続き。Yosysのためにいくつかのデザインを修正している。

最初はfilelistの中のファイルを1つ1つ変換して移行かと思ったが、パッケージの読み込みとかincludeの問題で結構エラーが多発してしまったので、結局は一気にまとめてfilelistを渡してしまった方が一発で変換できるという結論に至った。

コメントアウトしているが、最初に試したのは以下。大量のパッケージのincludeが必要になり結果的に上手く変換できないケースが多発した。

# for svfile in `cat ../src/filelist.f`
# do
#     echo ${svfile}
#     ../../sv2v/bin/sv2v ${svfile} \
#                         ../src/msrh_csr_def.svh \
#                         ../src/riscv_fpu_imfdc_pkg.sv \
#                         ../src/riscv64_pkg.sv \
#                         ../src/riscv_common_pkg.sv \
#                         ../src/msrh_standard_conf_pkg.sv \
#                         ../src/decoder_inst_cat.sv \
#                         ../src/decoder_reg.sv \
#                         ../src/decoder_alu_ctrl.sv \
#                         ../src/decoder_bru_ctrl.sv \
#                         ../src/decoder_csu_ctrl.sv \
#                         ../src/decoder_fpu_ctrl.sv \
#                         ../src/decoder_lsu_ctrl.sv \
#                         ../src/msrh_bru_pkg.sv \
#                         ../src/msrh_csu_pkg.sv \
#                         ../src/msrh_fpu_pkg.sv \
#                         ../src/msrh_lsu_pkg.sv \
#                         ../src/msrh_predict_pkg.sv \
#                         ../src/msrh_pkg.sv \
#                         ../src/msrh_lsu_pkg.sv > ${svfile/sv/v}
# done

次に試したのは以下。ファイルリストごとファイルを全部引数に充てて変換する。

../../sv2v/bin/sv2v ../src/riscv_fpu_imfdc_pkg.sv \
                    ../src/riscv64_pkg.sv \
                    ../src/riscv_common_pkg.sv \
                    ../src/msrh_standard_conf_pkg.sv \
                    ../src/fpnew/src/fpnew_pkg.sv \
                    `cat ../src/filelist.f`> msrh_tile_wrapper.v

一応変換できた。が、怪しい記述が存在しているなあ...

        assign o_selected = struct packed {
                logic is_valid;
                logic [bit_oh_or_00874_883D7.T_u_flush_sel_sv2v_pfunc_DA039 - 1:0] brtag;
                logic [bit_oh_or_00874_883D7.T_msrh_conf_pkg_RV_BRU_ENTRY_SIZE - 1:0] br_mask;
                logic [bit_oh_or_00874_883D7.T_msrh_conf_pkg_LSU_INST_NUM - 1:0] pipe_sel_idx_oh;
                struct packed {
                        logic valid;
                        logic [bit_oh_or_00874_883D7.T_riscv_pkg_VADDR_W - 1:0] pc_addr;
                        logic [31:0] inst;
                        logic [3:0] cat;
                        logic is_rvc;
                        logic [bit_oh_or_00874_883D7.T_u_flush_sel_sv2v_pfunc_DA039 - 1:0] brtag;
                        logic [bit_oh_or_00874_883D7.T_msrh_conf_pkg_RV_BRU_ENTRY_SIZE - 1:0] br_mask;
                        logic [bit_oh_or_00874_883D7.T_msrh_pkg_CMT_ID_W - 1:0] cmt_id;
                        logic [bit_oh_or_00874_883D7.T_msrh_conf_pkg_DISP_SIZE - 1:0] grp_id;
                        logic is_call;
                        logic is_ret;
                        logic [bit_oh_or_00874_883D7.T_u_flush_sel_sv2v_pfunc_94D84 - 1:0] ras_index;
                        logic pred_taken;
                        logic [1:0] bim_value;
                        logic btb_valid;
                        logic [bit_oh_or_00874_883D7.T_riscv_pkg_VADDR_W - 1:0] pred_target_vaddr;
                        logic [(7 + bit_oh_or_00874_883D7.T_msrh_pkg_RNID_W) - 1:0] wr_reg;
                        logic [2:0][(7 + bit_oh_or_00874_883D7.T_msrh_pkg_RNID_W) + (1 + 0):0] rd_regs;
                        logic except_valid;
                        logic [bit_oh_or_00874_883D7.T_u_flush_sel_sv2v_pfunc_860EC - 1:0] except_type;
                        logic [bit_oh_or_00874_883D7.T_riscv_pkg_XLEN_W - 1:0] except_tval;
                        logic fflags_update_valid;
                        logic [4:0] fflags;
                } inst;
                logic [2:0] size;
                logic [bit_oh_or_00874_883D7.T_msrh_pkg_CMT_ID_W - 1:0] cmt_id;
                logic [bit_oh_or_00874_883D7.T_msrh_conf_pkg_DISP_SIZE - 1:0] grp_id;
                logic [3:0] state;
                logic is_get_data;
                logic [bit_oh_or_00874_883D7.T_riscv_pkg_VADDR_W - 1:0] vaddr;
                logic [bit_oh_or_00874_883D7.T_riscv_pkg_PADDR_W - 1:0] paddr;
                logic [bit_oh_or_00874_883D7.T_msrh_pkg_LRQ_ENTRY_SIZE - 1:0] lrq_haz_index_oh;
                logic except_valid;
                logic [bit_oh_or_00874_883D7.T_u_flush_sel_sv2v_pfunc_860EC - 1:0] except_type;
        }'(w_selected_array[WORDS - 1]);

これはEntryを選択するための論理だ。structを分解して接続してい直している。この部分がVerilatorでエラーとなってしまった。

        -f sim_filelist.f
%Error: ../src/../src/msrh_tile_wrapper.v:688:3: syntax error, unexpected "'", expecting "'{"
  688 |  }'(w_selected_array[WORDS - 1]);
      |   ^
%Error: ../src/../src/msrh_tile_wrapper.v:879:3: syntax error, unexpected "'", expecting "'{"
  879 |  }'(w_selected_array[WORDS - 1]);
      |   ^

うーん、完全サポートはちょっと難しいなあ。