将陆续上传本人写的新书《自己动手写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