前言

P3 开始,工作量暴增。P3 的任务是我们使用 logisim 搭建一个单周期 CPU。想搭好这个 CPU,既要充分地掌握 logisim 的语法,又得学习单周期 CPU 的架构。

以下我将结合自身搭建的过程举例,讲解 CPU 的搭建过程。

CPU 的顶层模块

在搭建前,要对 CPU 的整体架构有一个大致的把握。

单周期 CPU 的顶层包含的模块:PCIMSplitterControllerGRFALUDM

除此之外也可以增加一些自定义模块,起到增加 CPU 集成度,简化布线等作用。

我自己在 P3 增加了两个模块:GRFChooserALUChooser,分别选择 GRFALU 的输入信号。

我的 CPU 顶层模块一览:

通过编辑模块外观做到了简洁布线,视觉效果整体较为美观。

PC

PC 模块的输出端口需要提供当前的指令地址。其输入端口需要包含跳转地址与跳转使能信号。

PC 模块在功能上要做到以下两点:

  1. 在经过一个周期后 PC 值能自增 4
  2. 在收到跳转类指令时能修改 PC 的值到目标地址。

IM

IM 使用 ROM 模块实现即可。

我们需要做的只是初始化 RAM 内部数据。将当前指令地址连接到 RAM 的地址端,数据端就是对应的 指令值

Splitter

Splitter 需要将读到的指令进行拆分,拆分成不同信号传递给不同的模块以供使用。

其内部直接使用分线器实现即可。

Controller

端口

Controller 我们要进行指令的译码工作。根据指令的内容生成相应的控制信号。

一般而言需包含以下控制信号:

  • ALUControl:控制 ALU 模块行为,根据不同指令 ALU 对输入需要实现不同的运算。
  • MemWrite:控制 DM 模块的写入使能信号。
  • GRFWrite:控制 GRF 模块的写入使能信号。

此外根据个人实现的不同还需要生成跳转信号(JalBeq)以及 GRFALUDM 的相应选择信号。

拿我个人举例,我生成了 RegChoose 信号传递给 REGChooser 模块来选择读取 GRF 的寄存器;生成 ALUChoose 模块来选择 ALU 模块的操作数;生成 MemtoReg 信号来控制写入 GRF 的信号是来自 ALU 还是 DM

细节

Controller 只需要对指令中的 op 字段和 func 字段进行译码。因此实际上只需要传入这两个信号就可以。在内部生成信号时,采用与逻辑判断指令,或逻辑生成信号。举例而言:

采用与逻辑判断指令:

采用或逻辑生成控制信号:

我的 Controller 内的控制信号基本上都是按照这样的逻辑生成的,仅供参考。

GRF

GRF 这个东西大家应该在 P0 做过了,直接拿过来用就行。这个模块没有什么技术含量,硬着头皮连线就行。

ALU

运算的操作数都使用 32 位数。一般而言需要完成基本的加减乘除还有移位操作。

所有运算操作都可以使用 logisim 内置的运算器实现。

DM

DM 使用 RAM 部件即可。Data Interface 可设置成 Separate load and store ports

下图是 DM 的具体连线:

其中 MemAddr 来自于 ALU 的运算结果,MemData 是写入 DM 的数据,来自于 GRF

ALUGRF 的信号片选

这部分可以按照自己的方式自行设计。

我在这部分的设计是这样的:

  1. 传给 ALU 的第一个操作数默认来自 GRFRD1,于是在 REGChooser 模块里要对传给 GRF 的第一个读数地址 A1 进行相应的选择。
  2. 传给 ALU 的第二个操作数从 GRFRD2、指令的 shamt 字段(用于 sllsrl 指令的移位操作)、有符号扩展立即数和无符号扩展立即数(立即数来自于指令的立即数字段)。
  3. GRF 的写入数据来自于 DMALU、以及指令的 instr_index 字段(用于 Jal 指令)。
  4. 根据要实现的以上功能,依据不同的指令生成对应的控制信号。集成设计 Chooser

关于我在这部分的连线可以参考上文的顶层模块图。

上机

上机的时候会让你添加一些奇怪的指令。在课下建议扩展移位指令 sllsrl ,以及存取指令 sbshlblh。此外对 logism 中一些基本但是不常用的运算器等也要好好掌握,比如 Bit Adder

在课上扩展指令的时候要仔细判断控制信号的生成。建议在课下的 CPU 中预留接口。我在课上添加指令的时候基本都是采用对课上指令特判的方式。整体而言,P3 的课上是很简单的,只要课下做的足够认真,课上 AK 都不会有问题。

结语

P3 是我搭建的第一个 CPU。当时是照着计组的大黑书生闷硬造的。从整体架构到细节都由自己设计,看着搭建完的 CPU 心中是成就感满满。

这或许也是学习计组的乐趣所在吧。