跳转至

访存系统

Zircon-2024采用了二级缓存的结构,一级缓存包括指令缓存(ICache)和数据缓存(DCache),二级缓存由L2 Cache组成,并采用数据包含式的L2 Cache设计。

指令高速缓存(ICache)

Zircon-2024采用自研的ICache来缓存内存中的指令。这是一个支持采用Virtual Index Physical Tag(VIPT)的2路组相连,大小参数可配置的阻塞式缓存(目前还没有加入完整的MMU支持)。

在旧版本的设计中,ICache曾可支持跨行访问,但随着分支预测的引入,指令获取部分给出了新的规则,这种跨行访问方案就变得不再具有明显意义。因此为了降低功耗和资源消耗量,在后续的设计中,ICache不再支持跨行访问。

为了节省功耗,只有ICache只有在需要读写时,其读写端口的使能信号才会有效。这是由其内部的状态机进行控制的。

目前,ICache只使用了BRAM存储器的一个通道,第二个通道未来可能会用作预取设计。

数据高速缓存(DCache)

DCache的结构相比ICache更为复杂。为了支持超标量结构,DCache拥有两个相对独立的数据通道,分别用来处理推测读写和写提交。

推测数据通道

当一条访存指令由发射队列发射到流水线并进入DCache时,它会首先进入推测数据通道。在这个通道内,读操作会被立刻执行,而写操作并不会立刻对DCache存储器生效,这是因为此时的写操作很有可能在错误的分支路径上,一旦真的写入DCache,则此操作是极难撤回的。因此,写操作会暂存于推测数据通道的写缓冲(Store Buffer)中,等待ROB的提交确认。

推测数据通道采用了写回策略,使用LRU算法进行替换。一旦一个Cache Line被替换出DCache,它会直接整行地写入L2 Cache中。

写提交通道

当一条写操作被ROB确认为可提交的指令后,Store Buffer会将此条指令的请求送入DCache的写提交通道中,并写入DCache的存储器中。

写提交通道采用了写直达写不分配的策略,每次写操作都会直达L2 Cache,由于L2 Cache本身也是Cache,所以这种策略并不会带来太多延迟。同时,如果该写请求没有命中DCache,该通道也不会将这个被写入的Cache Line调入DCache,因为下次访问该Cache Line时,该行极大概率已经存在于L2 Cache中,其访问代价是完全可以接受的。

L2 Cache

L2 Cache是指令——数据混合缓存,它同时缓存指令和数据。为了支持ICache和DCache的并行访问,L2 Cache具有两个独立通道,分别处理来自ICache和DCache的请求。

指令——数据含量比控制

对于混合Cache而言,由于流水线的取指请求是远远多于数据请求的,且取指请求会存在很多激进的推测行为,因此,如果不加以控制,那么L2 Cache的存储将会很快被指令占满,从而导致DCache无法高效获取缓存数据。因此,Zircon-2024的L2 Cache对Cache请求的读写可见度进行调整,

L2 Cache拥有4路缓存,ICache和DCache的每一次请求在读取数据时总能看到全部的4路数据。但是,该4路数据中,前2路被静态分配给ICache,后2路被静态分配给DCache。

  • 当ICache的请求不在L2 Cache中时,从主存被调入的数据只会被写入前2路的存储器中。
  • 当DCache的请求不在L2 Cache中时,从主存被调入的数据只会被写入后2路的存储器中。但如果DCache本次写操作命中,那么4路的数据都可以被写入。

这样的设计可以保证由ICache发起的替换数据不会超过L2 Cache总容量的50%,从而保证DCache的缓存命中率。同时,DCache的写命中策略也可以保证自修改程序的正确性。