该cache映射策略为直接映射,采用写回(writeback)方式。
需要注意的细节在于cpu-cache通过mask信号判断访存是读还是写,显然mask全0时为读。下图FSM中省略了dirty会影响状态转移,比如WriteCache到WriteBack,当cache块为dirty时才会触发aw.fire(io.nasti.aw.valid := is_dirty)。
简单解释:
-
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的数据旁路得到的。
标签:MINI,RISCV,nasti,cache,dirty,refill,WriteCache,转移 From: https://www.cnblogs.com/nosae/p/17664608.html