蜂鸟E203 硬件学习-两级流水线的实现(二)

(一)IFU模块
在这里插入图片描述
(1)根据PC的地址访问ITCM或者BIU (地址判别与ICB总线MASTER接口) (e203_ifu_ift2icb.v)
首先存储器ITCM与Icache的优缺点:

  • ITCM(Tightly Coupled Memory):访问延迟小且每次访问的延迟固定,但是由于使用地址区间寻址,无法映射整个地址空间(由于极低功耗处理器都应用于实时性较高的场景中,更倾向于延迟确定的ITCM)
  • Icache:访问延迟较ITCM要大,且如果发生cache miss情况,延迟就会增大,所以访问延迟不是固定的,但是cache可以映射整个地址空间。

由于蜂鸟E203支持压缩指令集,所以指令的地址可能不对齐,但是处理器的理想状况是能够连续不断地在每一个周期读出一条完整的指令。
对于普通指令非对齐的情况,可以使用剩余缓存(leftover Buffer)即保存上一次取指令没有用完的比特位,下一次使用。只用到16位大小有两种情况:

  • 将此次取出的32位低16位与上一次取出的高16位组成一条32位指令(将上次的高16位存放在leftover Buffer)
  • 这个指令本身只有16位

分支跳转指令非对齐:由于跳转指令的话,前一次所取到的高16位没有作用。一半采用多体(Bank)的SRAM进行指令存储。使用两块32位宽的SRAM交错存储,两个连续的32位指令字会被分别存储在两块不同的SRAM中(蜂鸟没有设计这部分)。
(为了支持16位压缩指令集,每取指一条指令之后以最快的速度判断当前指令的宽度是16位或者32位,RISC-V将指令长度指示码放在指令的最低位,以11代表32位指令)

1、IFU有两个ICB接口,一个用于访问ITCM(数据宽度为64位),另一个用于访问BIU(数据宽度为32位)
2、根据IFU 访问的地址区间进行判断,如果访问的地址落在ITCM区间,则通过ITCM的ICB接口对其访问,否则通过BIU的ICB对外部存储访问。

(2)PC生成模块(e203_ifu_ifetch.v)

  • 如果是reset后的第一次取指,CPU-TOP输入信号pc_rtvec指示的值作为第一次取值的PC值。用户可以通过在SOC顶层集成时,给予不同的值来PC的复位值。
  • 对于顺序取值,根据指令是16位指令还是32位指令,判断PC+2还是PC+4
  • 如果分支取值,使用simple-BPU预测的地址
  • 如果来自于流水线冲刷,使用EXU送来的新PC值。
    在这里插入图片描述
    (3)指令分支预测模块 (simple-BPU) (e203_ifu_litebpu.v)
    分支指令类型如下:
    1、无条件直接跳转/分支(unconditional direct Jump/Branch)
    以RISC-V架构中的jal(jump and link)指令为例,例如“jal x5,offset" 使用编码在指令字中的20位立即数(有符号数)作为偏移量,该偏移量乘以2,与当前指令所在地址相加,生成得到最终的跳转目标地址。
    2、无条件间接跳转(Unconditional Indirect Jump/Branch)
    以RISC-V架构中的jalr 指令为例,例如"jalr x1,x6,offset"jalr指令使用指令字中的12位立即数(有符号数)作为偏移量,与jalr另一个今存其的操作数相加,生成最终的跳转地址。

(jalr的跳转目标计算所需的基地址来自其rs1索引的操作数,需要从通用寄存器组中读取,并且还可能与正在EXU执行的指令形成RAW数据相关性。

  • 如果rs1的索引号是x0,直接使用常数0
  • 如果rs1的索引号是x1,x1用于link寄存器作为函数返回跳转指令,将x1从处于EXU的Regfile中直接取出(不需要占用Regfile的读端口)
  • 如果rs1的索引号是娶她寄存器,不进行加速
    在这里插入图片描述

3、有条件直接跳转
以RISC-V架构,其有6条带条件分支指令,例如”beq rs1,rs2,label"使用12位立即数作为偏移量,该偏移量乘以2,然后与该指令的PC相加,生成得到最终的跳转地址,因此仅可以跳转前后4KB的地址区间。

(3、有条件直接跳转 和 1、无条件直接跳转 使用其pc 和立即数表示offset相加得到其跳转目标地址)
在这里插入图片描述
4、16位压缩指令集中也定义了若干分支跳转指令
分支预测:
(1)跳转方向
静态预测:

  • 预测分支指令不会发生跳转
  • BTFN(Back Taken,Forward Not Taken),对于向后的跳转预测为跳,向前的跳转预测为不跳;向后跳转指跳转的目标地址(PC值)比当前分支指令的PC值要小(实际汇编程序中向后分支跳转对于向前,譬如for循环生成的汇编指令往往使用向后跳转的分支指令)->蜂鸟E203
    在这里插入图片描述

动态预测:2bit饱和计数器/PHT(Pattern History Table)
(2)预测地址
1、BTB(Branch Target Buffer)
使用容量有限的缓存保存最近执行过的分支指令的PC值,以及它们的跳转目标地址。

2、RAS(Return Address Stack)
使用容量有限的硬件堆栈来存储函数调用的返回地址
RISC-V架构规定,如果使用jal指令且目标寄存器索引值rd等于x1或者x5,则属于需要进行RAS压栈;如果使用jalr指令,则按照使用的寄存器值(rs1和rd)的不同,规定了相应的RAS压栈或者出栈行为。
3、Indirect BTB
专门为间接跳转/分支指令设计的BTB

(4)微型译码模块 (mini-decode) (e203_ifu_minidec.v)
此处译码并不需要完整译出指令的所有信息,只需要译出部分指令信息即可(普通指令还是分支跳转指令、分支跳转指令的类型与细节),但是模块是例化一个完整的decode模块,但是将不相关的输入信号接0、输出信号悬空不连接,使用综合工具将完整的decode模块无关逻辑优化掉。
在这里插入图片描述

发布了54 篇原创文章 · 获赞 4 · 访问量 1025

猜你喜欢

转载自blog.csdn.net/buzhiquxiang/article/details/103673814