自己动手写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. c#.net常用函数和方法集
  2. func_num_args()
  3. java综合图形界面程序设计_java综合图形界面程序设计.doc
  4. linux找数组规矩,linux shell 数组建立及使用技巧(示例代码)
  5. 47不用加减乘除做加法
  6. Curie%20Module有什么用
  7. 在VSCode中编辑HTML文档时,在Dom标签上写style属性时智能提示的问题
  8. 找出数组的最大公约数
  9. 计数译码显示电路实验报告总结_译码器及其应用
  10. 剑指offer——面试题42-2:翻转单词顺序
  11. 最易理解的傅里叶分析讲解
  12. 八卦图代码matlab,12行javascript代码绘制一个八卦图_javascript技巧
  13. windows下怎么用basename_比较下养殖用铁丝网还是尼龙网,你会怎么选择?
  14. 数据仓库整合各系统码表和参数表
  15. 4、Hive数据仓库——加载数据
  16. C语言libiconv编程,libiconv字符集转换库在C#中的使用
  17. JavaScript之表单验证
  18. c++如何侦测鼠标点击?
  19. JTAG各类接口针脚定义、含义以及SWD接线方式
  20. Qt 5.7 亮瞎眼的更新

热门文章

  1. Change code to ensure that OPA5 work also in WebIDE
  2. SAP UI5 application - model propagation
  3. 处理ABAP Netweaver gateway service使用过程中遇到的400 error - invalid key predicate type for guid
  4. Cloud for Customer里的使用的一个第三方js库,用于gzip处理
  5. Marketing Cloud里使用了哪个版本的UI5 Odata模型?
  6. How is Attachment property retrieved
  7. 使用test BSP application CRM_THTMLB_TEST
  8. Service order save debug for distribution lock set logic
  9. why my filter by titleID does not work
  10. SAP S/4HANA生产订单释放后自动同步到MES系统