将陆续上传本人写的新书《自己动手写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. A - Alignment of Code(推荐)

    You are working in a team that writes Incredibly Customizable Programming Codewriter (ICPC) which is ...

  2. nginx的反向代理和负载均衡的区别是什么 - 开源中国社区

    nginx的反向代理和负载均衡的区别是什么 - 开源中国社区   nginx的反向代理和负载均衡的区别是什么 #user  nobody;worker_processes  1;#error_log  ...

  3. android 5.0新特性

    Android Lollipop 面向开发人员的主要功能 Material Design 设计 注重性能 通知 以大屏幕呈现 以文档为中心 连接性能再上一级 高性能图形 音频处理功能更强 摄像头和视频 ...

  4. MSYS2 环境搭建(在Qt Creator可以设置环境变量来进行引用这些库)

    本机环境:Windows XP 32位MSYS2地址:http://sourceforge.net/projects/msys2/ 下载32位版本,地址:http://sourceforge.net/ ...

  5. 【Visual C++】绘图函数BitBlt的使用方法

    BitBlt 该函数对指定的源设备环境区域中的像素进行位块(bit_block)转换,以传送到目标设备环境. 原型: BOOL BitBlt( HDC  hdcDest, int  nXDest,   ...

  6. 普联的路由器TL-WR842N和TL-WR845N还有 TL-WR847N哪一个更好,我是家用

    http://zhidao.baidu.com/question/525244706.html?fr=ala&device=mobile&ssid=0&from=844b&am ...

  7. 计算机视觉与模式识别代码合集第二版two

    Topic Name Reference code Image Segmentation Segmentation by Minimum Code Length AY Yang, J. Wright, ...

  8. TD-SCDMA风雨20年:中国3G标准的由来以及国家通信战略

    .国际电信标准是咋回事? 当年作为通信专业的学生,我曾长期困惑一个问题,为什么同一项通信技术总会有美国和欧洲两种国际标准?比如电话语音的数字化就有欧洲A律和美国u(谬)律两种. 学习后发现,两种标准的 ...

  9. 表达式树动态拼接lambda

    动态拼接lambda表达式树   前言 最近在优化同事写的代码(我们的框架用的是dapperLambda),其中有一个这样很普通的场景——界面上提供了一些查询条件框供用户来进行过滤数据.由于dappe ...

  10. oracle 12c 中asm元数据是否有所变化

    详见原文博客链接地址: oracle 12c 中asm元数据是否有所变化