自己动手写CPU之第六阶段(2)——移动操作指令实现思路
将陆续上传本人写的新书《自己动手写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 = 0x00000000
2、 lui $2,0xffff # $1 = 0xffff0000
3、 mthi $0 # hi = 0x00000000
4、 mthi $1 # hi = 0x00000000
5、 mthi $2 # hi = 0xffff0000
6、 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所看到的。
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGVpc2hhbmd3ZW4=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
主要有三个方面。
(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之第七阶段(7)——乘累加指令的实现
将陆续上传本人写的新书<自己动手写CPU>.今天是第30篇.我尽量每周四篇 亚马逊的销售地址例如以下.欢迎大家围观呵! http://www.amazon.cn/dp/b00mqkrlg8 ...
- 自己动手写CPU之第五阶段(1)——流水线数据相关问题
将陆续上传本人写的新书<自己动手写CPU>(尚未出版),今天是第15篇,我尽量每周四篇 上一章建立了原始的OpenMIPS五级流水线结构,可是仅仅实现了一条ori指令,从本章開始,将逐步完 ...
- 自己动手写CPU之第五阶段(3)——MIPS指令集中的逻辑、移位与空指令
将陆续上传本人写的新书<自己动手写CPU>(尚未出版),今天是第17篇.我尽量每周四篇 5.4 逻辑.移位操作与空指令说明 MIPS32指令集架构中定义的逻辑操作指令有8条:and.and ...
- 自己动手写CPU之第四阶段(3)——MIPS编译环境的建立
将陆续上传本人写的新书<自己动手写CPU>(尚未出版).今天是第13篇.我尽量每周四篇 4.4 MIPS编译环境的建立 OpenMIPS处理器在设计的时候就计划与MIPS32指令集架构兼容 ...
- 自己动手写CPU之第五阶段(2)——OpenMIPS对数据相关问题的解决措施
将陆续上传本人写的新书<自己动手写CPU>(尚未出版).今天是第16篇.我尽量每周四篇 5.2 OpenMIPS对数据相关问题的解决措施 OpenMIPS处理器採用数据前推的方法来解决流水 ...
- 自己动手写CPU之第七阶段(2)——简单算术操作指令实现过程
将陆续上传本人写的新书<自己动手写CPU>.今天是第25篇.我尽量每周四篇 亚马逊的预售地址例如以下,欢迎大家围观呵! http://www.amazon.cn/dp/b00mqkrlg8 ...
- 自己动手写CPU之第七阶段(5)——流水线暂停机制的设计与实现
将陆续上传本人写的新书<自己动手写CPU>,今天是第28篇.我尽量每周四篇 China-pub的预售地址例如以下(有文件夹.内容简单介绍.前言): http://product.china ...
- 自己动手写CPU之第八阶段(4)——转移指令实现过程2
将陆续上传本人写的新书<自己动手写CPU>,今天是第36篇,我尽量每周四篇 开展晒书评送书活动,在亚马逊.京东.当当三大图书站点上,发表<自己动手写CPU>书评的前十名读者,均 ...
- 自己动手写CPU之第七阶段(6)——乘累加指令实现思路
将陆续上传本人写的新书<自己动手写CPU>.今天是第29篇.我尽量每周四篇 亚马逊的销售地址例如以下,欢迎大家围观呵! http://www.amazon.cn/dp/b00mqkrlg8 ...
随机推荐
- js监听滚动条 回到顶端
效果:当出现滚动条,且滚动条出现移动时,把回到顶端按钮 显示出来:当滚动条回到顶部时,将回到顶端按钮隐藏. <script type="text/javascript"> ...
- DELPHI 通過窗口句柄或窗口标题得到进程句柄
DELPHI 通過窗口句柄或窗口标题得到进程句柄2009年05月08日 星期五 10:15procedure TForm1.Button1Click(Sender: TObject);varhWind ...
- asp.net mvc 导出表格
适合使用的场合: .net 中从前台中的table导出成excel文件,兼容各种浏览器. 使用工具: org.in2bits.MyXls.dll 从前台获取表格的thead和表格的tbody,将其转化 ...
- Tokyo Tyrant(TTServer)系列(四)-tcrmgr远程管理与调试
Tokyo Tyrant(TTServer)系列-tcrmgr(远程管理与调试) tcrmgr是TokyoTyrant的管理工具,对ttserver进行管理与执行命令: 通过输入tcrmgr回车,能够 ...
- Swift - 控制流/控制结构说明(if,switch,for,while)
1,if语句 1 2 3 4 5 if count >=3 { println("yes") }else{ println("no") } ...
- 使用gdb调试游戏服务器
前言 谈论gdb重要性 一般来说.提gdb,命令用于调试."命令",用户是几乎相同的复杂话.而事实确实如此,实际的开发调试必须用到gdb. 如今.大多数Linux系统是存在于ser ...
- sqlplus连接登录数据库时,出现 ORA-28009错误(转)
安装了oracle10g,打算用SQLPLUS 登录数据库进行操作.打开sqlplus后,可以看到要求输入用户名,口令和主机字符串.前面两个都知道,但是后一个却不明白,查了资料才知道是安装时的全局数据 ...
- 《Head First 设计模式》学习笔记——模板方法模式
模板方法模式是类的行为模式.准备一个抽象类,将部分逻辑以详细方法以及详细构造函数的形式实现.然后声明一些抽象方法来迫使子类实现剩余的逻辑.不同的子类能够以不同的方式实现这些抽象方法,从而对剩余的逻辑有 ...
- g++优化选项
g++优化选项 g++优化选项 对于下面的这段代码: 1 2 3 4 5 6 7 8 9 10 11 12 #include <iostream> using namespace std; ...
- 让qt应用程序支持触摸
一.设备驱动 我的触摸屏是usb接口的 可以参考下这2篇文件 http://blog.csdn.net/paomadi/article/details/8754783 usb触摸屏 http://bl ...