实验:逐拍追踪一次分支预测
实验目标
找出一条发生误预测的条件分支,从预测请求一直跟到后端 redirect,并确认预测历史如何恢复。实验不要求先理解所有信号。
最小观察集合
在 Verdi 中按层次寻找以下语义信号(生成 RTL 的精确名字可能随版本变化):
- Predictor 的 s0 PC 与各级 fire/ready;
- s1/s2/s3 的 taken、target 与命中信息;
- 写入 FTQ 的预测响应;
- 后端 redirect 的 valid、PC 与原因;
- predictor update 的 valid、实际 taken/target;
- redirect 前后的 global history。
操作步骤
- 运行一个包含循环和函数调用的小程序。
- 在波形中以
redirect.valid为触发点向前回看。 - 记录产生 redirect 的 FTQ 项与预测 PC。
- 回到该 PC 第一次进入 BPU 的周期。
- 按 s0 → s1 → s2 → s3 记录每级给出的结果。
- 比较预测 target 与后端实际 target。
- 继续向后观察 update,确认训练发生且使用了原预测的 meta。
实验记录模板
| 项目 | 记录值 |
|---|---|
| 分支 PC | |
| 分支类型 | conditional / call / return / indirect |
| FTB 是否命中 | |
| 最终预测 taken/target | |
| 实际 taken/target | |
| redirect 周期 | |
| 使用的 FTQ 项 | |
| 更新了哪些预测组件 |
常见误区
不要看到某一级结果错误就立刻认定最终预测错误。预测是分阶段修正的;应以送入 FTQ/IFU 的最终有效响应为准。
完成标准
你能用自己的话解释:为什么发生这次误预测、错误在哪一级被发现、浪费了多少周期、哪些预测结构因此被训练。