Main Pipeline
NanHu 架构使用 Main Pipeline (dcache 主流水线) 处理 store, probe, 原子指令和替换操作. Main Pipeline 负责所有需要争用 writeback queue 向下层 cache 发起请求/写回数据的指令的执行.
Info
相比上一代雁栖湖架构, 南湖架构将 refill 操作从 Main Pipeline 中独立成单独的流水线. 其他的操作并没有从 Main Pipeline 中剥离, 原因是处理多条流水线间冲突/资源争用的成本超过了拆分流水线的性能收益.
MainPipe 各级流水线的功能
Stage 0
- 仲裁传入的 Main Pipeline 请求选出优先级最高者
- 根据请求信息判断请求所需的资源是否就位
- 发出 tag, meta 读请求
Stage 1
- 获得 tag, meta 读请求的结果
- 进行 tag 匹配检查, 判断是否命中
- 如果需要替换, 获得 PLRU 提供的替换选择结果
- 根据读出的 meta 进行权限检查
- 提前判断是否需要执行 miss queue 访问
Stage 2
- 获得读 data 的结果, 与要写入的数据拼合
- 如果 miss, 尝试将这次请求信息写入 miss queue
Stage 3
- 根据操作的结果, 更新 meta, data, tag
- 如果指令需要向下层 cache 发起访问/写回数据, 则在这一级生成 writeback queue 访问请求, 并尝试写 writeback queue
- 在 release 操作生效并更新 meta 时, 在这一级向 load queue 给出 release 信号来进行违例判断
- 对于原子指令的特殊支持
- AMO 指令在这一级停留两拍, 先在这一流水级完成 AMO 指令的运算操作, 再将结果写回到 dcache
- LR/SC 指令会在这里设置/检查其 reservation set queue
MainPipe 争用和阻塞
Main Pipeline 的争用存在以下优先级:
- probe_req
- replace_req
- store_req
- atomic_req
一个请求只有在其所请求的资源全部就绪, 不存在 set 冲突, 且没有比它优先级更高的请求的情况下才会被接受. 来自 committed store buffer 的写请求由于时序原因, 拥有单独的检查逻辑.