引言

此专栏的文章记录自己学习《自己动手写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架构定义了 3232 位宽的寄存器,用 $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