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

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

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
⾃⼰动⼿写CPU之第七阶段(1)——简单算术操作指令说明将陆续上传本⼈写的新书《⾃⼰动⼿写 CPU》(尚未出版),今天是第24篇,我尽量每周四篇 本章将实现MIPS32指令集架构定义的所有算术操作指令,共有21条,按照OpenMIPS实现这些指令的⽅ 式,可以分为三类,分别介绍如下。 (1)简单算术操作指令 共有15条,包括加法、减法、⽐较、乘法等指令,这些指令在流⽔线的执⾏阶段都只需要⼀个时钟周 期,⽽且实现思路很直观,与 第4章添加逻辑操作指令类似,只需修改译码阶段的ID模块、执⾏阶段的EX模块,即可实现。 (2)乘累加、乘累减指令 共有4条:乘累加madd、⽆符号乘累加maddu、乘累减msub、⽆符号乘累减msubu。其中madd、maddu要 求操作数相乘后,再 与HI、LO寄存器的值相加,msub、msubu指令要求操作数相乘后,再与HI、LO寄存器的值相减,也就 是这4条指令都要做两次运算,⼀次乘法、⼀次加(减)法,如果将这两次运算放在流⽔线执⾏阶段的 ⼀个时钟周期中完成,那么会使流⽔线执⾏阶段所需要的时间明显增加,从⽽降低OpenMIPS⼯作时钟 的频率,因此,OpenMIPS设计在流⽔线执⾏阶段使⽤两个时钟周期完成这类指令,⼀个时钟周期进⾏ 乘法,下⼀个时钟周期进⾏加(减)法。 (3)除法指令 共有2条:有符号除法div、⽆符号除法divu。OpenMIPS计划采⽤试商法完成除法运算,对于32位的除 法,流⽔线执⾏阶段⾄少需 要32个时钟周期,也就是除法指令需要多个时钟周期才能完成,所以单独作为⼀类。 本章将分别介绍上述三种类别的算术操作指令的实现过程。7.1-7.4节给出了简单算术操作指令的格式、 作⽤,介绍了实现思路,并修改OpenMIPS代码以实现简单算术操作指令,最后通过ModelSim仿真验证 是否实现正确。 因为乘累加、乘累减、除法指令都需要在流⽔线执⾏阶段占⽤多个时钟周期,这就需要使流⽔线暂停, 所以在实现这些指令之前,先要实现流⽔线暂停,在7.5节介绍了使流⽔线暂停的⽅法。 7.6-7.9节给出了乘累加、乘累减指令的格式、作⽤,介绍了实现思路,并修改OpenMIPS代码以实现乘累 加、乘累减指令,最后进⾏仿真测试。 7.10-7.13节给出了除法指令的格式、作⽤,介绍了实现思路,并修改OpenMIPS代码以实现除法指令,最 后进⾏仿真测试。 7.14节给出了实现算术操作指令后的数据流图。 7.1 简单算术操作指令说明 简单算术操作指令包括:add、addi、addiu、addu、sub、subu、clo、clz、slt、slti、sltiu、sltu、mul、 mult、multu ,共15条指令,各指令的格式及作⽤说明如下。 1、add、addu、sub、sub、slt、sltu指令 这6条指令的格式如图7-1所⽰。从图中可以发现这6条指令都是R类型指令,并且指令码都是6b000000 , 即SPECIAL类,另外第6-10bit都为0 ,需要依据指令中0-5bit功能码的值进⼀步判断是哪⼀种指令。 当功能码是6b100000时,表⽰是add指令,加法运算 指令⽤法为:add rd, rs, rt 指令作⽤为:rd - rs + rt ,将地址为rs的通⽤寄存器的值,与地址为rt的通⽤寄存器的值进⾏加法运算, 结果保存到地址为rd的通⽤寄存器中。但是有⼀种特殊情况:如果加法运算溢出,那么会产⽣溢出异 常,同时不保存结果。 当功能码是6b100001时,表⽰是addu指令,加法运算 指令⽤法为:addu rd, rs, rt 指令作⽤为:rd - rs + rt ,将地址为rs的通⽤寄存器的值,与地址为rt的通⽤寄存器的值进⾏加法运算, 结果保存到地址为rd的通⽤寄存器中。与add指令不同之处在于addu指令不进⾏溢出检查,总是将结果保 存到⽬的寄存器。 当功能码是6b100010时,表⽰是sub指令,减法运算 指令⽤法为:sub rd, rs, rt 指令作⽤为:rd - rs - rt ,将地址为rs的通⽤寄存器的值,与地址为rt的通⽤寄存器的值进⾏减法运算, 结果保存到地址为rd的通⽤寄存器中。但是有⼀种特殊情况:如果减法运算溢出,那么产⽣溢出异常, 同时不保存结果。 当功能码是6b100011时,表⽰是subu指令,减法运算 指令⽤法为:subu rd, rs, rt 指令作⽤为:rd - rs - rt ,将地址为rs的通⽤寄存器的值,与地址为rt的通⽤寄存器的值进⾏减法运算, 结果保存到地址为rd的通⽤寄存器中。与sub指令不同之处在于subu指令不进⾏溢出检查,总是

文档评论(0)

A13865477551 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档