移位操作的代码原理

6.2.1 新的数据相关情况的解决
进一步考虑mfhi、mflo指令的处理过程,这2条指令会在流水线执行阶段读取HI、LO寄存器的值,如果直接采用HILO模块给出的HI、LO寄存器的值,可能不是正确的HI、LO寄存器的值,因为此时处于访存、回写阶段的指令有可能会修改HI、LO寄存器,以如下程序为例。在这里插入图片描述
指令3 4 5 需要修改HI寄存器,当指令6处在执行阶段时,指令5处于访存阶段,指令4处于回写阶段,而此时HI 寄存器的值是指令3刚刚写入的0x00000000,HILO模块正是将该值传到执行阶段。如果采用这个值,程序就会出错,而正确的值应该是当前处于访存阶段的指令5要写入的数据。

在这里插入图片描述

这就是第5章介绍过的数据相关问题,解决措施还是使用数据前推。将处于访存阶段、回写阶段的指令对HI、LO寄存器的操作信息反馈到执行阶段,执行阶段依据这些信息,确定HI、LO寄存器的正确值。
为此需要修改的数据流图如图所示,主要增加的部分就是将访存阶段、回写阶段的信息反馈到执行阶段,输入到执行阶段的选择模块(图中粗线所示),如果处于执行阶段的是mfhi、mflo指令,那么就会从中选择HI、LO寄存器的正确值。在这里插入图片描述
6.2.2 系统结构的修改
为实现移动操作指令需要对OpenMIPS系统结构进行补充完善,主要修改如图所示:

在这里插入图片描述
主要有三个方面。
(1)增加了HILO模块,用于实现HI、LO寄存器。
(2)执行阶段的EX模块增加了whilo_o、hi_o、lo_o接口,分别表示是否要写HILO、写入HI寄存器的值、要写入LO寄存器的值。这三个接口传递出来的对HI、LO寄存器的修改信息会通过EX/MEM、MEM、MEM/WB三个模块一直传递到回写阶段,并最终传递给HILO模块。
(3)执行阶段的EX模块增加了与HI、LO寄存器有关的输入接口,包括为解决HI、LO寄存器的数据相关问题而引入的接口。

6.3 修改OpenMIPS以实现移动操作指令

6.3.1 HI、LO寄存器的实现
在HILO模块中实现HI、LO寄存器,接口如图所示:

在这里插入图片描述HILO模块代码很简单:在时钟上升沿,如果复位信号无效,那么就判断输入的写使能信号we是否是WriteEnable,如果是WriteEnable,那么就将输入的hi_i、lo_i的值作为HI、LO寄存器的新值,并通过hi_o、lo_o接口输出。

6.3.2 修改译码阶段的ID模块
在译码阶段要增加对移动操作指令的分析,根据图6-1给出的移动操作指令格式可知,这6条指令都是SPECIAL类指令,且第6-10bit均为0,需要依据0-5bit的功能码确定指令,需要确定指令的过程如图所示。

在这里插入图片描述有如下几点说明:
(1)除mthi、mtho外的其余4条移动操作指令的运算类型alusel_o均为EXE_RES_MOVE。
(2)指令mthi、mtho需要修改HI、LO寄存器,但是不需要修改通用寄存器,所以在其译码结果中,wreg_o为WriteDisable。另外设置reg1_read_o为1,表示需要通过Regfile模块读端口1读取通用寄存器的值,默认读取地址就是指令第21-25bie的值,正是mthi、mtho指令中的rs,读取的值作为要写入HI或LO寄存器的数据。
(3)movz指令的译码过程需要读取rs、rt寄存器的值,所以设置reg1_read_o、reg2_read_o均为1.默认通过Regfile模块读端口1读取的寄存器地址reg1_addr_o的值是指令第21-25bit,正是movz指令中的rs,默认通过Regfile模块读端口2读取的寄存器地址reg2_addr_o的值正是指令的第16-20bit,正是movz指令中的rt。所以reg2_o的值就是读取到的地址为rt的寄存器的值,如果该值为0,正是movz指令中的rt。所以,reg2_o的值就是读取到的地址为rt寄存器的值,如果该值为0,那么设置wreg_o为WriteEnable ,表示要将地址为rs的寄存器的值赋给地址为rd的寄存器,反之,wreg_o为WriteDisable,表示不赋值。
(4)movn的指令的译码过程与movz指令类似,只是wreg_o为WriteEnable的条件与movz正好相反。

6.3.3修改执行阶段

1.修改EX模块
译码阶段的结果会传递到执行阶段,执行阶段据此进行计算。考虑到执行阶段需要读写HI、LO寄存器,另外还要解决HI、LO寄存器带来的数据相关问题,所以需要给EX模块增加如表所示的接口。
在这里插入图片描述上述修改的代码可以分为四段理解。

  • 第一段代码的作用是得到最新的HI、LO寄存器的值,首先判断当前处于访存阶段的指令是否要写入HI、LO寄存器,即mem_whilo_o是否为WriteEnable,如果是,那么访存阶段的指令要写入的值就是HI、LO寄存器的最新值,如果不是,那么再判断当前处于回写阶段的指令是否要写HI、LO寄存器,如果是,那么回写阶段的指令要写入的值就是HI、LO寄存器的最新值,如果不是,那么从HILO模块输入的值hi_i、lo_i就是HI、LO寄存器的最新值
  • 第二段代码的作用是针对不同的移动操作指令,确定moveres的值,变量moveres存储的是移动操作指令的结果。
  • 第三段代码的作用是依据运算类型alusel_i的值,将不同的运算结果赋给wdata_o,如果是移动操作指令那么alusel_i为EXE_RES_MOVE,此时将moveres的值赋给wdata_o。
  • 第四段代码的作用是确定是否要写HI、LO寄存器,如果是mthi、mtho寄存器,那么要写HI、LO寄存器,所以设置输出信号whilo_o为WriteEnable。具体来说,有如下两种情况。
    在这里插入图片描述
6.3.4 修改访存阶段

1.修改MEM模块

在这里插入图片描述2.修改MEM/WB模块
在这里插入图片描述

6.3.5修改回写阶段

MEM/WB模块输出的对HI、LO寄存器的写信息将直接送到HILO模块,包括wb_whilo、wb_hi、wb_lo,后者据此修改HI、LO寄存器的值。

6.3.6 修改OpenMIPS顶层模块

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值