简单的多周期MIPS I CPU设计(一)—— 综述

xiaoxiao2021-02-28  16

下一篇:指令执行阶段

前言

新系列~为了准备数电期末作品而开的新坑~ 推荐CMU的计算机组成原理课程,超赞。

本系列文章将介绍我的MIPS I CPU的实现,我们先规定我们的路线图:

MIPS I中的R型、I型、J型指令,暂不支持syscall和break指令流水线寄存器重命名有一级指令缓存以及一级数据缓存支持数据联络(通过UART与电脑传输数据)

待以后实现的:

整数乘除法流水线浮点处理单元与闪存的交互异常处理器分支预测值预测

我将使用Verilog实现本项目,不过文章将不涉及具体的代码实现,只讲实现思路,如果有兴趣的话可以到我的GitHub仓库查看: https://github.com/huanghongxun/MIPS-I-CPU

综述

MIPS 特点

我们首先浏览一下MIPS指令的特点:

所有指令都是32位长有32个寄存器,可能是32位、64位等所有运算都是32位的,没有只针对一个字节的运算内存中的数据访问必须至少四字节(一个字长)对齐跳转指令的目标地址只有26位,补了2位后,也只能寻址28位的空间(符号扩展)。也就是说指令最多只能跳转到[-128M,128M)的区域内。条件分支指令的偏移地址只有16位,补了2位后,也只能寻址18位的空间(符号扩展)。也就是说指令最多只能跳转到[-128K,128K)的区域内。由于立即数的位数不够(最多只有26位),因此必须利用lui和ori两条指令加载超过26位的大整数常数。

指令格式

MIPS I架构的指令主要分为三种:R型指令、I型指令和J型指令。

R型指令

R型指令一般是有两个操作数(都从寄存器中读取)的算术逻辑运算指令,以及无条件跳转jr和jalr指令。 R型指令的格式如下:

宽度:6 5 5 5 5 6 +---------+----+----+----+----+------+ | Op-code | Rs | Rt | Rd | SA | func | +---------+----+----+----+----+------+ op-code 长6位,表示指令的代码,如果是算术逻辑运算指令,这里是000000。Rs 长5位,表示第一个操作数寄存器的编号(因为寄存器有32个)Rt 长5位,表示第二个操作数寄存器的编号Rd 长5位,表示存放结果的寄存器的编号SA(Shift amount)func 长6位,由于指令还剩一些位,因此我们将op-code限制为000000,然后通过func来区分指令

I型指令

I型指令一般是有两个操作数(一个从寄存器中读取,一个是指令中低16位读取立即数)的算术逻辑运算指令、内存操作指令(根据寄存器存储的地址的偏移量找到数据)以及条件分支指令(跳转到相对偏移量的新地址)。 I型指令的格式如下:

6 5 5 16 +---------+----+----+---------------------------------+ | Op-code | Rs | Rt | 立即数(immediate)或偏移量(offset) | +---------+----+----+---------------------------------+

J型指令

只有j和jal两个指令,跳转到指令中读取的相对地址。

6 26 +---------+---------------------------------------+ | Op-code | jump_target | +---------+---------------------------------------+

寄存器

MIPS架构的CPU拥有32个通用寄存器和32个浮点寄存器,每个寄存器的编号、 代号以及用途如下:

编号名称用途$0$zero常量0,且不会被用户指令修改$1$at汇编器保留,用于伪指令的编译(比如解决加载大常数时立即数位数不够)$2-$3$v0-$v1函数调用返回值$4-$7$a0-$a3函数调用参数,用于传递参数$8-$15$t0-$t7临时变量$16-$23$s0-$s7临时变量(和$fp与$ra在函数调用时予以保留和恢复)$24-$25$t8-$t9临时变量$26-$27$k0-$k1操作系统保留,给内核使用$28$gp全局指针(用于访问全局数据)$29$sp堆栈指针$30$fp栈帧指针$31$ra返回地址(和jal、jalr指令有关,通过存储跳转前的指令地址,实现子程序)$f0-$f31浮点寄存器

下一篇:指令执行阶段

转载请注明原文地址: https://www.6miu.com/read-1600080.html

最新回复(0)