将陆续上传本人写的新书《自己动手写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. c# 使用OracleParameter,同时使用replace函数

    也算不上是手误吧,这个问题竟然困扰了我那么多天,就是更新代码的时候,使用replace,但是oracle在.net下竟然是不支持汉字,所谓使用类似update x set y='m' where y= ...

  2. hdu3986Harry Potter and the Final Battle

    给你一个无向图,然后找出当中的最短路, 除去最短路中的随意一条边,看最糟糕的情况下, 新的图中,第一个点到末点的最短路长度是多少. 我的做法是: 首先找出最短路,然后记录路径, 再一条一条边的删, 删 ...

  3. 谈论multistage text input(中国输入法)下一个UITextView内容长度的限制

    我以前写<如何更好地限制UITextField输入长度>.接使用 UIKIT_EXTERN NSString *const UITextFieldTextDidChangeNotifica ...

  4. HDU4939Stupid Tower Defense (有思想的dp)

    Stupid Tower Defense Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Oth ...

  5. 采购订单me22n 或者me21n增强 (点击保存和回车)

    IF_EX_ME_PROCESS_PO_CUST DATA:l_header TYPE mepoheader, l_item TYPE mepoitem. DATA:lt_items TYPE pur ...

  6. vc中改变对话框的背景色

    ---- 笔者曾在<软件报>2000年第5期中讨论过如何改变控件的颜色,但还有相当一部分的读者来信提问:一个基于对话框的MFC AppWizard应用程序中,如何改变对话框的背景颜色呢?对 ...

  7. javascript实现的可改变滚动方向的无缝滚动

    效果图如下: 代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http:// ...

  8. 排序(6)---------归并排序(C语言实现)

    归并排序: 归并操作,也叫归并算法,指的是将两个已经排序的序列合并成一个序列的操作.归并排序算法依赖归并操作. 归并操作的步骤例如以下:     (1) 申请空间,使其大小为两个已经排序序列之和.该空 ...

  9. IE6_一些简单bug

    1.IE6调整窗口大小的 Bug 当把body居中放置,改变IE浏览器大小的时候,任何在body里面的相对定位元素都会固定不动了.给body定义position:relative;就行了. 2.避免百 ...

  10. 与内存有关的那些事儿(数组分配空间不够,导致缓冲区溢出,从而strcpy会出现异常)

    这日,我写下如下代码:#include <iostream>int main(void){ char *p = new char[5]; char *t = new char[5]; st ...