《自己动手写CPU》第六章--移动操作指令的实现

本章将实现移动操作指令,首先在6.1节介绍了MIPS32指令集架构中定义的移动操作指令的格式、作用,接着在6.2节给出移动操作指令的实现思路,介绍了修改后的数据流图、新出现的数据相关问题及其解决措施,并给出了修改后的OpenMIPS系统结构图。

6.1 移动操作指令说明

MIPS指令集结构中定义的移动操作指令共有6条:movn、movz、mfhi、mthi、mflo、mtlo,后4条指令涉及对特殊寄存器HI、LO的读/写操作。截止到本章,我们的OpenMIPS处理器只实现了32个通用寄存器以及PC,所有的指令也只是对32个通用寄存器进行操作,还没有涉及特殊寄存器,本章将是实现HI、LO这两个特殊寄存器。

HI、LO寄存器用于保存乘法、除法结果。当用于保存乘法结果时,HI寄存器保存结果的高32位,LO寄存器保存结果的低32位;当用于保存除法结果时,HI寄存器保存余数,LO寄存器保存商

 

可知,这6条指令都是R类型指令,并且指令码都是6'b000000,即均为SPECIAL类指令;同时,指令第6~10bit都是0,可以依据指令中第0~5bit功能码的值判断是哪一种的指令。各指令的用法及作用说明如下

--6'b001011 movn指令。

指令用法为: movn rd, rs, rt

指令作用为:if rt != 0 then rd <- rs

--6'b001010 movz指令

指令用法:movz rd, rs, rt

指令作用为:if rt = 0 then rd < - rs

--6'b010000   mfhi指令

指令用法:mfhi  rd

指令作用:rd <- hi, 将特殊寄存器HI的值赋给地址为rd的通用寄存器

--6'b010010  mflo指令

指令用法: mflo rd

指令作用:rd <- lo, 将特殊寄存器LO的值赋给地址为rd的通用寄存器

--6'b010001  mthi指令

指令用法:mthi rs

指令作用:hi <-  rs, 将地址为rs的通用寄存器的值赋给特殊寄存器HI

--6'b010011  mtlo指令

指令用法:mtlo rs

指令作用:lo <- rs, 将地址为rs的通用寄存器的值赋给特殊寄存器LO

6.2移动操作指令实现思路

这6条移动操作指令可以分为两类:一类是不涉及特殊寄存器HI、LO的指令,包括movn、movz;另一类是涉及特殊寄存器HI、LO的指令,包括mfhi、mflo、mthi、mtlo。前一类很好实现,基本思路与第五章实现逻辑、移位操作指令时类似,只需要修改ID、EX模块即可。后一类涉及特殊寄存器HI、LO,需要为OpenMIPS添加HI、LO寄存器,以及相应的读、写控制。下面分别是各自的实现思路。

1.movn、movz指令实现思路

(1)在译码阶段给出运算类型alusel_o、运算子类型aluop_o、要写入目的寄存器的地址wd_o等信号的值,同时读取地址为rs、rt的通用寄存器的值、但是这里需要新增一个步骤:依据读取地址为rt的通用寄存器是否为0,判断是否要写入目的寄存器。将上述结果送到执行阶段。

(2)执行阶段根据传入的信号,确定最终要写入目的寄存器的信息(包含:是否写、写入的目的寄存器的地址、写入的值),并将这些信息传递到访存阶段。

(3)上述信息会一直传递到回写阶段。最后,依据这些目的修改的目的寄存器,或者不做任何修改。

2.mthi、mtlo指令实现思路

这2条指令需要写HI、LO寄存器,与之前实现的通用寄存器一样,对HI、LO的写操作放在回写阶段进行。

(1)在译码阶段依据指令,给出运算类型alusel_o、运算子类型aluop_o的值,同时读出地址为rs的通用寄存器的值。由于mthi、mtlo不写通用寄存器,所以wreg_o为WriteDisable,wd_o为0.

(2)在执行阶段确定要写HI、LO寄存器的情况,以及要写入的值,并将这些信息传入访存阶段

(3)访存阶段将这些信息再传递到回写阶段

(4)回写阶段依据这些信息修改HI、LO寄存器的值

3.mfhi、mflo指令实现思路

这2条指令需要读HI、LO寄存器,设计在执行阶段才能读取到。

(1)在译码阶段依据指令,给出运算类型alusel_o、运算子类型aluop_o的值,同时因为有要写入的目的寄存器,所以wreg_o为WriteEnable,wd_o为指令中rd的值,也就是目的寄存器地址。

(2)在执行阶段获取HI或LO寄存器的值,作为要写入目的寄存器的数据,并将这些信息传递到访存阶段。

(3)访存阶段将这些信息再传递到回写阶段

(4)回写阶段依据这些信息修改目的寄存器

6.2.1新的数据相关情况的解决

进一步考虑mfhi、mflo指令的处理过程,这2条指令会在流水线执行酒胆读取HI、LO寄存器的值,如果直接采用HILO模块给出的HI、LO寄存器的值,可能不是正确的HI、LO寄存器的值,因为此时处于访存、回写阶段的指令有可能会修改HI、LO寄存器。

 此问题的解决措施还是数据前推。将处于访存阶段、回写阶段的指令对HI、LO寄存器的操作信息反馈到执行阶段,执行阶段依据这些信息,确定HI、LO寄存器的正确值。

为此,需要修改数据流图,相比原图,主要增加的部分就是将访存阶段、回写阶段的信息反馈到执行阶段,输入到执行阶段的选择模块,若果处于执行阶段的是mfhi、mflo指令,那么就会从中选择HI、LO寄存器的正确值。

 6.2.2系统结构的修改

为了实现移动操作指令需要对OpenMIPSMIPS系统结构进行补充完善。

 主要有三个方面:

(1)增加了HILO模块,用于实现HI、LO寄存器

(2)执行阶段的EX模块增加了while_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.1HI、LO寄存器的实现

代码:略。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值