跳转至

BPU 子模块 uFTB

功能概述

uFTB 作为 BPU 的 next line predictor,为处理器作出无空泡的基础预测以连续生成下一个推测 PC 值。

uFTB 请求接收

每次 0 阶段请求有效时,截取传入预测块起始 PC 的 16 到 1 位生成 tag 发送给本模块内的全相连 uFTB 用于读取 FTB 项,FTB 项记录内容如前所述 。uFTB 各 bank 内均有 32 项使用寄存器搭建的全相连结构。由于使用寄存器实现,各项可在当拍根据其中存储数据是否有效及存储的 tag 值 是否与传入信息匹配来生成本项是否命中的信号及读出的 FTB 项数据并返回到 uFTB 层次,但这一数据并不在本拍而是在下一拍使用。

uFTB 数据读取与返回

在下一拍,uFTB 存储体已返回命中信号及读出数据。预测器进入 1 阶段。在本阶段将会从返回的命中信号中选出至多一命中项并利用该命 中项生成预测结果,生成完整预测结果的算法在后续 FTB 模块有详细叙述,这里 uFTB 有一额外补充的 counter 机制,为 uFTB 内每一项内至多 2 条分支指令增加一个 2 位宽 counter,若 counter 大于 1 或 FTB 项内 always_taken 有效(后者机制也存在于 FTB 模块中)则预测结果为跳转。此外,本级的命中信号及选出的命中路编号还被作为本预测器的 meta 信息等待其他预测器一起进入 s3 阶段时送出预测器,随最终预测结果一起存储到 FTQ。本预测器在 2、3 阶段没有其他额外动作。

uFTB 数据更新

当该预测块对应指令全部提交时,由 FTQ 传入 BPU 一直连到本模块的 update 通道中将包含 FTQ 模块根据指令提交信息更新的 FTB 项。由于全相连 uFTB 全部采用寄存器搭建存储体,写操作不会影响并行的读操作,传来的更新信息将始终用于更新。在更新通道有效时,在当拍将利用传入的更新 pc 值生成 tag 与 uFTB 内现有各项匹配并生成是否匹配及匹配的路信号。在下一拍,若存在已有匹配,将拉高匹配路的写入信号 ,否则利用伪 lru 替换算法选出一待替换路拉高对应路写入信号,写入数据即为更新的 FTB 项。

针对每个分支指令的 counter 维护也在 update 通道拉高时一并更新,在 update 通道拉高下一拍,更新 FTB 项内跳转的分支指令及其之前的分支指令对应的 counter。若 taken 则 counter+1,若不 taken 则 counter-1,如达到饱和(0 或全 1)则维持当前值不变。

伪 LRU 算法也需要数据更新,其共有两个数据源,其一为作出预测时命中的路编码,其二为 uFTB 更新时要写入的路编码,若其中任意有效 ,则利用其信息更新伪 LRU 状态,当都有效时一拍内使用组合逻辑依次使用两信息更新。

SRAM 规格

模块内不使用 SRAM,但存在较多的 reg 拼接结构,列举如下。

模块内含有 32 路数据,每一路包含 2 个 2 bit 宽饱和 counter,记录基础的分支方向预测;一个 60 bit FTB 项,具体含义与 FTB 模块相同,详见 FTB SRAM 规格描述;一个 16 bit tag 及一个 1 bit 路有效信号。

整体框图

整体框图

TODO:图与昆明湖不符,待更新

接口时序

结果输出接口

结果输出接口

上图展示了一次有效的 uFTB 输出,其下一预测块起始地址为 0x80002000。

更新接口

更新接口

上图展示了一次有效的更新请求,更新了 0x80003b9a 地址的 FTB 项。