如何制造一个CPU(1.1):无数据冲突、结构冲突处理的大部分指令实现

1 一些说明

这个系列的文章主要参考了《自己动手造CPU》这本书,但是组织结构的方式和它不甚相同。《自》把实现的指令分成了几个部分,分别讲述了这些指令的实现方法和如何解决数据冲突和结构冲突。而我准备把所有指令的实现放到一起来讲,然后再加入解决冲突的方法。这样做的原因主要是,不想把书中的内容原封不动地抄一遍,按照不同的逻辑来组织内容才有更多价值。(虽然我之前已经算是重新组织了,我用VHDL写的,《自》中用的是Verilog)

本文章目前处在随时修订的状态。

2 流水线的实现

3 特殊功能模块的实现

3.1 REGISTERS

3.2 PAUSE_CTRL

3.3 HI_LO

3.4 CP0_REG

4 实现的指令及其数据通路

4.1 算术操作指令

4.1.1 简单算术逻辑操作指令

简单算操作指令共有15条:

  • ADD:有异常的加法
  • ADDU:无异常的加法
  • SUB:有异常的减法
  • SUBU:无异常的减法
  • ADDI:有异常的立即数加法
  • ADDIU:无异常的立即数无符号加法
  • CLO:计算前导1个数
  • CLZ:计算前导0个数
  • SLT:进行<比较
  • SLTI:进行<立即数比较
  • SLTIU:进行<立即数无符号比较
  • SLTU:进行<无符号比较
  • MUL:乘法,保存低32位
  • MULT:乘法
  • MULTU:无符号乘法

逻辑操作指令共有8条:

  • AND:逻辑与
  • ANDI:逻辑与立即数
  • OR:逻辑或
  • ORI:逻辑或立即数
  • XOR:逻辑异或
  • XORI:逻辑异或立即数
  • NOR:逻辑或非
  • LUI:加载到高16位

移位操作指令共有6条:

空指令共有3条:

  • NOP
  • SSNOP:特殊类型的空指令,在标量处理器中可以直接当做空指令
  • SYNC:保证加载存储指令的执行顺序,此处是严格按照顺序进行的

主要的执行步骤包括:

  • 在ID段完成译码和取寄存器数据
  • 在EX段完成运算结果的计算和异常类型(是否overflow)的计算
  • 在MEM/WB段完成对普通寄存器和HILO寄存器的回写,将异常类型传递给CP0_REG模块

4.1.1.1 ID段:译码和取寄存器数据过程

指令类型 具体指令 译码过程
SPECIAL类指令 ADD, ADDU, SUB, SUBU, SLT, SLTU, MULT, MULTU, AND, OR, XOR, NOR 先通过指令操作码(31..26)判断出是SPECIAL类指令,然后通过指令功能码(5..0)判断出是哪条指令。取出rs(25..21)和rt(20..16)中的值作为操作数,计算结果存入rd(15..11)中。
SPECIAL2类指令 CLO, CLZ,
MUL
先通过指令操作码(31..26)判断出是SPECIAL2类指令,然后通过指令功能码(5..0)判断出是哪条指令。
其他指令 ADDI, ADDIU, SLTI, SLTIU, ANDI, ORI, XORI 直接通过指令操作码(31..26)判断出是哪条指令。取出rs

判断出指令之后,将需要读的寄存器的地址传递给REGISTER模块,在一个周期内读出数据;然后将两个操作数和需要写寄存器的使能、地址(或者写HILO寄存器)传递给EX模块。

代码

MULTMULTU指令的译码:

ADDADDUSUBSUBU指令的译码:

SLTSLTU指令的译码:

MULCLOCLZ指令的译码:

ADDIADDIU指令的译码:

SLTISLTIU指令的译码:

4.1.2.2 EX段:执行过程

EX段对上述简单算术指令进行计算,均能在一个周期内完成;然后将是否溢出、写寄存器使能、地址和数据(或者HILO寄存器的写使能和数据)传递给

代码

执行过程:

计算HILO数据和异常类型:

4.1.2.4 MEM/WB段:回写过程

MEM/WB段将寄存器写数据和HILO数据传递给相应模块。代码略。

4.1.1.5 指令数据通路

simple-arith-special-dataflow.png

图2.1-1 SPECIAL类指令数据通路

simple-arith-special2-dataflow.png

图2.1-2 SPECIAL2类指令数据通路

simple-arith-special-dataflow.png

图2.1-3 其他指令数据流图

4.1.2 乘累加和乘累减指令

指令的主要执行步骤包括:

  • ID段:译码和从寄存器堆取操作数

4.2 逻辑指令和空指令

4.3 移动操作指令

4.4 转移指令

4.5 加载存储指令

4.6 CP0指令

5 代码

5.1 PC模块


新增一则回应

除非特别注明,本页内容采用以下授权方式: Creative Commons Attribution-ShareAlike 3.0 License