本文主要是介绍自己动手写CPU(MIPS)----基础知识补充及单周期CPU取指译码,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
本次实验开始涉及MIPS架构CPU的设计。MIPS架构的CPU的传统流程为以下五个阶段:
- 取指(Instruction Fetch)
- 译码(Decode)
- 执行(Execution)
- 访存(Memory Request)
- 回写(Write Back)
实验目的
上一次实验基本完成了访存的功能,这次实验主要是掌握单周期CPU控制器的工作原理及设计方法;掌握取指、译码阶段数据通路、控制器的执行过程。
开发环境
实验任务
基础知识补充
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:功能码
三种指令如图所示:
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,返回到异常发生前的状态继续执行。
中断会在后边的学习中再进行介绍。
单周期数据通路
把蓝色取指译码部分单独拿出来分析:
主要注意一下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
这篇关于自己动手写CPU(MIPS)----基础知识补充及单周期CPU取指译码的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!