FPGA開発日記

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

独自RISC-V CPUコアの実装 (リネーム)

独自CPUコアをRISC-Vで実装している。リネームの部分について、とりあえず形だけFreelist, RenameMapだけを作った。Freelistは新しいリネームIDを取得するためのキューみたいなもの、リネームマップは現在のアーキテクチャレジスタ番号がどのリネームIDに割り当てられているかを検索する。とりあえずまだ全然作りかけである。

module freelist
  #(
    parameter SIZE = 32,
    parameter WIDTH = 5,
    parameter INIT = 0
    )
(
 input logic              i_clk,
 input logic              i_reset_n,

 input logic              i_push,
 input logic [WIDTH-1:0]  i_push_id,

 input logic              i_pop,
 output logic [WIDTH-1:0] o_pop_id
 );

logic [WIDTH-1:0]         r_freelist[SIZE];

logic [$clog2(SIZE)-1:0]  r_head_ptr;
logic [$clog2(SIZE)-1:0]  r_tail_ptr;

always_ff @ (posedge i_clk, negedge i_reset_n) begin
  if (!i_reset_n) begin
    r_head_ptr <= 'h0;
    r_tail_ptr <= 'h0;
    for (int i = 0; i < SIZE; i++) begin
      /* verilator lint_off WIDTH */
      r_freelist[i] <= INIT + i;
    end
  end else begin
    if (i_push) begin
      r_tail_ptr <= r_tail_ptr + 'h1;
      r_freelist[r_tail_ptr] <= i_push_id;
    end
    if (i_pop) begin
      r_head_ptr <= r_head_ptr + 'h1;
    end
  end
end

assign o_pop_id = r_freelist[r_head_ptr];

endmodule // freelist
module mrh_rename_map
  (
   input logic                              i_clk,
   input logic                              i_reset_n,

   input logic [mrh_pkg::DISP_SIZE * 2-1:0] i_arch_valid,
   input logic [ 4: 0]                      i_arch_id[mrh_pkg::DISP_SIZE * 2],
   output logic [mrh_pkg::RNID_W-1: 0]      o_rnid[mrh_pkg::DISP_SIZE * 2],


   input logic [mrh_pkg::DISP_SIZE-1:0]     i_update,
   input logic [ 4: 0]                      i_update_arch_id [mrh_pkg::DISP_SIZE],
   input logic [mrh_pkg::RNID_W-1: 0]       i_update_rnid [mrh_pkg::DISP_SIZE]
   );

リネームマップに関しては、新たにリネームIDが先行する命令によって割り当てられる場合それを即時に参照する必要があり、その辺のロジックは全然足りていないのだが、地味に実装して行こうと思う。