北航co计算机组成P3设计文档

Post Cover

写在前面:
本人在 P3 时尚未认识到看学长学姐博客的重要性,
于是整个人根据课上老师讲解和指导书要求
乱七八糟的搭建了一个CPU,毫无美观可言
接口设计的超级不好,在这里就不展示了。
P4 的时候看了一些博客设计了一个比较美观的CPU,
(P4 只是把logisim上的CPU用verilog实现)
所以接口设计可以参考 P4 ,指路链接在下面。

P3 CPU设计文档及思考题

设计草稿

1.指令详解

  • ADD:add RD, RS, RT
    编码:000000 sssss ttttt ddddd 00000 100000
    描述:GPR[rd] = GPR[rs] + GPR[rt]
  • SUB:sub RD, RS, RT
    编码:000000 sssss ttttt ddddd 00000 100010
    描述:GPR[rd] = GPR[rs] - GPR[rt]
  • ORI:ori RT, RS, IMM
    编码:001101 sssss ttttt iiiii iiiii iiiiii
    描述:GPR[rt] = GPR[rs] | zero_extend(IMM)
  • LW:lw RT, OFFSET(RS)
    编码:100011 sssss ttttt iiiii iiiii iiiiii
    描述:GPR[rt] = MEM[GPR[rs] + sign_ext(OFFSET)]
  • SW:sw RT, OFFSET(RS)
    编码:101011 sssss ttttt iiiii iiiii iiiiii
    描述:MEM[GPR[rs] + sign_ext(OFFSET)] = GPR[rt]
  • BEQ:beq RS, RT, LABEL
    编码:000100 sssss ttttt iiiii iiiii iiiiii
    描述:if GPR[rs] == GPR[rt], PC = PC + 4 + sign_ext(LABEL); else PC = PC + 4;
  • lui:lui RT, IMM
    编码:001111 00000 ttttt iiiii iiiii iiiiii
    描述:GPR[rt] = sign_ext(IMM) << 16;
  • nop:nop
    编码:000000 00000 00000 00000 00000 000000
    描述:GPR[0] = GPR[0]

2.数据通路设计

操作 Adder-A1 Adder-A2 shifter1 PC IM splitter GRF-RA1 GRF-RA2 GRF-WA GRT-WD ALU-A1 ALU-A2 DM-RA DM-WA DM-WD EXT shifter2
add PC 4 - adder pc im splitter[s] splitter[t] splitter[d] ALU GRF-RD1 GRF-RD2 - - - - -
sub PC 4 - adder pc im splitter[s] splitter[t] splitter[d] ALU GRF-RD1 GRF-RD2 - - - - -
ori PC 4 - adder pc im splitter[s] - splitter[t] ALU GRF-RD1 EXT - - - splitter[i] -
lw PC 4 - adder pc im splitter[s] - splitter[t] DM-RD GRF-RD1 EXT ALU - - splitter[i] -
sw PC 4 - adder pc im splitter[s] splitter[t] - - GRF-RD1 EXT - ALU GRF-RD2 splitter[i] -
beq PC 4/4+shifter1 EXT<<2 adder pc im splitter[s] splitter[t] - - GRF-RD1 GRF-RD2 - - - splitter[i] -
lui PC 4 - adder pc im - splitter[t] shifter2 - - - - - - splitter[i] EXT<<16

//IFU由Adder、shifter、PC、IM构成

3.控制信号

总控制

数值 RegWA_control RegWD_control RegWrite ALU_Inputcontrol_2 MemWrite EXTcontrol
0 splitter[t] ALU unable GRF-RD2 unable zero_extend
1 splitter[d] DM enable EXT enable sign_extend
2(10) - shifter2 - - - -

ALU控制

000 : +
001 : -
010 : |

指令 ALU操作 ALUcontrol
add + 000
sub - 001
ori or 010
lw + 000
sw + 000
beq == -
lui - -

课上:

本人没有记录课上题目,不过P3会有推荐题,在时间宽裕的情况下可以做。

我知道一些同学会喜欢增加很多指导书没有涉及的指令,有利有弊,利在可以对添加指令更加熟练。弊在你的CPU会越来越复杂,而且课上添加的指令肯定是mips指令集中没有出现过的,如果课上添加指令的编码op恰好和自行添加的指令op一致,这将给课上造成很大的麻烦。

课上可以有取巧的方法:(歪门邪道了

  1. 直接新建模块对新增指令进行运算,模块的input为所需运算的值,output是结果
  2. 将新建模块连接入mips顶层中,连接输入输出
  3. 使用多路选择器输出结果,即如果op和新增指令一样(判断可以加在control中),结果即用新增模块的结果,其他的按照原本课下不变
思考题点击展开,不保证正确性,建议自己思考

思考题

1.上面我们介绍了通过 FSM 理解单周期 CPU 的基本方法。请大家指出单周期 CPU 所用到的模块中,哪些发挥状态存储功能,哪些发挥状态转移功能。

状态存储功能:PC、GRF、DM
状态转移功能:ALU、EXT、Controller

2.现在我们的模块中 IM 使用 ROM, DM 使用 RAM, GRF 使用 Register,这种做法合理吗? 请给出分析,若有改进意见也请一并给出

合理。
IM使用ROM是合理的,因为指令在运行时通常是不改变的,ROM是只读的,符合指令存储的需求。
DM使用RAM是合理的,因为数据需要读写,RAM可以读写,符合数据存储的需求。
GRF使用Register是合理的,因为寄存器堆需要快速读写,且每个时钟周期都要更新,使用寄存器可以实现。

3.在上述提示的模块之外,你是否在实际实现时设计了其他的模块?如果是的话,请给出介绍和设计的思路。

增加了shifter以实现lui所需要的位移(但可能可以加入在ALU中)

4.事实上,实现 nop 空指令,我们并不需要将它加入控制信号真值表,为什么?

nop指令在MIPS中实际上是 sll $0, $0, 0。
其高6位为000000会在控制信号中被识别为R类指令,其任何操作都是对0号寄存器操作,$0寄存器无论如何都为0,相当于没有进行任何操作。所以不需要在控制信号真值表中对nop进行单独讨论。

5.阅读 Pre 的 “MIPS 指令集及汇编语言” 一节中给出的测试样例,评价其强度(可从各个指令的覆盖情况,单一指令各种行为的覆盖情况等方面分析),并指出具体的不足之处。

ori 指令:

覆盖行为:从0号寄存器加载立即数。从非零寄存器进行或操作。立即数为正数。
不足之处:未测试立即数为边界值(如 0x0000 或 0xffff)。未测试源寄存器为其他非零值时的复杂逻辑组合。

lui 指令

覆盖行为:加载正立即数。加载负立即数。
不足之处:未测试立即数为 0x0000 的情况。未测试与后续 ori 组合形成完整32位值的所有情况(如正负组合)。

add 指令

覆盖行为:正数加正数。正数加负数。负数加负数。
不足之处:未测试加法溢出情况。未测试零加零或零加其他数的情况。未测试结果为零的情况。

sw和lw指令

覆盖行为:存储和加载到内存的不同偏移地址。存储后重新加载并再次存储。
不足之处:未测试内存访问的地址边界情况。

beq 指令

覆盖行为:分支不发生。分支发生。

本作品由 一一 于 2026-02-13 10:00:00 发布
作品地址:北航co计算机组成P3设计文档
除特别声明外,本站作品均采用 CC BY-NC-SA 4.0 许可协议,转载请注明来自 anAilurus' Blog
Logo
上一篇北航co计算机组成P4设计文档下一篇Hello World