自作アウト・オブ・オーダRISC-Vコアについて。
幾つか改造して、整数側の物理レジスタのサイズと、浮動小数点側の物理レジスタのサイズを変えることができるように変更した。
localparam XPR_FLIST_SIZE = XPR_PRF_SIZE_PER_GRP; localparam FPR_FLIST_SIZE = FPR_PRF_SIZE_PER_GRP; localparam XPR_RNID_SIZE = XPR_FLIST_SIZE * DISP_SIZE + 32; localparam XPR_RNID_W = $clog2(XPR_RNID_SIZE); localparam FPR_RNID_SIZE = FPR_FLIST_SIZE * DISP_SIZE + 32; localparam FPR_RNID_W = $clog2(FPR_RNID_SIZE); localparam MAX_RNID_W = XPR_RNID_W > FPR_RNID_W ? XPR_RNID_W : FPR_RNID_W;
それぞれのリネームユニットに、型を渡していく。System Verilogはパラメータに型を渡すことができるので、これでリネーム・レジスタのサイズに応じて大きさを切り替える。
module rename_sub import pkg::*; #(parameter REG_TYPE = GPR, localparam RNID_SIZE = REG_TYPE == GPR ? XPR_RNID_SIZE : FPR_RNID_SIZE, localparam RNID_W = $clog2(RNID_SIZE), parameter type rnid_t = logic [RNID_W-1: 0]) ( input logic i_clk, input logic i_reset_n, output logic o_freelist_ready,
scariv_rename_map #(.REG_TYPE(REG_TYPE)) u_scariv_rename_map ( .i_clk (i_clk), .i_reset_n (i_reset_n), .i_arch_valid (w_archreg_valid), .i_arch_id (w_archreg), .o_rnid (w_rnid), .i_rd_regidx (w_rd_regidx), .o_rd_old_rnid (w_rd_old_rnid), .i_update (w_rd_valids), .i_update_arch_id (w_update_arch_id), ...
一応、これですべてのリグレッションテストが通るようになった。 合成でも、ちゃんとレジスタ数が制御できるようになっていることを確認した。
$ grep -c "int_phy_registers.*\[0\]$" tile_wrapper_ff_list.txt 79 $ grep -c "fp_phy_registers.*\[0\]$" tile_wrapper_ff_list.txt 64