![3729d5802ed461cc69cf7fab506dd470.png](https://img-blog.csdnimg.cn/img_convert/3729d5802ed461cc69cf7fab506dd470.png)
之前在RISC-V的“Demo”级项目——Rocket-chip一文中曾经简介过BOOM处理器的流水线,这次我们开始一个系列,深入学习一下BOOM的微架构,这样对于乱序执行的超标量处理器会有一个较为深入的认识。
本系列计划按照流水线的前后顺序,第一篇讲前端的取指和分支预测,第二篇讲译码和寄存器重命名,第三篇介绍ROB和指令的发射,第四篇介绍指令的执行和Bypass机制,第五篇讲BOOM的访存和存储系统, 最后从使用的角度来讲一下BOOM中的Chisel Parameter配置方式。
本文是BOOM系列的第一篇,先从取指单元以及BOOM的分支预测器入手。
BOOM的取指单元
在介绍取指单元之前先回顾两个概念方便下文讨论:一个叫前端(Front-end),指流水线中的取指和分支预测部分,这一部分将指令从I-Cache中取出;另一个叫后端(Back-end),指流水线中从派发到写回阶段的这一部分,也就是指令的执行阶段。
BOOM的前端如下图所示,它包括取指和分支预测在内共划分为5个周期(从F0到F4)。当后端发现分支预测错误,或者分支预测器预测需要改变取指的位置,就会给前端发一个请求,前端就会从新的PC开始取指令。
![1709529ab5dc2f2b60b9cd14d15eecf3.png](https://img-blog.csdnimg.cn/img_convert/1709529ab5dc2f2b60b9cd14d15eecf3.png)
BOOM并不是每次从I-Cache中取一条指令,而是一次从指令缓存中取出一个Fetch Packet的指令(就像是批发一样,一次批发一包指令进来)。之后对这些指令进行快速译码(为分支预测提供信息),并写到Fetch Buffer(Fetch Buffer是一个将前后端解耦的指令队列)中供后端使用;同时将给后端用的PC和分支预测信息则写到Fetch Target Queue中(Fetch Target Queue保存着从I-Cache取得的指令的地址以及地址对应的分支预测信息;当指令被提交后,ROB会从Fetch Target Queue中取出该指令的相应信息;当取指单元重定向时Fetch Target Queue会被更新)。
另外,BOOM必须要考