计算机组成课程总结

Solved P-1 P0 P1 P2 P3 P4 P5 P6 P7 P8
P7/P8 O O O O Ø O O Ø Ø .
  • O for one pass and AK
  • Ø for passing after one failure and AK
  • ! for passed but not AK or after failing more than once
  • · for having not attempted yet

这是一篇学累了学不进去习甚至懒得打标点符号的Potassium临时起兴写的关于这学期北京航空航天大学计算机组成原理课程设计这门课的总结。

P-1

Pre测试主要是针对Logisim,Verilog,MARS三大软件的预习的检测,只要能够在前几周抽出时间去从程序设计的过程思维转换成硬件设计的电路思维,应该一般不会有什么大问题。

虽说Pre测试不计入总成绩,但都进行一遍预习并尽力争取通过甚至AK是进行后面几个Project的基础。

P0

P0测试是第一场计分的测试,但其实也没什么难度。

P1

难度主要在Mealy和Moore型状态机的区分上,可以依照课本上的模型理解。

P2

只要会写C代码,转换成mips指令只需要熟能生巧,多练习一些即可。

P3

真正硬核的东西是从这里开始的。设计一个CPU从多部分组成的连线开始。教程部分讲述的很明确了,但一定要自己练习几个。笔者在P3因为一个clo指令(可以参看英文指令集)里的特殊情况(0)没想到特判,一直错一个点,另一个题光把cpu内改了,忘记把输出地址和数据修改掉,从而一题挂了P3。

P4

注意硬件设计语言的特性,把连线仔仔细细地连到verilog上就可以通过本Project。

P5

这是所有Project里最硬核的一个。教程写的又多又杂就不说了,还没啥用。

笔者建议同学从不考虑冒险搭起,先把流水线的框架(FDEMW级)搭起来,把每一级里的东西设计好,记得CMP模块要放在D级。差不多搭完之后,不要先想着加转发暂停,而是完备地测试这个CPU能否正常运行10指令,当然在造测试程序的时候别忘了每条指令后面加4个nop。

测试完备之后,再开始想转发暂停该如何加入。注意到我们主要想做的是尽可能多的转发,也就是暂停的目的是把所有无论如何不能转发的两个指令间插入nop,所以先判断一下啥时候会需要暂停。这时候用教程上的$T_{use}$、$T_{new}$的概念,画出表格,就可以判断出来哪些时候会强制要求暂停。暂停其实是在IF/ID级阻塞,ID/EX级产生空泡,这样需求者始终在D级,只需要分类讨论供给者的位置和寄存器号即可,减少了许多不必要的代码量。

转发就稍微麻烦一些,笔者建议同学们使用比较简便的“标记转发法”,即是在每个已经算出结果(存入寄存器的值)的流水级设置flag=1,这时候允许在当前流水级对应寄存器的值被转发到前面流水级。每到需要寄存器值的前面,就要从前往后依次判断哪一级流水线的该寄存器值可以被转发,如果都不能那就使用从GRF里读取的数据。这样做的合理性在于,一是暂停保证了在使用寄存器值的时候,必然已经算出结果;二是能通过这个优先级找到最近的修改该寄存器的操作,而不会错误地转发别的数值,比如:

1
2
3
4
li $1,1
lw $1,-1($1)
addu $1,$1,$1
subu $11,$1,$0

在subu转发的时候,会依次比较addu(是否已经flag=1,寄存器编号是否一样),lw(是否已经flag=1,寄存器编号是否一样)。这样保证了有多个转发点的时候选取最新的数据。

对于转发暂停,建议使用指令分类,这对P6大有裨益。

P6

指令分类完了之后就是工具人的操作了,唯一的难点在于乘除块。

乘除块其实只要在暂停里加一个“如果当前乘除块在操作(busy|start),而且D级指令是与乘除有关的操作,那么暂停”,就可以了。乘除块内部相当于一个计数器,也就是小型的FSM。

DM的修改也没什么太大的难度,但建议充分测试各种对DM的操作,因为容易出错。

P7

异常中断,主要加的是CP0,Bridge两个东西。

建议先连接CP0,处理异常。异常需要在各级流水线设置ExcCode,注意判断各种ExcCode的优先级,做好各种异常的测试,一定要仔细阅读哪种异常的ExcCode是多少的要求,否则很容易翻车。

然后处理中断,其实中断只要放在异常优先级前面,然后加点东西即可。

Bridge就是一个把各个设备连在一起的模块,没有什么设计难度。TimeCounter的代码都已经给出了,研究一下发现是个FSM,只要在外面连连线连上就可。

最主要的是一定要做好充足的测试,mfc0 mtc0 eret尤其是这三个新增指令。然后处理address和EPC、BD位的时候也要注意。笔者P7因为一个神奇的bug错了一个点,从而失去了P8的机会。

这个神奇的bug估计没几个同学能遇到,就不表了。

P8

P8没有实操,看着npy做,感觉要做的东西其实挺多而且易错,并不完全是奖励关的性质,一定要在确保自己物理等科目问题不太大的前提下斟酌损益。可综合和IP Core装起来比较容易,LED和数码管硬件实现起来也不是太麻烦,串口通信我们都没太弄懂如何处理才能够不缺失输入,不过无所谓啦。一定要注意自己设计的是硬件,只是实现一些简单的接口,其余的事情留给软件操作就好了。

完整的代码应该会放到github上,仅供参考,其中也有很多自动测试工具以及测试数据,用法也不再多说,其实还是建议同学们自己动手做自动测试、做完备测试,这样理解起来会更深刻,在造数据的时候也会经常灵光一现:“诶!我这里可能会出bug,去修修”,从而更加顺利的通过本课程。