RISC CPU对转移指令的处理方法及仿真
1 引言
在RISC CPU的设计当中,转移指令的处理对处理器的性能的影响非常关键。转移指令决定着程序的执行顺序,在程序中的使用频率很高。RISC CPU中程序是以流水线的方式执行的,当程序顺序执行时,下一条指令的地址与前一条指令的内容无关 ;而在执行转移指令时要根据转移指令的执行结果来确定下一条指令的地址,也就是说下一条指令的地址在转移指令执行之前是未知的,造成流水线的不连贯,影响了CPU的效率。
转移指令处理的方法很多,可分为预测法和非预测法,预测法又包含静态预测和动态预测,静态预测如总预测跳转、正向不跳转反向跳转,动态预测如2比特计数器(2BC) 、BTC;非预测法如延时跳转等[1]。这些基本方法合理组合之后可以得到很好的效果。
本文介绍的RISC CPU对转移指令的处理方法,为5级流水线作业,分别是取指、译码、执行、访存、回写,对转移指令的处理在取指级和译码级完成;译码级给出转移指令所包含的详细信息,取指级包含有地址计算单元,转移目标Cache (BTC),跳转判断单元等。对转移指令的处理使用了延时跳转、2BC以及BTC方法。
2 转移指令的原理
该RISC CPU的指令集中包含有条件转移指令和非条件转移指令。所有的转移指令均使用延时转移,每条转移指令后面跟随一条延时槽指令;采用2BC预测条件转移是否跳转,而BTC则保存转移目标为固定地址的转移指令执行后的信息。以下分别介绍在该RISC CPU设计中转移指令的设计以及延时转移、BTC、2BC的具体实现方法。
2.1 转移指令类型及格式
该RISC CPU的指令集中包含条件转移指令(BCC)和非条件转移指令(CALL和RET),其编码格式为图1所示。CALL指令包含2位的操作码和30位的绝对地址。BCC指令包含8位操作码, 4位条件码(Condition Code),19位偏移量以及1位用来区分指令是否带A参数(即ANNUL操作)。所有的BCC指令使用相同的操作码,不同的BCC指令用条件码来区分,共有16类BCC指令;偏移量为带符号数,在低位用00扩展后可以对±220的相对地址寻址。RET指令包含8位的操作码和两个5位的寄存器地址。
2.2 延时转移
在该RISC CPU中,由于转移指令只有在译码级才被识别,跳转与否在译码级才能决定,因此在取下一条指令之前必须等待一个时钟周期。为了减少流水线中的气泡,紧跟转移指令后面插一条与跳转不相关的指令,即延时槽指令,不管跳转是否发生,该指令都执行。延时槽指令的插入由编译器完成,当编译器找不出这样的指令时,就插一条NOP指令。考虑到减轻编译器的难度,我们也采用了带 A参数的转移:当指令带有A参数时,延时槽指令从转移目标程序中取出,因此转移发生时,延时槽指令执行,而转移不发生时,则禁止延时槽指令进入译码级。因一般而言非条件转移指令出现的频率远低于条件转移指令出现的频率,非条件转移指令的延时槽指令相对来说容易找到,所以非条件转移指令不采用A参数选项,而条件转移指令采用A参数选项。
2.3 2BC与BTC的设计
2BC与BTC对提高转移指令的执行效率起重要的作用。在RISC CPU中,转移指令执行一次后,有很大的概率会执行更多次。对于转移目标为固定地址的转移指令(BCC和CALL),在其第一次执行时使用BTC存储相关的信息,当再次执行时,直接读出这些信息,控制程序的执行顺序,而不需要转移指令本身进流水线。这可大大提高效率,但对于转移目标不确定的间接转移指令(如RET),BTC是无效的。另外,条件转移指令(BCC)是否跳转也是不确定的,本设计中采用2BC进行预测。
BTC为全相联Cache,总共有16个单元,每个单元包含的信息有:TAG存储执行过的转移指令的地址、DI存储延时槽指令、CC存储条件码、TP 存储转移指令类型、AN存储A参数携带标志,HI存储转移执行情况的历史记录,即2BC,VI指示行数据是否有效。BTC包含BTC存储、BTC命中以及BTC检查三种工作任务。以下分别介绍2BC以及每种任务下BTC的工作情况。
2.3.1 2BC的作用及工作原理
因为转移指令执行一次之后,转移目标地址、延时槽指令都保存在BTC中了,当该指令再次执行时,这些信息就直接从Cache读出,因此在取指级就可以得到跳转目标地址和延时槽指令。对于非条件转移指令,跳转总是执行,因此BTC命中时就可以直接决定下一条指令的地址为转移目标地址,而当前周期DI被送到指令总线上;但对于条件转移指令,跳转与否是根据条件码和ALU的标志位来决定的。如果转移指令前面一条指令的执行结果改变标志位,而当BTC命中时该指令还在译码级,则跳转与否需要等待一个时钟周期才能决定。为了避免因为等待而造成流水线的停顿,采用2BC当前的状态预测跳转是否执行,在接下来的时钟周期,标志位有效之后,再检查预测是否正确,如果不正确,就进行更正。当预测准确时,采用2BC 与BTC可以使转移指令的执行时间缩短一个周期。即使预测不准确,与不采用预测相比也不会有损失。2BC的工作原理如图2所示,初始值为Nx(第一次不跳转执行)或Tx(第一次跳转执行),t表示跳转执行,n表示跳转不执行。当HI为N或Nx时,预测跳转不发生;当HI为T或Tx时,预测跳转发生。
- 基于FPGA的DSP设计方法(08-26)
- 专家指导:Linux操作系统密码恢复方法(05-16)
- 基于多核DSP Bootload代码加载方法研究(01-16)
- 基于DSP 的大容量无线传输技术中高性能的启动方法(03-16)
- 多核调试新方法探讨(10-22)
- 有备无患Linux操作系统备份方法介绍(06-06)