北航2023计算机组成实验CO-P3-单周期CPU-Logisim

P3-单周期CPU-Logisim

从 P3 开始,我们将正式开始 CPU 的构造和学习。不同于之前的 Project , P3 之后的每个 Project 课下任务工作量和规模都比较大,最重要的是还有课上测试未通过的风险。因此需要投入更多的精力和时间,来保证自己的实验能相对顺利的进行。

一、课下任务

我们需要通过 Logisim 来进行单周期 CPU 的构造,这也将是我们最后一次用到 Logisim。然而如果你是初次接触 CPU,单单只读一两遍指导书可能还是一头雾水,不知如何下手。因此本博客将尝试结合《数字设计和计算机体系结构》这本书和指导书的内容,帮助你深入理解 CPU 的构造和运作,从而更好地搭建出自己的 CPU。

1.1 架构认知

第一次接触这种实验,你会发现一个重要难点在于自己需要一边兼顾整个电路的设计,一边兼顾各个元器件的构造。如果对架构没有足够清晰和熟悉的认知,很容易把自己绕晕。因此,在正式构造前我们尝试借助具体的指令来对整个架构进行熟悉,在此基础上再进行各个元器件的构造,可能会带来更好的效果。

其实,CPU 的主要功能无非就是读入并处理指令。例如add sub lw sw 这些指令,CPU 把它读进来之后有何作用呢? 无非就是会对 CPU 的 寄存器堆(GRF)数据存储器(DM) 产生影响,或者是改变指令执行的顺序(如 beq 指令)。

我们拿 lw 指令来作具体的分析。首先我们从哪里读出来 lw 指令呢?当然是我们的 IFU (取指令单元),我们先不谈论 IFU 是怎么取的。只要知道,我们输入 PC 值,就可以获得一个 32 位的指令 Instr
在这里插入图片描述
这个指令就是 lw的核心内容了,借助 Mars 指令集我们知道其构造:
6位固定信息100011标志lw指令 + 5位 rs 寄存器地址 + 5位 rt 寄存器地址 + 16位偏移量

其主要功能就是读取 rs 寄存器的内容,即基地址;加上16 位偏移量的内容,获取到最终地址;通过这个地址从数据存储器中获得数据,写入 rt 寄存器

那么现在我们如何从 Instr 中获取到 rs rt 等等内容呢?无疑是通过**分位器(splitter)**来实现的。
在这里插入图片描述

例如,我们通过读取 Instr 的 25 - 21 位,即可获得 rs 寄存器的地址(也就是 rs 寄存器是 32 个寄存器的哪一个)。那么借助于我们在 P0 完成的 GRF 寄存器堆,我们即可从 RD1 处获取到 rs 寄存器的内容。

接下来我们需要把这个内容和从Instr读取到的16位偏移量进行相加。无疑首先需要进行 16 位到 32 位的扩展,随后我们通过 ALU 元器件把他们加起来。同样的, ALU 的具体构造我们后续进行分析。
在这里插入图片描述

这样, ALUResult 就是我们需要的最后地址了。把这个地址输入进数据存储器 DM,即可从 RD 处获得我们需要写入的数据。你是否还记得我们的 GRF 不仅支持读取功能,同时也支持写入功能。把这个数据输入到 GRF 的 WD 中,同时把 rt 寄存器地址 输入到 GRF 的 A3 中,即可实现最终的功能。
在这里插入图片描述

1.2 分块设计

对整个流程有了大致的了解,接下来我们尝试构造各个元器件。

1. 取指令单元 IFU

回顾一下, IFU 的主要功能就是通过读入的 PC 值获取到对应的指令内容。这里有一个问题,我们应该什么时候对读入的 PC 值进行处理呢? 当然是时钟上升沿的时候,因此我们需要一个寄存器帮助我们在上升沿将最新的 PC 值给 IFU 中的指令存储器 ROM ,从而将对应指令内容输出。

信号名方向描述
NPCI输入的由NPC模块计算得来的NPC
PCO经过寄存器后的PC,用于返回NPC模块继续计算下一个PC
InstrO由PC得出的对应指令,从ROM中取出

在这里插入图片描述

2.位扩展单元 EXT

考虑到有的指令会进行符号扩展,有的指令会进行0扩展,我们设计一个可以通过输入信号 EXTop 来进行不同扩展的位扩展单元,增强我们整个 CPU 的可扩展性,也为课上测试打好基础。

信号名方向描述
immI输入Instr读取的初始十六位立即数
EXTopI输入选择扩展方式的信号
imm32O输出0扩展或者sign扩展的32立即数

内部构造十分简单,只需要一个 MUX 即可:

在这里插入图片描述

3.算术单元 ALU

我们的 CPU 无疑会进行诸多加减乘除等等运算,因此把它们封装到 ALU 中,通过读入信号的不同来进行不同的算术操作。

信号名方向描述
src1I需要进行操作的32位数据1
src2I需要进行操作的32位数据2
ALUopIALU计算方式选择信号
ALUresultO计算结果

核心思路也很简单,通过 MUX 进行不同结果的选择即可。这里需要注意, ALUop最好设置成 3 位或以上,以保证我们在课上测试时能够增加足够多的计算方式。

4.控制器 Controller

刚刚我们设计的这些元器件,他们的输入信号例如 EXTop、ALUop等等都随指令的不同而不同。那么这些控制信号怎么获取呢?就是通过 Controller,这部分指导书已经有了详细的介绍,不再赘述。各指令对应信号如下:

指令RegDstALUsrcMemtoRegRegWriteMemWritebeq?EXTopALUcontroller
add11000
sub11001
ori11010
lui11010
lw1111000
sw111000
beq11

其中有很多信号我们没有提到。例如 RegDst 用于判断是把 Instr 的 26-31 位还是 16-20 位作为要写入的寄存器地址; RegWrite 用于判断是否需要写入寄存器等。

在这里插入图片描述

5.地址计算单元 NPC

每处理完一条指令后我们都需要对 PC 值进行更新,可能是 PC+ 4,也可能是跳转到新的 PC。因此我们单独设计一个模块进行封装,来进行 NPC 值的获取。

信号名方向描述
PCI从IFU模块传来的PC,用于计算下一个PC
immI16位立即数,用于跳转指令的PC计算
beq?I用于判断是否需要执行beq跳转的信号
NPCO组合逻辑电路计算得出的NPC地址

1.3 综合分析

接下来便需要把这些模块进行综合,最终获得我们整个的单周期 CPU 电路。

在这里插入图片描述

有很多细节只有在自己进行亲手构造时才会注意到,带着这些理解去构造属于自己的第一个 CPU 吧。

二、课上测试

在笔者自己进行课程学习时,发现很多博客都少有对课上测试的介绍和总结。然而我们每次 Project 的最最最大的目标其实都是为了通过课上测试。因此我们能否为课上测试给我们的 CPU 进行完善,从而更好地考试呢?那些题目是不是都有一定的套路呢?接下来将把个人在课上测试中的总结和经验教训分享给大家。

2.1 题型总结

其实总结下来, P3 - P6 的测试内容都是在原有 CPU 基础上进行新的指令的添加,这些指令其实可以大致地进行分类,每一类指令都有类似的重要环节进行处理。熟悉他们非常有助于我们在考试高度紧张的氛围中完成实验。

1.计算型

这一类题型是最为简单的一种。类似于 add sub指令,我们需要设计一种新的运算方式,可能是将 rt 和 rs 进行运算,也可能是 rs 和 imm 进行运算。不管怎样,笔者结合自己的经验,认为比较好的处理方式是:在考试前事先把那些控制信号写在草稿纸上,一个一个判断他们是否需要点亮,以及判断需要新增哪些信号。同时在判断的过程中,其实自己也就知道了电路中需要怎样进行改造

举个例子,现在我们需要新增一种指令 xor实现 rs 异或 rt 并写入 rd。我们列出所有的信号并进行分析:

(注意:由于每个同学的构造都不一样,因此需要设置出你自己的添加方案。)

信号名称功能处理方式
RegDst判断要写入的寄存器是 rs 还是 rd置为1,写入 rd
ALUsrc判断相加的是 RD2 还是 imm置为0(在controller中,置为0其实就是无操作)
MemtoReg判断是 ALUresult 还是 DM读取的数据作为 WD写入数据置为0
RegWrite判断是否有写入寄存器操作置为1
MemWrite判断是否有写入数据存储器操作置为0
beq?beq专属信号置为0
EXTopimm扩展信号置为0
ALUcontroller选择计算方式新增信号,同时在ALU中新增计算方式
other判断是否需要有新增信号

填完了表,我们也就知道需要完成哪些任务了:

  1. controller 中新增指令 xor,并增加对应的控制信号,即RegDst RegWrite ALUcontroller
  2. ALU模块中新增计算方式 xor。

拥有如此清晰的思路,这对我们实际操作和构造样例检测都会有很大的帮助。

2.跳转型

和上面类似,我们想好都有些哪些信号需要点亮。同时跳转类一般会新增一种 PC 的计算方式,因此我们可能需要新增信号,信号的命名我采取了很朴素的方式,就是 信号名 + ?。在课上测试十分紧张的时刻,这种直观的方式可能会带来更好的效果。

随后对 NPC 模块进行改造即可。构造样例时可以考虑跳转成功、跳转失败、向上跳转、向下跳转等多种情况。

3.访存型

这一类其实和计算型差不多,只不过对 DM 有了更多的操作。构造样例时可以先用 sw指令进行写入,再进行对应的测试。

2.2 其他

其实很多时候,课上测试的不通过都是因为心态原因、没有构造好样例等主观因素导致的。从 P3 开始,每一次考试都决定了你接下来一周的心情和工作内容。但无需过于紧张,只要课下任务认认真真地完成了,课上测试一般都不会有什么问题。

以上就是 P3 的全部内容了。笔者本人当年的 P3课上测试可谓十分艰辛和难忘,现在回头看也已然是云淡风轻了。
第一次 CPU 的亲手构造到此结束,祝你计组顺利!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值