Page 50 - 《软件学报》2025年第9期
P. 50
韩金池 等: Spike-FlexiCAS: 支持缓存架构灵活配置的 RISC-V 处理器模拟器 3961
被踢出. FlexiCAS 同样把替换策略抽象为一个模块 (图中为 replacer), 目前 FlexiCAS 支持先进先出 (FIFO)、最近
最少使用 (LRU)、再访问间隔预测 (RRIP) [33] 和随机的替换策略. 用户在现有框架的基础上也可以扩展和测试其
他的替换策略的性能. 通信端口在处理完一次驱逐、读或写等事务后会执行对应的性能统计接口函数, 更新替换
计数器和性能计数器的值. FlexiCAS 将性能计数器的管理模块放在了缓存结构中 (图中为性能计数管理器), 用户
可以在初始配置阶段选择要挂载哪些计数器.
Skew 0 Skew 1
way 0 way 1 way 0 way 1
Set 0 性能计数器
1
Set 1
Set 2 性能计数器
缓存 性能计数 2
Set 3 管理器
Set 4 性能计数器
3
Set 5
性能计数器
4
Indexer Replacer
图 4 Cache 存储结构图
一致性协议作为缓存的状态机, 需要根据端口所处理的事务、缓存和缓存块的状态、缓存的结构等诸多方面
去决定下一步的行为. 此外, 它还要在缓存的每一步操作后根据具体使用的一致性协议对缓存块的状态进行修改.
2.5 FlexiCAS 的使用方式
FlexiCAS 的代码框架全部使用类模板的实现方式, 大部分类的参数都放到了模板参数中定义. 用户除了能将
FlexiCAS 接入 Spike 使用, 也可以单独用 FlexiCAS 模拟缓存的行为. 目前 FlexiCAS 已经定义了足够全面的类模
板解析函数, 用户可以快速地搭建起一个可以使用的缓存模型.
后文图 5 展示了一个如何使用 FlexiCAS 搭建三级缓存的例子. 代码的第 5–10 行创建了各级缓存、内存以及
作为一致性总线向末级缓存的各个切片 (slice) 分发消息的分配器, 第 11 行创建了一个记录缓存读写行为的性能
计数器, 第 14–19 行负责将各级缓存对应的内外侧端口进行连接, 第 20 行将末级缓存的各个切片和性能计数器连
接, 至此便很简洁地完成了三级缓存系统的搭建. 第 22、23 行用于获取指令和数据缓存面向处理器的接口, 之后
用户可以使用表 4 定义的消息函数来驱动这些接口以此模拟缓存的行为.
3 Spike 接入 FlexiCAS
当通过高速处理器模拟器进行缓存微架构研究时, 模拟器的缓存模型需要尽可能贴近真实处理器, 同时缓存
模型的性能计数器需要尽可能丰富, 并支持动态访问、修改. 因此 Spike 无法直接用于处理器缓存微架构的研究,
本文实现的全系统处理器模拟器 Spike-FlexiCAS 通过使用 FlexiCAS 代替 Spike 原有的缓存模型, 使模拟器缓存
行为尽可能地贴近真实处理器.
3.1 缓存模型接口
Spike-FlexiCAS 通过将 Spike 的 MMU 中的所有缓存请求同步到 FlexiCAS 缓存模型接口, 替代了原有的缓存
模型. 在 Spike 的 MMU 中, 有 3 类行为会访问缓存模型: 数据读写、软件指令缓存访问和缓存块清理/失效操作.
当 MMU 进行数据读写时, 经过软件 TLB 模块完成地址转换后, 将相应的读写请求同步到 FlexiCAS 的读写接口.

