自己动手写CPU(3)逻辑、移位操作与空指令

指令说明

MIPS32指令集架构中定义的逻辑操作指令有8条: and、andi、or、ori、xor、xori、nor、lui,其中 ori指令已经实现。

MIPS32指令集架构中定义的移位操作指令有6条: sll、sllv、sra、srav、srl、srlv。

MIPS32指令集架构中定义的空指令有2条: nop、ssnop。其中 ssnop是一种特殊类型的空操作,在每个周期发射多条指令的CPU中,使用ssnop指令可以确保单独占用一个发射周期。OpenMIPS 设计为标量处理器,也就是每个周期发射一条指令,所以ssnop 的作用与nop相同,可以按照nop指令的处理方式来处理ssnop指令

此外还有sync、pref这两条指令,其中sync指令用于保证加载、存储操作的顺序,但对于OpenMIPS而言,它是严格按照指令顺序执行的,加载、存储操作也是按照操作顺序进行的,所以可以将sync指令当做nop指令处理;pref指令用于缓存预取,OpenMIPS未实现缓存,所以也将该指令当做nop指令处理。

指令格式

and、or、xor、nor指令格式

  1. and指令,功能码是6’b100100,逻辑“与”运算。

    指令用法:and rd, rs,rt (rd <- rs AND rt)

  2. or指令,功能码是6’b100101,逻辑“或”运算。

    指令用法:or rd, rs,rt (rd <- rs OR rt)

  3. xor指令,功能码是6’b100110,异或运算。

    指令用法:xor rd, rs,rt (rd <- rs XOR rt)

  4. nor指令,功能码是6’b100111,或非运算。

    指令用法:nor rd, rs,rt (rd <- rs NOR rt)

andi、xori指令格式

  1. andi指令,指令码是6’b001100,逻辑“与”运算。

    指令用法:andi rt, rs,imm ( rt <- rs AND zero_extended(imm) )

  2. xori指令,指令码是6’b01110,逻辑“异或”运算

    指令用法:xori rt, rs,imm ( rt <- rs XORI zero_extended(imm) )

lui指令格式

指令用法:lui rt,imm ( rt <- imm || 0^16 , 即将指令中的16bit立即数保存到地址为rt的通用寄存器的高16位,低16位用0填充)

sll、srl、sra、sllv、srlv、 srav指令格式

  1. sll指令,功能码是6’b000000,逻辑左移

    指令用法:sll rd,rt,sa ( rd <- rt << sa(logic) rt的值向左移位sa位,空出来的位置用0填充,结果保存到地址为rd的通用寄存器中)

  2. srl指令,功能码是6’b000010,逻辑右移

    指令用法:srl rd,rt,sa ( rd <- rt >> sa(logic) rt的值向右移位sa位,空出来的位置用0填充,结果保存到地址为rd的通用寄存器中)

  3. sra指令,功能码是6’b000011,算术右移

    指令用法:sra rd,rt,sa ( rd <- rt >> sa(arithmetic) rt的值向右移位sa位,空出来的位置用rt[31]的值填充,结果保存到地址为rd的通用寄存器中)

  4. sllv指令,功能码是6’b000100,逻辑左移

    指令用法:sllv rd,rt,rs ( rd <- rt << rs[4:0] rt的值向左移位rs[4:0]位,空出来的位置用0填充,结果保存到地址为rd的通用寄存器中)

  5. srlv指令,功能码是6’b000110,逻辑右移

    指令用法:srlv rd,rt,rs ( rd <- rt >> rs[4:0] rt的值向右移位rs[4:0]位,空出来的位置用0填充,结果保存到地址为rd的通用寄存器中)

  6. srav指令,功能码是6’b000111,算术右移

    指令用法:srav rd,rt,rs ( rd <- rt >> rs[4:0] rt的值向右移位rs[4:0]位,空出来的位置用rt[31]填充,结果保存到地址为rd的通用寄存器中)

nop、ssnop、sync、pref指令格式

指令说明:空指令

修改代码

为了实现逻辑、移位操作与空指令(其中 nop、ssnop不用特意实现,可以认为是特殊的逻辑左移指令sll),只需要修改OpenMIPS 的如下两个模块。

  • 修改译码阶段的ID模块,用以实现对上述指令的译码。
  • 修改执行阶段的EX模块,使其按照译码结果进行运算。

确定指令种类的过程

疑问之处:书上提供的sync指令的op[10:6]=00001,但代码中判断认为op[10:6]=00000,查阅MIPS32手册后发现,op[10:6]为stype码,可以指定多种类型,全0和00001都在其中,如下图

仿真结果

逻辑功能测试波形图

移位功能测试波形图


与书上提供的汇编代码结果进行核验后完全正确,功能正常实现。其中调试逻辑功能波形图时,寄存器出现X的情况,调试了近两个小时发现是顶层连线连错了,真是个低级错误,希望大家认真仔细,不要重蹈我的覆辙。

项目链接

自己动手写CPU(3)逻辑、移位操作与空指令相关推荐

  1. 《自己动手写CPU》第五章--逻辑、移位操作与空指令的实现

    5.1流水线数据相关问题 流水线中经常有一些被称为"相关"的情况发生,它使得指令序列中下一条指令无法按照设计的时钟周期执行,这些"相关"会降低流水线的性能.流水 ...

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

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

  3. 自己动手写CPU(6)流水线暂停、乘累加减与除法器的实现

    自己动手写CPU(6)流水线暂停.乘累加减与除法器的实现 流水线暂停 因为OpenMIPS设计乘累加.乘累减.除法指令在流水线执行阶段占用多个时钟周期,因此需要暂停流水线,以等待这些多周期指令执行完毕 ...

  4. 自己动手写CPU(4)移动操作指令的实现

    自己动手写CPU(4)移动操作指令的实现 指令说明 MIPS32指令集架构中定义的移动操作指令共有6条: movn.movz.mfhi.mthi.mflo.mtlo,后4条指令涉及对特殊寄存器HI.L ...

  5. 自己动手写CPU(1)五级流水线及CPU第一条指令ori

    自己动手写CPU(1)五级流水线及CPU第一条指令ori 动机 不知为何研一的自由时间突然多起来,可能人一闲下来就容易焦虑吧,hhhhhh.正好之前看到一本<自己动手写CPU>,就按照此书 ...

  6. 自己动手写CPU之第九阶段(2)——加载存储指令说明2(lwl、lwr)

    将陆续上传新书<自己动手写CPU>,今天是第38篇,我尽量每周四篇,但是最近已经很久没有实现这个目标了,一直都有事,不好意思哈. 开展晒书评送书活动,在亚马逊.京东.当当三大图书网站上,发 ...

  7. 自己动手写CPU之第九阶段(2)——载入存储指令说明2(lwl、lwr)

    将陆续上传新书<自己动手写CPU>.今天是第38篇,我尽量每周四篇,可是近期已经非常久没有实现这个目标了.一直都有事,不好意思哈. 开展晒书评送书活动,在亚马逊.京东.当当三大图书站点上, ...

  8. 【自己动手写CPU】异常相关指令的实现

    MIPS架构中定义的异常类型 MIPS32架构中,有些事情打断程序的正常的执行流程,这些事情称为中断.陷阱.系统调用以及其他打断程序执行流程的情况,统称为异常. 此处的OpenMIPS处理器只实现了其 ...

  9. 自己动手写CPU(2)第一条ori指令

    本博客内容基于<自己动手写CPU>这本书 上一篇文章介绍了一下流水线思想.设计流程等,下面我们可以实操一下实现第一条ori指令. 其实实现一条ori指令不难,我目前对这一条指令的理解简单来 ...

最新文章

  1. 剑桥大学发布2019年度AI发展报告,预测未来12个月AI产业6件大事
  2. 2020年人工神经网络第二次作业-参考答案第五题
  3. 【计算机网络】网络层 : 网络层设备 ( 路由器 | 输入端口处理 | 输出端口处理 | 物理层、数据链路层、网络层 设备对比 | 路由表 与 路由转发 )
  4. [Python]理解 if __name__ == ‘__main__‘
  5. python opencv图像匹配_关于python:OpenCV功能匹配多个图像
  6. C++语言 如何用G++进行编译和运行程序
  7. 鱼塘钓鱼(信息学奥赛一本通-T1373)
  8. mysql lru scan depth_如何解决mysql警告:“ InnoDB:page_cleaner:1000毫秒的预期循环用了XXX毫秒。设置可能不是最佳的”?...
  9. 简析:世博会燃印刷业激情
  10. android 高仿国美,iOS高仿国美、二次元应用、点赞喷射动画、电影筛选页等源码...
  11. ug建模文本怎么竖着_ug模型如何雕刻立体汉字
  12. MySQL(管理员常用命令)
  13. 查看本地MYSQL数据库的IP地址
  14. 嵌入式linux开发,.mak是什么文件
  15. whose UTF8 encoding is longer than the max length 32766
  16. 买服务器为何选择华为云?
  17. AD通孔焊盘单独设置铺铜规则
  18. 接口练习--设计一个辅助英雄 接口实现技能治疗
  19. c语言字符数组重置,C语言字符数组初始化
  20. 一个基于.Net开发的Windows截屏录制工具

热门文章

  1. Twice enter press click will trigger backend roundtrip
  2. How does gateway system determine whether cache is hit
  3. 从手机App通过WebSocket向浏览器推送数据
  4. SAP APF框架错误消息Filter is too complex的处理
  5. 如何处理CRM_ORGMAN 300 error message
  6. workaround: 从product category移除settype时绕过check
  7. 利用代码生成right scope数据
  8. SAP UI5框架 component.js的加载原理
  9. 怎么实现阵列装配_第九篇:磁盘阵列和群晖SHR
  10. Java Array.sort的六种常用方法总结