引言
此专栏的文章记录自己学习《自己动手写CPU》的过程。算是一个学习笔记,里面也会夹杂个人的思考以及代码编写。希望自己可以像作者一样,坚持到最后。加油~~
本篇学习MIPS32处理器的基本架构。
致谢
感谢书籍《自己动手写CPU》及其作者雷思磊。一并感谢开源精神。
目录
引言
致谢
处理器与MIPS
1、计算机的简单模型
2、架构与指令集
3、MIPS的ISA演变
4、MIPS32 Release 1 指令集架构
1、数据类型
2、寄存器
3、字节次序
4、指令格式
5、指令集
6、寻址方式
7、协处理器CP0
8、异常
硬件描述语言 Verilog
处理器与MIPS
1、计算机的简单模型
计算机主要由三大组成部分构成:处理器、输入输出、存储器。
汇编指令将助记符进行译码,变为二进制数据,供计算机识别、执行。
高级语言先通过编译变为汇编语言,然后通过汇编指令将指令翻译为二进制编码数据。
2、架构与指令集
指令集架构(ISA):包括了一套指令集和一些寄存器。面向ISA编程的最大优点就是,程序的执行无关处理器类型,无关硬件。ISA本身是一个抽象物,不涉及任何实现的硬件与环境。
微架构:是ISA的具体实现。
同样的ISA,不同的微架构则会带来不同的性能。
根据不同的ISA,可将计算机分为两类:复杂指令集计算机(CISC)、精简指令集计算机(RISC)。二者的主要区别在于:
CISC指令编码长度不一致;
RISC指令编码长度一致且固定;
ISA种类:
x86:属CISC范畴
ARM:Acorn RISC Machine ,属RISC范畴,目前ARM公司仅作CPU内核设计,不做具体的芯片制造和生产。其产品侧重于低功耗、低成本,主要面向嵌入式应用。
SPARC:Scalable Processor ARChitecture ,可扩展处理器架构。属RISC范畴。
POWER:Performance Optimization With Enhanced RISC ,属RISC范畴。IBM公司的产品。
MIPS:Microprocessor without Interlocked Piped Stages,无内锁流水线处理器。属RISC范畴。其设计理念:使用简单的指令,结合优秀的编译器,采用流水线执行指令的硬件,就可以用更少的晶圆面积生产更快的处理器。龙芯处理器采用的就是此架构。
3、MIPS的ISA演变
4、MIPS32 Release 1 指令集架构
该参考数目的处理器设计就是遵循 MIPS32 Release 1 架构。
1、数据类型
- 位(b):长度为 1 bit;
- 字节(Byte):长度为8 bit;
- 半字(HalfWord):长度16 bit;
- 字(Word):长度为 32 bit;
- 双字(Double Word):长度为 64bit;
- 另:32位单精度浮点数,64位双精度浮点数;
2、寄存器
MIPS32的指令中处了 加载/存储指令外,其他指令都是用寄存器或者立即数作为操作数。因为寄存器的存取可以在一个时钟周期内完成。
MIPS32中的寄存器类别:通用寄存器、特殊寄存器。
1、通用寄存器
MIPS32架构定义了 32 个 32 位宽的寄存器,用 $0 ~ $31表示。$0 一般用作常量 0;
实际使用中,寄存器一般遵循如下的约定:
2、特殊寄存器
MIPS32中的特殊寄存器有3个:PC(程序计数器)、HI(乘除结果高位寄存器)、LO(乘除结果地位寄存器)。乘法运算时,HI保存乘法结果的高32位,LO保存低32位。除法运算时,HI存储余数,LO存储商。
3、字节次序
数据在存储器中的存取都是以字节为单位的,所以当存取的数据的位宽多于1个字节时,就需要明确数据的大小端模式。
大端模式:MSB,数据高位存储于低地址;
小端模式: LSB,数据低位保存在低地址;
参考书中MIPS32的实现是大端模式。
示例:
4、指令格式
MIPS32的架构中,指令位宽都是32。
图中 op 为指令码;func 为功能码;
5、指令集
1、逻辑操作指令
包含8条指令:and 、andi 、or 、ori 、xor 、xori 、nor 、lui
2、移位操作指令
包含6条指令:sll 、sllv 、sra 、srav 、srl 、srlv
3、移动操作指令
包含6条指令:movn、movz、mfhi、mthi、mflo、mtlo
4、算术操作指令
包含21条指令:add、addi、addiu、addu、sub、subu、clo、clz、slt、slti、sltiu、sltu、mul、mult、multu、madd、maddu、msub、msubu、div、divu
5、转移指令
包含14条指令:jr 、jalr 、j、jal、b、bal、beq、bgez、bgezal、bgtz、blez、bltz、bltzal、bne
6、加载存储指令
包含14条指令:lb、lbu、lh、lhu、ll、lw、lwl、lwr、sb、sc、sh、sw、swl、swr
7、协处理器访问指令
包含2条指令:mtc0、mfc0
8、异常相关指令
包含14条指令,其中12条自陷指令:teq、tge、tgeu、tlt、tltu、tne、teqi、tgei、tgeiu、tlti、tltiu、tnei;系统调用指令:syscall、异常返回指令:eret
9、其余指令
包含4条指令:nop、ssnop、sync、pref
6、寻址方式
MIPS32架构的寻址方式:寄存器寻址、立即数寻址、寄存器相对寻址、PC相对寻址。
1、寄存器相对寻址:
2、PC相对寻址
7、协处理器CP0
MIPS32架构提供了最多 4 个协处理器,分别是 CP0 ~ CP3。其中CP0用作系统控制,CP1、CP3作浮点处理单元。CP2用于特定实现。除CP0以外的协处理器都是可选的。
协处理器CP0,主要的作用:
配置CPU工作状态;
高速缓存控制;
异常控制;
存储单元管理;
8、异常
硬件描述语言 Verilog
此部分本人比较了解,就不再记录。建议初学者查看我的下面的专栏,快速了解Verilog HDL语法:
Verilog HDL 语法整理https://blog.csdn.net/qq_43045275/category_11341294.html?spm=1001.2014.3001.5482