XiangShan Bpu 设计文档
- 版本:V3
- 状态:draft
- 日期:2026/04/22
- commit:TODO
术语说明
| 缩写 | 全称 | 描述 |
|---|---|---|
| cfi | Control Flow Instruction | 控制流指令,即分支(e.g. bne)和跳转指令(e.g. j) |
| BTB | Branch Target Buffer | 分支目标缓冲器,存储分支指令的目标地址和一些元数据的缓存结构 |
子模块列表
| 子模块 | 描述 |
|---|---|
| FallThrough | S1,总是预测不跳转,当所有其他预测器都未命中或预测不跳转时提供预测结果。 |
| Ubtb | Micro Btb,S1,寄存器实现的小 BTB,提供分支信息。 |
| Abtb | Ahead Btb,S1,使用 ahead-pipeline 技术实现的中等大小的 BTB,提供分支信息。 |
| Utage | Micro Tage,S1,小 Tage,提供方向预测。 |
| Mbtb | Main Btb,S3,主 BTB,提供更准确的分支信息。 |
| Tage | TAgged GEometic History Length predictor,S3,提供更准确的方向预测 |
| Sc | Statistical Corrector,S3,使用统计模式修正 Tage 的预测。 |
| Ittage | Indirect Target Tage,S3,间接跳转指令预测器,提供间接跳转目标预测。 |
| Ras | Return Address Stack,S3,返回地址预测器,提供返回地址预测。 |
| 历史信息寄存器 | 存储分支历史信息的寄存器,供 Tage 等预测器索引存储结构使用。 |
| 饱和计数器 | 饱和计数器工具类,供各预测器使用。 |
设计规格
参数列表
功能概述
功能详述
S1 预测器组的快速训练
在 overriding 架构下,S3 预测器组会检查并纠正 S1 预测器组的结果。这同时意味着 S1 预测器组既可以像 S3 预测器组一样由后端执行单元进行训练,也可以由 S3 预测器组进行快速训练(类似于将它们作为 S3 精确预测器的缓存)。前者更加准确,后者更加及时,反应到总体 IPC 上可能会有不同的表现。
具体到每个预测器上:
- ubtb:使用参数
EnableFastTrain控制是否使用快速训练,前期评估表明快速训练有一定的性能提升,故其默认值为 true。 - abtb:由于 ahead pipeline 的设计,abtb 需要更多流水线上的信息才能进行训练,因此无法使用后端训练,仅能快速训练。
- utage:TODO
目标地址修正
为了节约存储面积,各 btb 结构不会保存完整的 50bit(Sv48x4)目标虚地址,而是仅保存低位(请参考各 btb 参数列表)。根据指令集手册,有:
- branch:跳转目标为 pc + offset,其中 offset 为 12 bit 立即数,因此仅需保存目标地址的低 14 bit(offset 需在立即数低位补一个 0,还需保存高位的进位/借位)
- jal:跳转目标为 pc + offset,其中 offset 为 20 bit 立即数,因此仅需保存目标地址的低 22 bit(同上)
- jalr:跳转目标为寄存器值,仅存低位可能误预测,但为了平衡硬件开销和性能收益,我们接受这种误预测
在预测时,我们直接将“取指块的起始地址的高位”与“保存的目标地址的低位”拼接即可在多数情况下得到正确的目标地址,但区域边界上存在进位/借位导致的例外。例如,仅存低 12 bit,若取指块起始地址 startPc = 0x12345ffe,offset = +0x20,则目标地址为 0x1234601e,但我们保存的 12bit 低位为 0x01e,简单拼接得到的目标地址为 0x1234501e。
为了解决这个问题,我们引入 2bit 的 targetCarry 标志,来记录是否存在进位/借位,并在预测时对拼接结果进行修正。这一功能可以通过 btb 的 EnableTargetFix 参数进行开关。如上对各指令类型的跳转范围分析,需要进行修正的情况理论上很少,并且原则上可以通过编译器的指令排布优化来进一步规避,因此这一额外的 2bit/entry 的开销可能是不值得的,在我们的前期评估中也没有观察到明显的性能提升,因此该功能的默认值为 false。
另请参考 TargetCarry 小节中关于 targetCarry 标志值的定义。
寄存器配置
|
寄存器 |
地址 |
复位值 |
属性 |
描述 |
|---|---|---|---|---|
|
sbpctl |
0x5C0 |
64'd0 |
RW |
bit0: ubtb 使能信号 |
注:RO——只读寄存器;RW——可读可写寄存器。
常量类型
BranchAttribute
用于表示分支属性,具有以下两个域:
.branchType:分支类型0:非分支指令/表项无效1:条件分支(e.g.bne)2:直接跳转(e.g.jal)3:间接跳转(e.g.jalr)
.rasAction:RAS 动作,另请参考 RISC-V 指令集手册 Return-address stack prediction hints0:无动作(非分支指令、表项无效、条件分支)1:pop(return,e.g.jalr zero, offset(ra))2:push(call,e.g.jal ra, offset)3:pop and push(return and call,e.g.jalr ra, offset(ra))
TargetCarry
用于表示跳转目标地址的低位进位/借位标记:
0:fit,即无进位/借位,target = Cat(targetUpper, targetLower)1:overflow,需要进位,i.e.target = Cat(targetUpper + 1, targetLower)2:underflow,需要借位,i.e.target = Cat(targetUpper - 1, targetLower)
另请参考 目标地址修正 一节中关于该标记的使用说明。
参考文件
- Reinman G, Austin T, Calder B. A scalable front-end architecture for fast instruction delivery[J]. ACM SIGARCH Computer Architecture News, 1999, 27(2): 234-245.
- Perais A, Sheikh R, Yen L, et al. Elastic instruction fetching[C]//2019 IEEE International Symposium on High Performance Computer Architecture (HPCA). IEEE, 2019: 478-490.
- Software Optimization Guide for AMD Family 19h Processors (PUB), Chap. 2.8.1.5, https://www.amd.com/system/files/TechDocs/56665.zip
- Seznec A, Michaud P. A case for (partially) TAgged GEometric history length branch prediction[J]. The Journal of Instruction-Level Parallelism, 2006, 8: 23.
- Seznec A. A 256 kbits l-tage branch predictor[J]. Journal of Instruction-Level Parallelism (JILP) Special Issue: The Second Championship Branch Prediction Competition (CBP-2), 2007, 9: 1-6.
- Seznec A. A new case for the tage branch predictor[C]//Proceedings of the 44th Annual IEEE/ACM International Symposium on Microarchitecture. 2011: 117-127.
- Seznec A. The O-GEHL branch predictor[J]. The 1st JILP Championship Branch Prediction Competition (CBP-1), 2004.
- Jiménez D A, Lin C. Dynamic branch prediction with perceptrons[C]//Proceedings HPCA Seventh International Symposium on High-Performance Computer Architecture. IEEE, 2001: 197-206.
- Seznec A. A 64-Kbytes ITTAGE indirect branch predictor[C]//JWAC-2: Championship Branch Prediction. 2011.