计算机组成实验 P3 回顾
前言
从 P3 开始,工作量暴增。P3 的任务是我们使用 logisim 搭建一个单周期 CPU。想搭好这个 CPU,既要充分地掌握 logisim 的语法,又得学习单周期 CPU 的架构。
以下我将结合自身搭建的过程举例,讲解 CPU 的搭建过程。
CPU 的顶层模块
在搭建前,要对 CPU 的整体架构有一个大致的把握。
单周期 CPU 的顶层包含的模块:PC,IM,Splitter,Controller,GRF,ALU,DM。
除此之外也可以增加一些自定义模块,起到增加 CPU 集成度,简化布线等作用。
我自己在 P3 增加了两个模块:GRFChooser 和 ALUChooser,分别选择 GRF 和 ALU 的输入信号。
我的 CPU 顶层模块一览:
通过编辑模块外观做到了简洁布线,视觉效果整体较为美观。
PC
PC 模块的输出端口需要提供当前的指令地址。其输入端口需要包含跳转地址与跳转使能信号。
PC 模块在功能上要做到以下两点:
- 在经过一个周期后 PC 值能自增 4。
- 在收到跳转类指令时能修改 PC 的值到目标地址。
IM
IM 使用 ROM 模块实现即可。
我们需要做的只是初始化 RAM 内部数据。将当前指令地址连接到 RAM 的地址端,数据端就是对应的 指令值。
Splitter
Splitter 需要将读到的指令进行拆分,拆分成不同信号传递给不同的模块以供使用。
其内部直接使用分线器实现即可。
Controller
端口
在 Controller 我们要进行指令的译码工作。根据指令的内容生成相应的控制信号。
一般而言需包含以下控制信号:
- ALUControl:控制 ALU 模块行为,根据不同指令 ALU 对输入需要实现不同的运算。
- MemWrite:控制 DM 模块的写入使能信号。
- GRFWrite:控制 GRF 模块的写入使能信号。
此外根据个人实现的不同还需要生成跳转信号(Jal 和 Beq)以及 GRF、ALU、DM 的相应选择信号。
拿我个人举例,我生成了 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。
ALU 和 GRF 的信号片选
这部分可以按照自己的方式自行设计。
我在这部分的设计是这样的:
- 传给 ALU 的第一个操作数默认来自 GRF 的 RD1,于是在 REGChooser 模块里要对传给 GRF 的第一个读数地址 A1 进行相应的选择。
- 传给 ALU 的第二个操作数从 GRF 的 RD2、指令的 shamt 字段(用于 sll 和 srl 指令的移位操作)、有符号扩展立即数和无符号扩展立即数(立即数来自于指令的立即数字段)。
- GRF 的写入数据来自于 DM、ALU、以及指令的 instr_index 字段(用于 Jal 指令)。
- 根据要实现的以上功能,依据不同的指令生成对应的控制信号。集成设计 Chooser 。
关于我在这部分的连线可以参考上文的顶层模块图。
上机
上机的时候会让你添加一些奇怪的指令。在课下建议扩展移位指令 sll 和 srl ,以及存取指令 sb、sh、lb、lh。此外对 logism 中一些基本但是不常用的运算器等也要好好掌握,比如 Bit Adder。
在课上扩展指令的时候要仔细判断控制信号的生成。建议在课下的 CPU 中预留接口。我在课上添加指令的时候基本都是采用对课上指令特判的方式。整体而言,P3 的课上是很简单的,只要课下做的足够认真,课上 AK 都不会有问题。
结语
P3 是我搭建的第一个 CPU。当时是照着计组的大黑书生闷硬造的。从整体架构到细节都由自己设计,看着搭建完的 CPU 心中是成就感满满。
这或许也是学习计组的乐趣所在吧。