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

一、整体框架

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

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

通过指令地址的高位来判断是从ITCM还是BIU取指,进而控制总线,下面介绍蜂鸟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
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值