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];
なるほど、構成はなんとなくわかった気がする。