自己动手写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 ...
随机推荐
- Python unittest 官方文档
https://docs.python.org/2/library/unittest.html#
- 2015 Multi-University Training Contest 1
最近真是太废柴了,题没做几道,也没学什么新知识,多校做了三场也没总结~诶!好好学吧! 多校第一场感觉被完虐...orz... Hdu 5288 OO’s Sequence 题目链接:http://ac ...
- [置顶] android之Notification版本兼容性问题
首先先来创建一个notification提示 //概要 String tickerText = context.getResources().getText(R.string.app_name).to ...
- UVA 565 565 Pizza Anyone? (深搜 +位运算)
Pizza Anyone? You are responsible for ordering a large pizza for you and your friends. Each of th ...
- Android API中被忽略的几个函数接口
1. MotionEvent的几个函数 下面的方法都支持多点触摸,即可以对单个触摸点调用下面的方法 1.1 getPressure() 这个api 可以获取到手指触摸屏幕时候的压力,但是需要硬件和驱动 ...
- 数学之路-python计算实战(2)-初遇pypy
PyPy是Python开发人员为了更好的Hack Python创建的项目.此外,PyPy比CPython是更加灵活,易于使用和试验,以制定详细的功能在不同情况的实现方法,能够非常easy实施. 该项目 ...
- 关于ListCtrol自绘的技巧
一.给控件添加排序功能report风格的list控件很多情况下都需要支持排序功能,而且最好支持按不同列进行排序.CListCtrl的类方法SortItems支持排序功能,但是在排序过程中,两个数据真正 ...
- android电池充电以及电量检测驱动分析
前段时间比较烦躁,各种不想学习不想工作,于是休息了几天.这几天又下来任务了--调试充电电路和电池电量检测电路,于是又开始工作,顺便把调试过程记录下来. 平台: cpu 飞思卡尔imx6q ...
- vc笔记六
通知消息(Notification message)是指这样一种消息,一个窗口内的子控件发生了一些 事情,需要通 知父窗口.通知消息只适用于标准的窗口控件如按钮.列表框.组合框.编辑框,以及 Wind ...
- Android中网络流量控制(防火墙)——Iptables
Iptables简单介绍 iptables是与最新的 2.6.x 版本号 Linux 内核集成的 IP 信息包过滤系统. 假设 Linux 系统连接到因特网或 LAN.server或连接 LAN 和因 ...