FPGA開発日記

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

オープンソース・アウトオブオーダCPU NaxRiscvを概観する (15. FetchCachePluginをSystemVerilogに変換する)

NaxRiscvの実装を解析しながら、SystemVerilog化することで理解を深めていこうと思う。

FetchCachePluginには、いくつかのRAMが定義されている。

  reg [63:0] FetchCachePlugin_logic_banks_0_mem [0:511];
  reg [63:0] FetchCachePlugin_logic_banks_1_mem [0:511];
  reg [63:0] FetchCachePlugin_logic_banks_2_mem [0:511];
  reg [63:0] FetchCachePlugin_logic_banks_3_mem [0:511];
  (* ram_style = "distributed" *) reg [21:0] FetchCachePlugin_logic_ways_0_mem [0:63];
  (* ram_style = "distributed" *) reg [21:0] FetchCachePlugin_logic_ways_1_mem [0:63];
  (* ram_style = "distributed" *) reg [21:0] FetchCachePlugin_logic_ways_2_mem [0:63];
  (* ram_style = "distributed" *) reg [21:0] FetchCachePlugin_logic_ways_3_mem [0:63];
  (* ram_style = "distributed" *) reg [2:0] FetchCachePlugin_logic_plru_ram [0:63];

FetchCachePlugin_logic_banks_*_memはおそらく命令キャッシュのデータを格納する本体だと思う。

  • 書き込み時動作:
    • 書き込み条件 : (FetchCachePlugin_mem_rsp_valid && (FetchCachePlugin_logic_refill_wayToAllocate == 自身のway));
    • アドレス:{FetchCachePlugin_logic_refill_address[11 : 6],FetchCachePlugin_logic_refill_wordIndex};
  • 読み込み時動作:
    • 読み込み条件:全バンク共通して (! (FetchPlugin_stages_0_valid && (! FetchPlugin_stages_0_ready)))
    • アドレス:全メモリ共通して FetchPlugin_stages_0_Fetch_FETCH_PC[11 : 3];

例えば、wordIndexが3ビットならば、1回のキャッシュブロックフェッチで、連続した8エントリが書き込まれるっぽいな。

それぞれのメモリは、バンクというよりもWayとして、PLRUで格納するアドレスを決めているっぽいな。

一方で、FetchCachePlugin_logic_ways_0_memはタグ情報を格納するのだと思う。

  • 書き込み時動作:
    • 書き込み条件:FetchCachePlugin_logic_refill_fire & FetchCachePlugin_logic_refill_wayToAllocate で示されるWayのメモリ
    • アドレス:全Wayで共通して FetchCachePlugin_logic_refill_address
  • 読み込み時動作:
    • 読み込み条件:常時
    • 読み込みアドレス:FetchPlugin_stages_0_Fetch_FETCH_PC[11 : 6];

なるほど、構成はなんとなくわかった気がする。