FPGA開発日記

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

自作CPUコアの物理レジスタのサイズを型に応じてConfigurableに変更する

自作アウト・オブ・オーダ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