《自己动手写CPU》--第八章-阅读笔记

本章将为OpenMIPS处理器添加转移指令,转移指令包括跳转、分支两种,区别在于前者是绝对转移,后者是相对转移,但实现的方法是相似的。

8.1延迟槽

在实现转移指令之前,先介绍一下延迟槽的概念。第5章已经介绍了流水线中存在的三种相关:数据相关、结构相关、控制相关。其中控制相关是指流水线中的转移指令或者其他需要改写PC的指令造成的相关。这些指令改写了PC的值,所以导致后面已经进入流水线的几条指令无效,比如:如果转移指令在流水线的执行阶段进行转移条件判断,在发生转移时,会导致当前处于取指、译码阶段的指令无效,需要重新取指。

也就是说,在流水线执行阶段进行转移判断,并且转移发生,那么会有2条无效指令,熬制浪费了两个时钟周期。为了减少损失,规定转移指令后面的指令位置为“延迟槽”,延迟槽中的指令为“延迟指令”,延迟指令总是被执行,与转移发生与否没有关系。OpenMIPS就使用延迟槽技术。

但是,即使引入延迟槽,在转移发生时仍然会导致已经进入取指阶段的指令无效,也就是说,仍浪费一个一个时钟周期,要解决这个问题,可以在译码阶段机型转移判断,这样就可以避免浪费时钟周期。OpenMIPS处理器就设计在译码阶段机型转移判断。

8.2转移指令说明

MIPS32指令集架构中定义的转移指令共有14条,可分为如下两类。

--跳转指令:jr、jalr、j、jal。

--分支指令:b、bal、beq、bgez、bgezal、bgtz、blez、bltz、bltzal、bne

跳转指令是绝对转移指令,分支指令是相对转移指令

1.跳转指令

j、jal指令可以通过指令码进行判断,jr、jalr指令的指令码为SPECIAL,还需要依据功能码进一步判断。 

2.分支指令 

 

--指令码:6'b000100         beq

        指令用法: beq rs, rt, offset.

        指令作用:if rs = rt then branch, 将地址为rs的通用寄存器的值与地址为rt的通用寄存器的值进行比较,如果相等,那么发生转移。

--指令码:6'b000100 且16~25bit为0时,表示b指令。

        指令用法:b offset

        指令作用:无条件转移,从图8-4可知,b指令可以认为是beq指令的特殊情况,当beq指令的rs、rt都等于0时,即为b指令,所以在OpenMIPS实现的时候不需要特意实现b指令,只需要实现beq指令即可。

--指令码:6'b000111时,表示bgtz指令。

        指令用法:bgtz rs,offset

        指令作用:if rs >0 then branch,如果地址为rs的通用寄存器的值大于0,那么发生转移。

--指令码:6'b000110,表示blez指令

        指令用法:blez rs, offset

        指令作用:if rs <=0 then branch, 如果地址为rs的通用寄存器的值小于0,那么发生转移

--指令码:6'b000101  表示bne指令

        指令用法:bne rs , rt, offset。

        指令作用:if rs != rt then branch,如果地址为rs的通用寄存器的值不等于地址为rt的通用寄存器的值,那么发生转移。

--指令码:REGIMM,且第16~20bit为5'b00000时,表示bltz指令

        指令用法:bltz rs, offset

        指令作用:if rs < 0 then branch ,如果地址为rs的通用寄存器的值小于0,那么发生转移

--指令码:REGIMM,且第16~20bit为5'b10000时,表示bltzal指令

        指令用法:bltzal rs, offset

        指令作用:if rs < 0 then branch,若果地址为rs的通用寄存器的值小于0,那么发生转移,并且将转移指令后面第2条指令的地址作为返回地址,保存到通用寄存器$31

8.3转移指令实现思路

8.3.1S实现思路

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

8.3.2数据流图的修改

1.在译码阶段多来转移判断的步骤

2.PC的取指变为三种情况

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

        情况二:PC保持不变。当流水线暂停的时候,就会发生这种情况。

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

 8.3.3系统结构的修改

 (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模块,作为要写入目的寄存器的值

8.4修改OpenMIPS以实现转移指令

8.4.1修改取指阶段的PC模块

8.4.2修改译码阶段

 在ID模块中要增加对转移指令的分析

 2.修改ID/EX模块

 8.4.3修改执行阶段的EX模块

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值