Bonky
Neither believe nor reject anything, because any other person has rejected or believed it. Heaven has given you a mind for judging truth and error, Use it.
By Thomas Jefferson

计算机组成课设 – 实现一个五级流水的CPU

这里我们实现的是五级流水的 CPU 的一条指令,ori指令

ori 指令

ori 指令格式如下:

image-20191223003814409

作用是将指令中的 16 位立即数 immediate 进行无符号扩展至 32 位,然后与索引为 rs 的通用寄存器的值进行逻辑或运算,运算结果保存到索引为 rt 的通用寄存器中。

无符号扩展

image-20191223004015681

通用寄存器

ori 指令中的 rs 和 rt 就是通用寄存器的索引,例如:当 rs 为 5’b00011 时,就表示通用寄存器 $3。

建立五级流水线结构

流水线模型可以简单描述为以下:信号在寄存器之间传递,每传递到一级都会引起相应的组合逻辑电路变化,对这种模型进行抽象描述就是寄存器传输级(抽象程度,更底层还有门级)。一个简单的表示如下:

image-20191223005254717

ori 指令在流水线中的处理过程了可以表示如下:

image-20191223005109450

图中深色部分对应的是D触发器,深色部分之间的部分对应组合逻辑。各个阶段完成的主要工作如下。

  • 取指:取出指令存储器中的指令,PC 值递增,准备取下一条指令。
  • 译码:对指令进行译码,依据译码结果 ,从 32 个通用寄存器中取出源操作数,有的指令要求两个源操作数都是寄存器的值,比如 or 指令,有的指令要求其中一个源操作数是指令立即数的扩展,比如 ori 指令,所以这里有两个复用器,用于依据指要求,确定参与运算的操作数,最终确定的两个操作数会送到执行阶段。
  • 执行阶段:依据译码阶段送入的源操作数、操作码,进行运算,对于 ori 指令而言 ,就是进行逻辑”或“运算,运算结果传递到访存阶段。
  • 访存阶段:对于 ori 指令,在访存阶段没有任何操作,直接将运算结果向下传递到回写阶段。
  • 回写阶段:将运算结果保存到目的寄存器。

结构图如下:

image-20191223010258832

宏定义

实现

取指阶段

image-20191223110142622

PC 模块

接口描述如下

image-20191223011542985

核心代码如下:

IF/ID 模块

接口描述如下

image-20191223011613427

核心代码:

译码阶段

Regfile 模块

image-20191223110101637

接口描述如下

image-20191223105745046

image-20191223105754039

核心代码

其中读操作的理解如下:

  • 当复位信号有效时,第一个读寄存器端口的输出始终为 0。
  • 当复位信号无效时,如果读取的是 \0, 那么直接给出 0(MIPS32架构规定0 的值只能为 0,所以不要写入)
  • 如果第一个读寄存器端口要读取的目标寄存器与要写入的目的寄存器是同一个寄存器,那么直接将要写入的值作为第一个读寄存器端口的输出。
  • 如果上述情况都不满足,写入对应寄存器。
  • 第一个读寄存器端口不能使用时,直接输出 0。

ID 模块

ID模块的作用是对指令进行译码,得到最终运算的类型、子类型、源操作数1、源操作数2、要写入的目的寄存器地址等信息,其中运算类型指的是逻辑运算、移位运算、算术运算等,子类型指的是更加详细的运算类型,比如:当运算类型是逻辑运算时,运算子类型可以是逻辑或运算、逻辑与运算、逻辑异或运算等。

image-20191223111728424

接口描述如下

image-20191223111709677

image-20191223112254541

核心代码如下

ID/EX 模块

image-20191223130229133

接口描述:

image-20191223130256989

核心代码如下:

执行阶段的实现

EX 模块

image-20191223130601740

接口描述:

image-20191223130646341

核心代码如下:

EX/MEM 模块

image-20191223133829208

接口描述:

image-20191223133925017

核心代码如下:

访存/回写阶段的实现

MEM 模块

image-20191223134410945

接口描述如下:

image-20191223134431808

核心代码如下:

MEM/WB 模块

屏幕快照 2019-12-23 下午2.00.26

接口描述如下:

image-20191223140202156

image-20191223140228972

核心代码如下:

顶层模块 OpenMIPS 的实现

顶层模块 OpenMIPS 主要内容就是对上面实现的流水线各个 阶段的模块进行实例化、连接,连接关系就如图所示。

2019-12-22-170259

当然,OpenMIPS 是一个大黑盒,具体我们可以这么表述:

image-20191223142313759

核心代码如下:

验证

指令存储器 ROM

image-20191223142842231

接口描述如下:

image-20191223142913722

核心代码如下:

上面的代码有个很费解的地方:addr[InstMemNumLog2+1:2] 这个地方。其中 lnstMemNun1Log2 是指令存储器的实际地址宽度。这么做的原因是因为每次给出指令地址是基于字节的,所以要右移两位使用。(就比如我要读0xC,对应的 inst_mem 是第三个元素,0xC 除以 4 等于 0x3)

image-20191223144943340

最小 SOPC 的实现

image-20191223145232089

具体实现就是定义线,然后把线连起来就可以了

建立 Test Bench 文件

核心代码如下:

Share

You may also like...

发表评论

电子邮件地址不会被公开。 必填项已用*标注