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

下一篇:指令执行阶段

前言

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

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

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

待以后实现的:

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

我将使用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 浮点寄存器

下一篇:指令执行阶段

你可能感兴趣的:(CPU)