前言
本文取指模块概述后半部分,前半部分跳转至:取指模块概述(1)
1 部分译码
Minidecode中例化decode模块,使用decode部分译码功能,只需要译出IFU所需的部分指令信息。包括此指令是属于普通指令还是分支跳转指令、分支跳转指令的类型和细节。从minidecode的端口可以看出其主要完成这些功能:
- 判断寄存器(rs1,rs2,rd)是否被使用,并输出其索引。
- 判断指令长度(32 or 16)及指令类型(bjp, jal, jalr, bxx)。
- 若指令为乘除法相关指令,判断其是否属于back2back fusing类型,这指的是对于乘法来说,两个32位数相乘最高能得64位数,而寄存器只为32位,因此每次只能将结果的高32位或低32位存入寄存器,如果希望得到两个32位整数相乘的完整64位结果,RISC-V架构推荐使用两条连续的乘法指令“MULH[[S]U] rdh, rsl, rs2; MUL rdl, rsl,rs2”, 而对于除法如果希望同时得到两个32位整数相除的商和余数,RISC-V架构推荐使用两条连续的除法和取余指令“DIV[U] rdq, rsl, rs2; REM[U] rdr, rsl, rs2”其要点如下:
- 两条指令的源操作数索引号和顺序必须完全相同。
- 第一条指令的结果寄存器rdh或rdq的索引号必须不能与其rsl和rs2的索引号相等。
- 处理器实现的微架构可以将两条指令融合(Fused)成为一条指令执行,而不是分离的两条指令,从而提高性能。
- 解析jalr的rs1寄存器索引和分支跳转指令bjp使用到的立即数输出至分支预测模块。
2 分支预测与PC生成
对于分支预测,此处为了实现低功耗采用较简单的静态分支预测,对于Bxx指令来说,立即数表示