首页 > 代码库 > 自己动手写CPU之第八阶段(2)——转移指令实现思路

自己动手写CPU之第八阶段(2)——转移指令实现思路

将陆续上传本人写的新书《自己动手写CPU》,今天是第35篇,我尽量每周四篇

 

8.3 转移指令实现思路

8.3.1 实现思路

      根据8.1节的论述,为了尽量减少转移指令带来的损失,OpenMIPS在译码阶段进行转移条件的判断,如果满足转移条件,那么修改PC为转移目标地址。

8.3.2 数据流图的修改

      为了实现转移指令,修改数据流图如图8-5所示。

 

      从图中可知,在译码阶段多了转移判断的步骤,此外,PC的取值变为三种情况。

      情况一:PC等于PC+4。这属于一般情况,每个时钟周期PC加4,指向下一条指令。

      情况二:PC保持不变。当流水线暂停的时候,就会发生这种情况,参考第7章中流水线暂停的实现。

      情况三:PC等于转移判断的结果。如果是转移指令,且满足转移条件,那么会将转移目标地址赋给PC。

8.3.3 系统结构的修改

      为了实现转移指令,需要对系统结构进行修改,增加部分模块的接口,主要修改如图8-6所示。

      有以下几点说明。

      (1)如果处于译码阶段的指令是转移指令,并且满足转移条件,那么ID模块设置转移发生标志branch_flag_o为Branch,同时通过branch_target_address_o接口给出转移目的地址,送到PC模块,后者据此修改取指地址。

      (2)如果处于译码阶段的指令是转移指令,并且满足转移条件,那么ID模块还会设置next_inst_in_delayslot_o为InDelaySlot,表示下一条指令是延迟槽指令,其中InDelaySlot是一个宏定义。next_inst_in_delayslot_o信号会送入ID/EX模块,并在下一个时钟周期通过ID/EX模块的is_in_delayslot_o接口送回到ID模块,ID模块可以据此判断当前处于译码阶段的指令是否是延迟槽指令。

      (3)如果转移指令需要保存返回地址,那么ID模块还要计算返回地址,并通过link_addr_o接口输出,该值最终会传递到EX模块,作为要写入目的寄存器的值。

下一步将修改代码以实现转移指令。

 

 

自己动手写CPU之第八阶段(2)——转移指令实现思路