RISCV-MINI cache小记

发布时间 2023-08-29 14:15:49作者: NOSAE

该cache映射策略为直接映射,采用写回(writeback)方式。

需要注意的细节在于cpu-cache通过mask信号判断访存是读还是写,显然mask全0时为读。下图FSM中省略了dirty会影响状态转移,比如WriteCache到WriteBack,当cache块为dirty时才会触发aw.fire(io.nasti.aw.valid := is_dirty)。

image-20230829140857398

简单解释:

  • Idle

    若收到访存请求,通过判断mask是否全0分别转移到读/写(ReadCache/WriteCache)

  • ReadCache

    若cache命中,检测是否有新的访存请求,如果没有请求则转移到Idle,否则继续ReadCache

    若cache缺失,下一步需要从内存中读取到cache中,这个过程称为refill。refill前检测cache块是否dirty,如果dirty则转移到WriteBack,否则转移到Refill

  • WriteCache

    若cache命中或写分配(等效于命中)或中止写入,则转移到Idle

    否则,检测cache块是否dirty,如果dirty则转移到WriteBack,否则转移到Refill

  • WriteBack

    往nasti master写入脏cache块,转移到WriteAck

  • WriteAck

    等待写响应,然后转移到RefillReady(因为nasti write是refill触发的,因此nasti write的下一步就是refill)

  • RefillReady

    等待读地址有效,然后转移到Refill

  • Refill

    从nasti master往cache加载内存数据,然后判断cpu_mask是否全0分别转移到Idle/WriteCache

当read miss并且refill后,该read的数据是从refill的数据旁路得到的。