自己动手写CPU之第六阶段(2)——移动操作指令实现思路
来源:互联网 发布:桂林力港公司 知乎 编辑:程序博客网 时间:2024/04/28 05:08
将陆续上传本人写的新书《自己动手写CPU》(尚未出版),今天是第21篇,我尽量每周四篇
6.2 移动操作指令实现思路
6.2.1 实现思路
这6条移动操作指令可以分为两类:一类是不涉及特殊寄存器HI、LO的指令,包括movn、movz;另一类是涉及特殊寄存器HI、LO的指令,包括mfhi、mflo、mthi、mtlo。前一类很好实现,基本思路与第5章实现逻辑、移位操作指令时类似,只需要修改ID、EX模块即可。后一类涉及到特殊寄存器HI、LO,需要为OpenMIPS添加HI、LO寄存器,以及相应的读写控制。下面分别介绍各自的实现思路。
1、movn、movz指令实现思路
与第5章逻辑、移位操作指令的实现过程类似。
(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所示。
对比图6-2与图5-7可以发现有如下区别。
- 增加了HILO寄存器模块,并且该模块放在回写阶段。
- 将HI、LO寄存器的值传递到执行阶段,在执行阶段增加了一个选择模块,用于选择要参与运算的数据,如果是mfhi、mflo指令,那么就会选择传递过来的HI、LO寄存器的值。
6.2.2 新的数据相关情况的解决
进一步考虑mfhi、mflo指令的处理过程,这2条指令会在流水线执行阶段读取HI、LO寄存器的值,如果直接采用HILO模块给出的HI、LO寄存器的值,可能不是正确的HI、LO寄存器的值,因为此时处于访存、回写阶段的指令有可能会修改HI、LO寄存器,以如下程序为例。
1、 lui $1,0x0000 # $1 = 0x000000002、 lui $2,0xffff # $1 = 0xffff00003、 mthi $0 # hi = 0x000000004、 mthi $1 # hi = 0x000000005、 mthi $2 # hi = 0xffff00006、 mfhi $4 # $4 = 0xffff0000
指令3、4、5均要修改HI寄存器,当指令6处于执行阶段时,指令5处于访存阶段,指令4处于回写阶段,而此时HI寄存器的值是指令3刚刚写入的0x00000000,HILO模块正是将该值传到执行阶段,如果采用这个值,那么就会出错,偏离程序设想,正确的值应该是当前处于访存阶段的指令5要写的数据,如图6-3所示。
似曾相识,是不是?这就是上一章介绍过的数据相关问题,解决措施还是使用数据前推。将处于访存阶段、回写阶段的指令对HI、LO寄存器的操作信息反馈到执行阶段,执行阶段依据这些信息,确定HI、LO寄存器的正确值。
为此,需要修改数据流图如图6-4所示,相比图6-3,主要增加的部分就是将访存阶段、回写阶段的信息反馈到执行阶段,输入到执行阶段的选择模块(图中粗线所示),如果处于执行阶段的是mfhi、mflo指令,那么就会从中选择HI、LO寄存器的正确值。
6.2.3 系统结构的修改
为了实现移动操作指令需要对OpenMIPS系统结构进行补充完善,主要修改如图6-5所示。
主要有三个方面。
(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.3节会有详细介绍。
下一次会介绍移动操作指令实现,并给出代码,敬请关注!- 自己动手写CPU之第六阶段(2)——移动操作指令实现思路
- 自己动手写CPU之第六阶段(3)——移动操作指令的实现
- 自己动手写CPU之第六阶段(4)——验证移动操作指令实现效果
- 自己动手写CPU之第六阶段(1)——移动操作指令说明
- 自己动手写CPU之第八阶段(2)——转移指令实现思路
- 自己动手写CPU之第七阶段(2)——简单算术操作指令实现过程
- 自己动手写CPU之第七阶段(6)——乘累加指令实现思路
- 自己动手写CPU之第七阶段(9)——除法指令说明及实现思路
- 自己动手写CPU之第九阶段(4)——加载存储指令实现思路
- 自己动手写CPU之第七阶段(11)——除法指令实现过程2
- 自己动手写CPU之第八阶段(4)——转移指令实现过程2
- 自己动手写CPU之第九阶段(5)——实现加载存储指令2(修改执行阶段)
- 自己动手写CPU之第七阶段(3)——简单算术操作指令实现过程(续)
- 自己动手写CPU之第七阶段(4)——验证简单算术操作指令实现效果
- 自己动手写CPU之第七阶段(1)——简单算术操作指令说明
- 自己动手写CPU之第七阶段(7)——乘累加指令的实现
- 自己动手写CPU之第七阶段(10)——除法指令实现过程1
- 自己动手写CPU之第七阶段(12)——检验除法指令实现效果
- 帝国CMS关键字链接到搜索页面
- win7用户组与权限
- 三星I9220刷机包 仿xperia风格 4.4.4 归属地显示 aweseme音效
- 指针常量及常量指针的区别
- listview空数据的时候显示。
- 自己动手写CPU之第六阶段(2)——移动操作指令实现思路
- 【hh大神的】Tarjan + 缩点 模板
- android文件下的drawable的含义
- Scala的泛型:最强大的特性
- 硬盘中磁头寻址方式
- macOS subversion升级 2进制文件编译和安装
- C语言中的volatile关键字
- 网站开发-php开发手机论坛(8)-编辑帖子
- Android中常见问题总计和优化