FPGA開発日記

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

自作CPUの分岐予測器のデグレード解析

これは単純なメモだが、自作CPUの性能が落ちてしまっていて、どこがおかしいんだ?と思いながら見ていたが、どうやらもともと実装ミスがあるっぽい。

GShareの実装に論理的なミスがあったので修正する。

diff --git a/src/scariv_gshare.sv b/src/scariv_gshare.sv
index e1e6581..bdfc9ec 100644
--- a/src/scariv_gshare.sv
+++ b/src/scariv_gshare.sv
@@ -33,8 +33,6 @@ gshare_bht_t  w_bhr_next; // Branch History Register : 1=Taken / 0:NonTaken
 gshare_bht_t  w_bhr_lane_next[scariv_lsu_pkg::ICACHE_DATA_B_W / 2];

 logic [ 1: 0] w_update_counter;
-logic [ 1: 0] w_s1_bim_counter;
-logic [ 1: 0] r_s1_bim_counter_dram;

 logic         s1_update_bhr;
 assign s1_update_bhr = r_s1_valid & |(search_btb_if.s1_hit & search_btb_if.s1_is_cond);
@@ -55,6 +53,8 @@ always_ff @ (posedge i_clk, negedge i_reset_n) begin
 end

 generate for (genvar c_idx = 0; c_idx < scariv_lsu_pkg::ICACHE_DATA_B_W / 2; c_idx++) begin : bhr_loop
+logic [ 1: 0] w_s1_bim_counter;
+logic [ 1: 0] r_s1_bim_counter_dram;
   gshare_bht_t  w_s0_xor_rd_index;
   gshare_bht_t  r_s1_xor_rd_index;
   assign w_s0_xor_rd_index = r_bhr ^ gshare_search_if.s0_pc_vaddr[$clog2(scariv_lsu_pkg::ICACHE_DATA_B_W) +: GSHARE_BHT_W];

一応性能的には戻ったかな?ALUのスケジューラが今のところイマイチのままにしているので、もうちょっと修正しないといけない。

serialdevice: uart loaded
      1000 :        771 : IPC(recent) = 0.77, IPC(total) = 0.77
      2000 :       1569 : IPC(recent) = 0.80, IPC(total) = 0.78
      3000 :       2115 : IPC(recent) = 0.54, IPC(total) = 0.70
      4000 :       2900 : IPC(recent) = 0.79, IPC(total) = 0.72
      5000 :       3915 : IPC(recent) = 1.01, IPC(total) = 0.78
      6000 :       5613 : IPC(recent) = 1.70, IPC(total) = 0.94
      7000 :       7386 : IPC(recent) = 1.77, IPC(total) = 1.06
      8000 :       9272 : IPC(recent) = 1.89, IPC(total) = 1.16
      9000 :      11181 : IPC(recent) = 1.90, IPC(total) = 1.24
     10000 :      13107 : IPC(recent) = 1.92, IPC(total) = 1.31
     11000 :      15003 : IPC(recent) = 1.90, IPC(total) = 1.36
     12000 :      16758 : IPC(recent) = 1.75, IPC(total) = 1.40
     13000 :      18647 : IPC(recent) = 1.89, IPC(total) = 1.43
     14000 :      20567 : IPC(recent) = 1.92, IPC(total) = 1.47
     15000 :      22494 : IPC(recent) = 1.93, IPC(total) = 1.50
     16000 :      24326 : IPC(recent) = 1.83, IPC(total) = 1.52
     17000 :      26216 : IPC(recent) = 1.89, IPC(total) = 1.54
     18000 :      28137 : IPC(recent) = 1.92, IPC(total) = 1.56
     19000 :      29912 : IPC(recent) = 1.77, IPC(total) = 1.57
     20000 :      31857 : IPC(recent) = 1.94, IPC(total) = 1.59
     21000 :      33729 : IPC(recent) = 1.87, IPC(total) = 1.61