将陆续上传本人写的新书《自己动手写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模块,作为要写入目的寄存器的值。
下一步将修改代码以实现转移指令。