在cache的相关操作中,cache控制器需要根据需求做出许多不同的选择。例如:
- 分配策略
是否需要将数据从主存中分配到cache中;
- 替换策略
组相联cache中,所有的way都已经有填充数据了,miss时决定替换掉哪一个way的cacheline;
- 写策略
cache收到处理器内核的写请求时,相应的cache行为,例如是否先写到cache中,等到实在有必要时再写入到主存中。
分配策略
当处理器内核对cache发起读写访问时,如果该访问的请求数据不在cache中时,cache控制器必须决定是否要将数据linefill到cache中,并将相应的tag也linefill到cache中 。
- read allocate
仅在读cache时分配cacheline。如果是写请求并且cache miss,则直接将数据写入到主存中,cache不受影响。
- write allocate
更准确的说法应该是读写分配策略,在cache读或者cache写,并且miss时为该数据分配cacheline。该分配策略通常与处理器内核write-back写策略配合使用 。
替换策略
基于前面提到的分配策略,当cache未命中时,cache控制器必须为该数据分配一个cacheline。被选择的cacheline就是victim。如果victim包含有效的dirty数据,则必须先将该cacheline的内容写入主存,然后才能将新数据linefill到victim cacheline。整个替换的过程称为eviction。
替换策略控制着victim选择的过程,从备选的cache line中选择哪个cache line的策略。
- Round-robin替换策略
会有一个victim counter,然后进行周期循环,选择相应的cache line,重点是实现公平性 。
- Pseudo-random替换策略
随机选择一个cacheline进行替换。
- Least Recently Used(LRU)替换策略
用于替换最近最少使用的cacheline。
写策略
当处理器内核执行store指令时,会对写入的地址执行cacheline的hit-miss check 。如果cache写 hit,cache会有两种选择 。
- Write-through
这意味着cache和主存保持一致。由于在cache hit时直接对主存进行写入操作,相同的内存区域可能被频繁更新,Write-through策略通常比write-back策略要慢 。当然,目前写入不会直接写入到主存,会通过在cache和主存之间插入write buffer来隐藏往主存写数据的latency。如果我们预期不会马上访问这个数据,建议可以采用Write-through策略,不要将该数据填入到cache中 。
- Write-back
在这种情况下,只对cache执行写操作,而不是直接对主存执行写操作。这意味着cache和主存中可以包含不同的数据。cache保存较新的数据,而主存保存包含较旧的数据 。
为了标记这些cacheline的新旧状态,每一个cacheline都有一个相关的dirty比特。当发生cache数据更新而不写入主存时,就会设置脏位。如果cache后来需要evict设置了dirty比特的cacheline,就需要将该cache line的数据写入主存。使用write-back写策略的可以显著减少对外部内存的访问,从而提高性能并节省功耗。但是,如果系统中有其他IP可以同时访问相同地址内存,则必须考虑cache一致性问题。
作者:验证哥布林
来源:芯片验证工程师
推荐阅读
- cache学习系列2:cathe的缺点,直接映射cache及组相联cache
- 处理器中基本的cache结构概述及一些cache相关的术语
- cache学习系列3:cache的性能及Write和Fetch buffer
更多数字IC设计技术干货等请关注数字芯片实验室专栏。添加极术小姐姐(微信:aijishu20)微信可申请加入IC设计交流群。