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

写在前面:
本人在 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一致,这将给课上造成很大的麻烦。
课上可以有取巧的方法:(歪门邪道了
- 直接新建模块对新增指令进行运算,模块的input为所需运算的值,output是结果
- 将新建模块连接入mips顶层中,连接输入输出
- 使用多路选择器输出结果,即如果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 指令
覆盖行为:分支不发生。分支发生。
