zoukankan      html  css  js  c++  java
  • 自己动手写CPU之第六阶段(2)——移动操作指令实现思路

    将陆续上传本人写的新书《自己动手写CPU》(尚未出版),今天是第21篇,我尽量每周四篇


    6.2 移动操作指令实现思路

    6.2.1 实现思路

          这6条移动操作指令能够分为两类:一类是不涉及特殊寄存器HILO的指令,包含movnmovz;还有一类是涉及特殊寄存器HILO的指令。包含mfhimflomthimtlo。前一类非常好实现。基本思路与第5章实现逻辑、移位操作指令时类似,仅仅须要改动IDEX模块就可以。后一类涉及到特殊寄存器HILO,须要为OpenMIPS加入HILO寄存器。以及对应的读写控制。

    以下分别介绍各自的实现思路。

          1movnmovz指令实现思路

          与第5章逻辑、移位操作指令的实现过程类似。

          (1)在译码阶段给出运算类型alusel_o、运算子类型aluop_o、要写入的目的寄存器地址wd_o等信号的值。同一时候读取地址为rsrt的通用寄存器的值,可是这里须要新增一个步骤:根据读取的地址为rt的通用寄存器的值是否为0。推断是否要写目的寄存器。将上述结果送到运行阶段。

          (2)运行阶段根据传入的信号,确定终于要写目的寄存器的信息(包括:是否写、写入的目的寄存器地址、写入的值),并将这些信息传递到訪存阶段。

          (3)上述信息会一直传递到回写阶段。最后,根据这些信息改动目的寄存器。或者不作不论什么改动。

          2mthimtlo指令实现思路

          这2条指令须要写HILO寄存器,与之前实现的通用寄存器一样,对HILO寄存器的写操作放在回写阶段进行。

          (1)在译码阶段根据指令。给出运算类型alusel_o、运算子类型aluop_o的值,同一时候读出地址为rs的通用寄存器的值。

    因为mthimtlo不写通用寄存器,所以wreg_oWriteDisablewd_o0

          (2)在运行阶段确定要写HILO寄存器的情况,以及要写入的值,并将这些信息传递到訪存阶段。

          (3)訪存阶段将这些信息再传递到回写阶段。

          (4)回写阶段根据这些信息改动HILO寄存器的值。

          3mfhimflo指令实现思路

          这2条指令须要读HILO寄存器,设计在运行阶段才干读取到。

          (1)在译码阶段根据指令,给出运算类型alusel_o、运算子类型aluop_o的值,同一时候由于有要写的目的寄存器。所以wreg_oWriteEnablewd_o为指令中rd的值,也就是目的寄存器地址。

          (2)在运行阶段获取HILO寄存器的值,作为要写入目的寄存器的数据。并将这些信息传递到訪存阶段。

          (3)訪存阶段将这些信息再传递到回写阶段。

          (4)回写阶段根据这些信息改动目的寄存器。

          加入移动操作指令后的数据流图如图6-2所看到的。


          对照图6-2与图5-7能够发现有例如以下差别。

    •  添加了HILO寄存器模块,而且该模块放在回写阶段。
    •  将HILO寄存器的值传递到运行阶段,在运行阶段添加了一个选择模块,用于选择要參与运算的数据,假设是mfhimflo指令。那么就会选择传递过来的HILO寄存器的值。

    6.2.2 新的数据相关情况的解决

          进一步考虑mfhimflo指令的处理过程。这2条指令会在流水线运行阶段读取HILO寄存器的值,假设直接採用HILO模块给出的HILO寄存器的值。可能不是正确的HILO寄存器的值。由于此时处于訪存、回写阶段的指令有可能会改动HILO寄存器,以例如以下程序为例。

    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

          指令345均要改动HI寄存器,当指令6处于运行阶段时,指令5处于訪存阶段,指令4处于回写阶段,而此时HI寄存器的值是指令3刚刚写入的0x00000000HILO模块正是将该值传到运行阶段,假设採用这个值,那么就会出错,偏离程序设想。正确的值应该是当前处于訪存阶段的指令5要写的数据,如图6-3所看到的。


          似曾相识。是不是?这就是上一章介绍过的数据相关问题,解决措施还是使用数据前推。将处于訪存阶段、回写阶段的指令对HILO寄存器的操作信息反馈到运行阶段,运行阶段根据这些信息,确定HILO寄存器的正确值。

          为此,须要改动数据流图如图6-4所看到的,相比图6-3,主要添加的部分就是将訪存阶段、回写阶段的信息反馈到运行阶段,输入到运行阶段的选择模块(图中粗线所看到的),假设处于运行阶段的是mfhimflo指令,那么就会从中选择HILO寄存器的正确值。


    6.2.3 系统结构的改动

          为了实现移动操作指令须要对OpenMIPS系统结构进行补充完好,主要改动如图6-5所看到的。


          主要有三个方面。

          (1)添加了HILO模块。用于实现HILO寄存器。

          (2)运行阶段的EX模块添加了whilo_ohi_olo_o接口。分别表示是否要写HILO、要写入HI寄存器的值、要写入LO寄存器的值。

    这三个接口传递出来的,对HILO寄存器的改动信息会通过EX/MEMMEMMEM/WB三个模块一直传递到回写阶段,并终于传递给HILO模块。

          (3)运行阶段的EX模块添加了与HILO寄存器有关的输入接口,包含为解决HILO寄存器的数据相关问题而引入的接口,在6.3.3节会有具体介绍。

    下一次会介绍移动操作指令实现,并给出代码,敬请关注!


  • 相关阅读:
    [BZOJ3510][洛谷P4299]首都(LCT)
    [luogu P5325][模板]Min_25筛
    [洛谷P3288][SCOI2014][BZOJ3597]方伯伯运椰子(网络流+图论)
    [洛谷P5342][TJOI2019]甲苯先生的线段树(数位dp)
    [CQOI2012][洛谷P3159][BZOJ2668]交换棋子(网络流+图论)
    [SDOI2015]约数个数和(莫比乌斯反演)
    使用Visual Studio 2005扩展创建Windows SharePoint Services 3.0 Web Part
    C#操作xml文件
    实用JS代码
    ASP.NET分页存储过程自定义用户控件(转)
  • 原文地址:https://www.cnblogs.com/lcchuguo/p/5067501.html
Copyright © 2011-2022 走看看