自己动手写CPU(MIPS)----基础知识补充及单周期CPU取指译码

本次实验开始涉及MIPS架构CPU的设计。MIPS架构的CPU的传统流程为以下五个阶段:

  1. 取指(Instruction Fetch)
  2. 译码(Decode)
  3. 执行(Execution)
  4. 访存(Memory Request)
  5. 回写(Write Back)

实验目的

上一次实验基本完成了访存的功能,这次实验主要是掌握单周期CPU控制器的工作原理及设计方法掌握取指、译码阶段数据通路、控制器的执行过程

开发环境

实验任务

自己动手写CPU(MIPS)----基础知识补充及单周期CPU取指译码_第1张图片

基础知识补充

1、寄存器

处理器包含的软件可见的寄存器种类如下:

  • 32个32 位通用寄存器,r0~r31。其中有两个被赋予了特殊含义:
    r0,0 号通用寄存器,值永远为 0;
    r31,31 号通用寄存器,被 JAL,BLTZAL 和 BGEZAL 指令隐式的用作目标寄存器,存放返回地址。
  • HI/LO 寄存器。HI 寄存器存放乘法指令结果的高半部分或是除法指令结果的余数,LO 寄存器存放
    乘法指令结果的低半部分或是除法指令结果的商。
  • 程序计数器(PC)。这个寄存器软件无法直接访问。
  • 控制寄存器(CP0).一组用于中断、例外控制的寄存器。

2、指令格式

MIPS的指令长度为固定的32bit,不同于RISC-V指令集。MIPS指令集的绝大部分指令格式均为立即数型(I-Type)、跳转型(J-Type)、寄存器型(R-Type)三种之一。
op:指令码
func:功能码
三种指令如图所示:
自己动手写CPU(MIPS)----基础知识补充及单周期CPU取指译码_第2张图片
R类型
具体操作由op、func结合指定,rs和rt是源寄存器的编号,rd是目的寄存器的编号。MIPS有32个通用寄存器,使用5位编码刚好可以全部表示。sa只有在移位指令中使用,用来指定移位位数。

  • 当带有3个寄存器进行操作时,可有寄存器加add、减sub、与and、或or、异或xor指令可表示为

$rd = $rs op $rt

  • 当带有2个寄存器进行操作时,可有逻辑左移sll、逻辑右移srl、算术右移sll指令可表示为

$rd = $rt shift sa

当带有1个寄存器进行操作时,可有寄存器跳转的指令jr
I类型:具体操作由op决定,低16位为立即数
面向运算的I型指令有4种不同的类型:寄存器和立即数的加addi、与andi、或ori、异或xori
要注意的是再算数加中需要对立即数进行符号拓展(看立即数的高位的符号是几再进行01拓展)!其他指令0拓展

$rt = $rs op E(imm)

还有面向访存、面向数位设置、面向条件转移(分支)的I型指令。
J类型:具体操作由op指定,一般是跳转指令,低26位是字地址,用于产生跳转的目标地址。

4、寻址方式

MIPS32架构的寻址模式有寄存器寻址、立即数寻址、寄存器相对寻址和PC相对寻址四种。

  • 其中PC相对寻址,这种寻址方式一般是转移指令会用到,将程序计数寄存器PC和(立即数左移两位后进行符号拓展)相加从而获得有效地址,
    需要注意的是左移两位相当于恢复按字节寻址
  • 寄存器相对寻址不需要左移立即数!

4、协处理器CP0

这是刚才记录寄存器提到的控制寄存器,它主要负责处理指令集的某个扩展,拥有与处理器相独立的寄存器。在MIPS32架构中提供了最多4个协处理器CP0-CP3。

CP0:用于系统控制,具体作用有配置CPU工作状态、高速缓存控制、异常控制、存储单元控制。它主要是通过配置内部的一系列寄存器来完成上述工作。

5、异常

在处理器运行过程中,会从存储器依次取出指令,然后执行,但是有一些时间会打断正常的程序执行流程,这些事件有中断、陷阱、系统调用。异常发生后,处理器会转移到一个事先定义好的地址,在那个地址有异常处理程序,这个地址称为异常处理例程入口地址,异常处理完成后,使用异常返回指令eret,返回到异常发生前的状态继续执行。
中断会在后边的学习中再进行介绍。

单周期数据通路

自己动手写CPU(MIPS)----基础知识补充及单周期CPU取指译码_第3张图片
把蓝色取指译码部分单独拿出来分析:
自己动手写CPU(MIPS)----基础知识补充及单周期CPU取指译码_第4张图片
主要注意一下ALU control他的输入有一个Aluop,它和低6位结合一下来进行判断,这样有助于节省资源。

信号名称 信号无效时含义 信号有效时含义
memtoreg 写入寄存器的值来源于ALU 写入寄存器的值来源于数据存储器
memwrite 数据存储器写使能
memread 数据存储器读使能
pcsrc 顺序执行,取PC+4 跳转,使用目标地址代替PC+4
alusrc ALU第二个输入来源于寄存器堆的第二个输入 ALU第二个输入来源于指令的低16位(目标地址的偏移量)
regdst 写寄存器操作的目标寄存器号来源于指令的rt字段(20:16) 写寄存器操作的目标寄存器号来源于指令的rd字段(15:11)
regwrite 寄存器堆写使能
branch 不是 是为branch指令,且满足branch的条件
jump 不是 是为jump指令
alucontrol ALU控制信号,代表不同的运算类型

下面给出一个参考信号表

自己动手写CPU(MIPS)----基础知识补充及单周期CPU取指译码_第5张图片

参考

重庆大学计算机组成实验
自己动手写CPU

你可能感兴趣的:(自己动手写CPU(MIPS),cpu,verilog)