RISC-V BOOM核学习

来源:RISC-V BOOM documentation

RISC-V BOOM核学习

The Berkeley Out-of-Oder Machine

INTRODUCTION

RV64GC

在这里插入图片描述
Fig. 1 Detailed BOOM Pipeline. ’s denote where the core can be configured.

The BOOM Pipline

在这里插入图片描述
Fig. 2 Simplified BOOM Pipeline with Stages

BOOM为10级流水线,实际实现为7级:(1)Fetch (2)Decode/Rename (3)Rename/Dispatch (4)Issue/RegisterRead (5)Execute (6)Memory (7)WriteBack,commit异步发生,不属于流水线。

  1. Fetch:从instruction memory取指后放入FIFO queue(即Fetch Buffer),分支预测按需重定向取指。
    Branch:BOOM支持全分支推测与分支预测。每条指令都有Branch Tag标记其处于哪一个分支预测之下,预测错误的分支需要终止依赖于该分支的所有指令。分支指令Rename时,其Register Rename TableFree List将被复制,预测错误时会恢复处理器状态。

  2. Decode:从Fetch Buffer取指,生成微操作Micro-Ops(即UOPs)放入流水线。

  3. Rename:ISA/logical register specifier(寄存器说明符,eg.x0-x31)-> physical register specifier。

  4. Dispatch:UOPs分派到一系列Issue Queue中。

  5. Issue:位于Issue queue的UOPs的所有操作数就绪后issue(发出),乱序的开始。

  6. Register Read:被发出的UOPs首先从unified Physical Register File(统一的寄存器文件)或Bypass Network(旁路网络)读取寄存器操作数。

  7. Execute:然后进入functional units(功能单元)所在的Execute阶段,发出的memory oprations(内存操作)在执行阶段进行地址计算后将结果地址存储在Memory阶段的Load/Store Unit(加载/存储单元)。

  8. Memory:Load/Store Unit包括三个队列:

    • LAQ(Load Address Queeu):LAQ中有地址时从内存中加载数据
    • SAQ(Store Address Queue)、SDQ(Store Data Queue):Commit time向内存存储数据,address和data都放入SAQSDQ时才能被commit。
  9. Writeback:ALU操作和Load操作被写回Physical Register File

  10. Commit:ROB(Reorder Buffer)跟踪流水线中每条指令的状态。ROB头不忙时,ROB提交指令。对于Store,ROB向Store Queue(SAQ/SDQ)队首的store操作发送store信号,表示可将数据写入内存。

在这里插入图片描述
Fig. 3 Detailed BOOM Pipeline. ’s denote where the core can be configured.

The Chisel Hardware Construction Language

The RISC-V ISA

Rocket Chip SoC Generator

在这里插入图片描述
Fig. 4 A single-core “BOOM-chip”, with no L2 last-level cache

CORE OVERVIEW

01 Instruction Fetch

在这里插入图片描述
Fig. 5 The BOOM Front-end

  • Front-end:Fetch和Branch Prediction阶段(从i-cache取指)
  • Back-end:从Dispatch到WriteBack阶段,指令执行、解决依赖、解决分支。
  • Fetch Packet:Front-end返回的一个包,包含一组连续指令,其中mask(掩码)表示哪些指令有效,以及和instruction fetch和branch prediction有关的meta-data,Fetch PC指向Fetch Packet中第一条有效指令。
  • Fetch Boundary:i-cache response末尾字节,可能是RVC指令的一半。

BOOM核与Rocket核均实例化自己的Front-end。Front-end在多个取指周期(F0,F1…)重定向指令流。如果在Back-end检测到预测错误,或者BOOM预测器希望将流水线重定向到另一个方向,会向front-end发送请求并开始沿新的指令路径取指。

由于支持superscaler fetch(超标量取指),Front-end从instruction memory中检索指令的Fetch Packet并将其放入Fetch Buffer。Fetch Packet包含一些其他meta-data,如valid mask(有效掩码,包中哪些指令有效)、一些branch prediction信息。此外,PC和branch prediction信息被存储在Fetch Target Queue

The Rocket Core I-Cache

BOOM实例化了取自Rocket Processor源代码的i-cache,i-cache是virtually indexed(虚拟索引)和physical tagged(物理标记)关联的cache。

为了降低功耗,i-cache读出固定字节(aligned对齐)存入fetch register,后续取指由该寄存器管理。i-cache只有在fetch register耗尽或分支预测将PC指向其他地方时才会再次启动。

目前,i-cache不支持跨cache-lines取指,也不支持超标量未对齐取指。

目前,i-cache不支持hit-under-miss。如果i-cache miss,i-cache不接受任何进一步请求直到miss被处理,这对于流水线发现预测失误后的重定向 i-cache以沿正确路径取指不理想。

Fetching Compressed Instructions

压缩指令RVC对于32b指令无对齐要求,可以从半字处开始取指,所有16b指令都直接映射到较长的2b指令。

在Front-end阶段,BOOM从i-cache中检索Fetch Packet,快速decode用于branch prediction的指令,并将Fetch Packet存入Fetch Buffer,带来需要处理的问题是:

  • 解码复杂度增加
  • 找到指令起始处
  • 在整个代码库中删除+4预测,尤其是分支处理
  • 未对齐指令,尤其是从cache lines和virtual pages上运行的指令

对于最后一点,需要在Fetch Unit增加额外的statefulness(状态),因为获取一条指令的所有部分可能需要多个周期。

下面通过描述指令的生命周期来描述RVC在BOOM的实现:

  • Front-End返回FetchWidth16bits宽的Fetch Packet*。
  • 在F3,维持statefulness,Fetch Packets从i-cache response queue出队进入Fetch Buffer
  • F3跟踪最后一个Fetch Packet的后16b、PC、指令边界,这些位与当前Fetch Packet组合扩展为FetchWidth×32bits以便进入Fetch Buffer,Predecode确定此Fetch Packet中每条指令的起始地址,同时为Fetch Buffer生成掩码。
  • 存储到内存时,Fetch Buffer压缩无效或未对齐指令。

其他实现细节:

  • 处理跨取指边界指令,认为这些指令属于包含其高16bits的Fetch Packet,在确定这些指令PC时,跟踪最初在Fetch Boundary上未对齐的所有指令。
  • 流水线需要跟踪指令最初为16b还是32b,用于计算PC+4或PC+2。
The Fetch Buffer

来自i-cache的Fetch Packet被放入Fetch Buffer,Fetch Buffer将Front-End取指和Back-End执行分离。Fetch Buffer是参数化的,大小可变,并且可以切换是否以flow-through queue实现。

The Fetch Target Queue

Fetch Target Queue保存从i-cache接收的PC以及与该地址关联的分支预测信息,供流水线执行UOP时参考。ROB在指令被commit时将其出队,并在流水线重定向/执行错误时update。

02 Branch Prediction

在这里插入图片描述
Fig.6 The BOOM Front-End

BOOM有两种分支预测:

  • NLP(Next-Line Predictor):fast,Branch Target Buffer
  • BPU(Backing Predictor):slow but complex, GShare predictor结构(更复杂)

NLP:由Branch Target Buffer (BTB)、Return Address Stack (RAS)、Bi-Modal Table (BIM)构成,用于快速预测以redirect the Front-End。
BTB :分支目标缓冲区,表项中的PC用于查找匹配目标,如果命中,指定的目标将用于redirect the pipeline。
RAS:流水线返回地址栈:用于跟踪函数调用的堆栈,JAL或 JALR时PC入栈,RET时PC出栈。
BIM:一个计数表。

BPU:用于跟踪更长历史,BOOM核中有多种不同类型BPU(TAGE, GShare…)。

The Next-Line Predictor (NLP)

Front-End取指并在预测每个cycle从何处取下一条指令,若Back-End检测出misprediction,或自身BPD希望redirect the pipeline,会向Front-end发送request并开始沿新的指令路径取指。

NLP接收当前用于取指的PC(the Fetch PC,Fetch Packet instruction group头对应的PC),并综合预测下一周期应在何处取指,若预测正确则无流水线气泡(pipeline bubbles)。

NLP Predictions

Fetch PC 首先执行目标匹配,以找到唯一匹配的BTB条目。若命中,BTB条目与RSA共同预测,以确定Fetch Packet中是否存在branch、jump、return指令,以及Fetch Packet中哪条指令是错误的。BIM用于确定所作的prediction是否执行了branch。BTB条目还包含了一个预测的目标PC,作为下一周期的Fetch PC。

在这里插入图片描述
Fig.7 NLP unit。Fetch PC搜索BTB的PC tags进行匹配。若命中,BIM和RAS做出final verdict(最终裁决)。若条目为ret,则tagrt来自RAS;若条目为无条件jmp,则不咨询BIM。“bidx”(或称branch index)标记了超标量Fetch Packet中造成控制流预测的指令,这对于屏蔽Fetch Packet中经过分支执行的其他指令。

BIM中的hysteresis bits(滞后位)仅在BTB条目命中且预测指令为branch时被使用。

如果BTB条目包含return指令,RAS栈将提供预测的return PC作为下一条Fetch PC,实际的RAS管理(何时执行/堆栈)由外部控制。

为提高空间利用率,PC tags和PC targets的高位被存储在压缩为文件中。

NLP Updates

沿pipline传递的每个分支不仅记住自身的PC,还有它的Fetch PC(Fetch Pack

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值