11. LSU

Load/Store Unit

Load/Store Unit,用于对访存操作进行重新排序和转发。

警告

当前Load和Store操作共用一个FU,而且LSU中只有Store Queue;在将来的版本中,该部件可能会有较大的改动。

本文档只记录当前版本的LSU设计。

11.1. Store Queue

Store队列用于缓存未提交的Store操作的结果,以及将未提交的Store的结果转发给后续的Load操作。

由于RISC-V允许未对齐的读写操作,而读写的最小单位是字节,我们规定Store Queue里的地址都是对齐的,同时给每个字节设置掩码。 例如,一个向0x1001的Store Byte操作为一个向0x1000的第一个字节的写操作。 当Store操作提交时,掩码会作为WSTRB交给总线或者交给Cache。

由于Store Queue中后面的项可能覆盖前面的项,SQ向LSU FU的转发是一个复杂的比较操作; 对于每个字节,我们分别确定指向这个字节的SQ项中最新的一项。 因为这个操作复杂度较高,我们减小了SQ的大小至四项。

11.2. 访存提交

警告

当前没有实现Cache,所有的操作可以视为总线操作。

在有Cache的情况下,SQ提交的总线操作只会是IO操作而不可能是内存操作,二者可以被轻松区分。 此时不存在SQ向总线写内存的时候LSU FU需要从总线读内存的情况,访内存时只需要总线竞争,不要求强制的顺序或锁。

当提交时,SQ在一个周期内将第一项提交给L1缓存或者总线。

由于L1 Cache可能需要多个周期进行维护,且大多数总线操作无法一周期完成,我们使用一个大小为1的缓冲区来缓存写入操作; 写入操作完成前,所有其它元件不被允许访问总线。