将陆续上传本人写的新书《自己动手写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)——移动操作指令实现思路的更多相关文章

  1. 自己动手写CPU之第七阶段(7)——乘累加指令的实现

    将陆续上传本人写的新书<自己动手写CPU>.今天是第30篇.我尽量每周四篇 亚马逊的销售地址例如以下.欢迎大家围观呵! http://www.amazon.cn/dp/b00mqkrlg8 ...

  2. 自己动手写CPU之第五阶段(1)——流水线数据相关问题

    将陆续上传本人写的新书<自己动手写CPU>(尚未出版),今天是第15篇,我尽量每周四篇 上一章建立了原始的OpenMIPS五级流水线结构,可是仅仅实现了一条ori指令,从本章開始,将逐步完 ...

  3. 自己动手写CPU之第五阶段(3)——MIPS指令集中的逻辑、移位与空指令

    将陆续上传本人写的新书<自己动手写CPU>(尚未出版),今天是第17篇.我尽量每周四篇 5.4 逻辑.移位操作与空指令说明 MIPS32指令集架构中定义的逻辑操作指令有8条:and.and ...

  4. 自己动手写CPU之第四阶段(3)——MIPS编译环境的建立

    将陆续上传本人写的新书<自己动手写CPU>(尚未出版).今天是第13篇.我尽量每周四篇 4.4 MIPS编译环境的建立 OpenMIPS处理器在设计的时候就计划与MIPS32指令集架构兼容 ...

  5. 自己动手写CPU之第五阶段(2)——OpenMIPS对数据相关问题的解决措施

    将陆续上传本人写的新书<自己动手写CPU>(尚未出版).今天是第16篇.我尽量每周四篇 5.2 OpenMIPS对数据相关问题的解决措施 OpenMIPS处理器採用数据前推的方法来解决流水 ...

  6. 自己动手写CPU之第七阶段(2)——简单算术操作指令实现过程

    将陆续上传本人写的新书<自己动手写CPU>.今天是第25篇.我尽量每周四篇 亚马逊的预售地址例如以下,欢迎大家围观呵! http://www.amazon.cn/dp/b00mqkrlg8 ...

  7. 自己动手写CPU之第七阶段(5)——流水线暂停机制的设计与实现

    将陆续上传本人写的新书<自己动手写CPU>,今天是第28篇.我尽量每周四篇 China-pub的预售地址例如以下(有文件夹.内容简单介绍.前言): http://product.china ...

  8. 自己动手写CPU之第八阶段(4)——转移指令实现过程2

    将陆续上传本人写的新书<自己动手写CPU>,今天是第36篇,我尽量每周四篇 开展晒书评送书活动,在亚马逊.京东.当当三大图书站点上,发表<自己动手写CPU>书评的前十名读者,均 ...

  9. 自己动手写CPU之第七阶段(6)——乘累加指令实现思路

    将陆续上传本人写的新书<自己动手写CPU>.今天是第29篇.我尽量每周四篇 亚马逊的销售地址例如以下,欢迎大家围观呵! http://www.amazon.cn/dp/b00mqkrlg8 ...

随机推荐

  1. 计算机内存碎片(中)——外部碎片化(内存 & 文件系统 & 数据库系统通杀)

    本文原创为freas_1990,转载请标明出处:http://blog.csdn.net/freas_1990/article/details/17252221 外部碎片化 当计算机内存被划分成很细碎 ...

  2. Ubuntu 无法拖拽复制

    首先确定 在ubuntu 下,vmware tools 已经安装成功 有些时候会出现vmware tools 已经安装成功,但是却无法实现拖拽和复制 1.首先在虚拟机设置里面勾选共享剪切板 2.然后重 ...

  3. list view Item 里面有ImageButton

    list view Item 里面有ImageButton listview 的item中有ImageButton, 或者 Button. 目的: ImageButton 和 Button的click ...

  4. 特殊的Windows消息

    WM_CREATE消息 该消息是Windows发送给视图的第一个消息.由于当应用程序框架调用Create函数时该消息就会被发送,而此时窗口创建还未完成,窗口还不可见,因此在控制函数OnCreate内部 ...

  5. 仿ios版微信应用源代码

    仿微信基本功能. 基于XMPPserver的即时通信以及交友client. ----第一期代码的功能例如以下----      1.新用户注冊      2.登陆并连接XMPPserver 握手 保持 ...

  6. centos 安装 redis3.2.0 集群

    这里创建6个redis节点,其中三个为主节点,三个为从节点. redis和端口对应关系: 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 从: 127.0.0 ...

  7. 从WinMain开始

    一.抽象渗漏法则 根据Joel的抽象渗漏法则,所有重大的抽象机制在某种程度上都是有漏洞的.Joel举过一个例子: C++字符串类型应该能让你假装字符串是个基本类型,它们尝试“字串很难处理”这个事实抽象 ...

  8. TP-LINK无线路由器WR340G+ 54M支持WDS - 东莞市泰讯电子科技有限公司

    TP-LINK无线路由器WR340G+ 54M支持WDS - 东莞市泰讯电子科技有限公司 TP-LINK无线路由器WR340G+ 54M支持WDS 品牌  TP-LINK无线路由器 型号  WR340 ...

  9. SQL视图索引

    视图: 视图就相当于一个查询结果,它相对应的是表 表----真正存储数据的地方 视图---不存储数据,展示查询的结果 注意: 1.视图就是为了查询数据方便.一般不要试图向视图中插入数据,容易出错. 2 ...

  10. CentOS IP丢失,切换了网络连接导致的vmnet8未启用dhcp

    解决了, 这个问题是我在开启虚拟机ubuntu系统的过程中, 在主机win7上切换了网络连接导致的, 就是刚开始我用的无线宽带上网, 此时开启了ubuntu ,然后使用过程中,我在win7上切换回静态 ...