RISC-V MCU中文社区

【分享】 蜂鸟E203取指部分(IFU)架构解读

发表于 开源蜂鸟E203 2023-05-31 19:59:35
0
1833
2

蜂鸟E203取指部分(IFU)架构解读

团队编号:CICC3348

团队名称:瀚海队

一、整体框架

蜂鸟E203的IFU由两部分组成:一部分负责地址判断和icb总线控制(e203_ifu_ift2icb.v),另一部分负责对指令的简单译码、分支预测(前不跳后跳)以及下一轮取指的PC生成(e203_ifu_ifetch.v)。

二、地址判断和icb总线控制

通过指令地址的高位来判断是从ITCM还是BIU取指,进而控制总线。我们的工作对从ITCM取指这个一部分做了优化,下面介绍蜂鸟E203的取指原理:

ITCM是64位宽的SRAM,每64位为一个lane。由于ITCM是由SRAM构成的,因此上次访问读过SRAM之后,SRAM的输出值会一直保存住(直到下次 SRAM 被再次读或者写过),称之为Hold-up 住。可以利用这一特性,避免反复取出数据。

给定一个地址(ifu2itcm_icb_cmd_addr),握手成功后可以返回64位的数据,但指令是32位或16位(压缩指令)的,因此对于ITCM返回的数据我们要取出32位(可能包含一条rv32 或 一条rv16和高16位用不到的数据),保证其中至少有一条指令,再发送给ifetch。这32位指令可能有以下几种情况:
1、没有跨越lane的边界,可能位于lane的开始会中间32位;
2、跨越了lane的边界,比如前一个lane的[63:48]和下一个lane的[15:0]是一条指令。

针对以上情况,先考虑顺序取指:
1、如果ifu_req_pc[2:1]==2’b00,意味着这条指令和lane的开始的边界对齐。有个问题,这意味着需要新取一个lane吗?并不一定。可能上一次ifu_req_pc[2:1]==2’b11,但取完发现是16位指令,这种情况本次的lane已经访问过了,所以已经holdup住。
2、如果ifu_req_pc[2:1]==2’b01或2’b10,正常取指即可。
3、如果ifu_req_pc[2:1]==2’b11,这意味着跨越了边界,那么就要把地址(ifu2itcm_icb_cmd_addr)偏移到下一个lane,并把上一个lane未用完的数据存入leftover,这样当ITCM返回数据时就可以拼接起来。

再考虑跳转取指:
1、如跳转后的ifu_req_pc[2:1]==2’b11,这意味着再取32位数据就会跨越lane的边界,需要访问两个lane。且由于是跳转,前面的lane不一定访问过,这时就需要两个周期分别访问两个lane,再做拼接。
2、如跳转后的ifu_req_pc[2:1]是其他情况正常取指即可。

三、指令的简单译码、分支预测以及下一轮取指PC的生成

1、简单译码

之所以乘是简单译码是因为只利用了部分译码器的功能,完整的译码模块在EXU中。经过简单译码,可以知道指令长度、寄存器索引、立即数、何种指令类型等信息。

2、分支预测

蜂鸟E203采取了简单的静态分支预测,采取了“前跳后不跳”的预测方案,通过立即数的最高位判断跳转方向,其预测准确率可达百分之七十左右,具有很大上升空间。可采用动态预测方案进行优化,如双模态分支预测器、局部分支预测、全局分支预测、组合分支预测等方法,预测正确率可达95%+。

3、PC生成

1)顺序取指
根据指令长度对PC增加相应偏移量即可;
2)跳转取指
采用预测期传来的指令地址;
3)流水线冲刷等
采用传来的指令地址。

四、优化思路

1、优化分支预测;
2、改为多发射,重点要对地址判断和icb总线控制模块进行修改,ifetch模块也要做适当修改。

喜欢2
用户评论
Strand

Strand 实名认证

懒的都不写签名

积分
问答
粉丝
关注
  • RV-STAR 开发板
  • RISC-V处理器设计系列课程
  • 培养RISC-V大学土壤 共建RISC-V教育生态
RV-STAR 开发板