自己动手写CPU之第七阶段(1)——简单算术操作指令说明

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


      本章将实现MIPS32指令集架构定义的所有算术操作指令,共有21条,按照OpenMIPS实现这些指令的方式,可以分为三类,分别介绍如下。

      (1)简单算术操作指令

      共有15条,包括加法、减法、比较、乘法等指令,这些指令在流水线的执行阶段都只需要一个时钟周期,而且实现思路很直观,与第4章添加逻辑操作指令类似,只需修改译码阶段的ID模块、执行阶段的EX模块,即可实现。

      (2)乘累加、乘累减指令

      共有4条:乘累加madd、无符号乘累加maddu、乘累减msub、无符号乘累减msubu。其中maddmaddu要求操作数相乘后,再与HILO寄存器的值相加,msubmsubu指令要求操作数相乘后,再与HILO寄存器的值相减,也就是这4条指令都要做两次运算,一次乘法、一次加(减)法,如果将这两次运算放在流水线执行阶段的一个时钟周期中完成,那么会使流水线执行阶段所需要的时间明显增加,从而降低OpenMIPS工作时钟的频率,因此,OpenMIPS设计在流水线执行阶段使用两个时钟周期完成这类指令,一个时钟周期进行乘法,下一个时钟周期进行加(减)法。

     (3)除法指令

      共有2条:有符号除法div、无符号除法divuOpenMIPS计划采用试商法完成除法运算,对于32位的除法,流水线执行阶段至少需要32个时钟周期,也就是除法指令需要多个时钟周期才能完成,所以单独作为一类。

      本章将分别介绍上述三种类别的算术操作指令的实现过程。7.1-7.4节给出了简单算术操作指令的格式、作用,介绍了实现思路,并修改OpenMIPS代码以实现简单算术操作指令,最后通过ModelSim仿真验证是否实现正确。

      因为乘累加、乘累减、除法指令都需要在流水线执行阶段占用多个时钟周期,这就需要使流水线暂停,所以在实现这些指令之前,先要实现流水线暂停,在7.5节介绍了使流水线暂停的方法。

      7.6-7.9节给出了乘累加、乘累减指令的格式、作用,介绍了实现思路,并修改OpenMIPS代码以实现乘累加、乘累减指令,最后进行仿真测试。

      7.10-7.13节给出了除法指令的格式、作用,介绍了实现思路,并修改OpenMIPS代码以实现除法指令,最后进行仿真测试。

      7.14节给出了实现算术操作指令后的数据流图。

7.1 简单算术操作指令说明

      简单算术操作指令包括:addaddiaddiuaddusubsubuclo

  • 11
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值