Giter Club home page Giter Club logo

buaa-co-2019's Introduction

BUAA 6系 计算机组成课程设计 代码

笔者作为一只勉强通过P7、没能顺利通关的蒟蒻,不保证下面内容的完全正确性,以下所有文字仅供参考,具体细节还请同学间交流/讨论区/助教。

Pre-P2

这几个Project主要是准备工作。Pre一定要跟上预习节奏学习,这会提供一个良好的基础方便后面的P顺利进行。同时将代码思维从大一的软件思维转换为硬件思维,适应verilog的编程特点。

logisim比较容易上手,但最好在做完基础的练习后经常练习一下其他自带工具的使用,笔者P3挂过一次,其中一个原因就是因为对logisim元件过于陌生;

verilog更加容易上手一些,但掌握起来比较麻烦,其中最难的一点就是要明白你是在连电线,而不是在写按顺序执行的程序;

mips指令集,也就是汇编程序,入门可能会花费不少的时间去理解,搞明白指令是在干啥之后多写一些程序练习就可以了,可能这部分与C语言的熟练程度是挂钩的。

P0、P1要重点掌握Moore型和Mealy型状态机的搭法,同步复位和异步复位的区别要重点区分开。

P2要掌握递归的方法,锻炼翻译C语言的能力。

P3

logisim搭单周期CPU。了解CPU的各种模块后,搭起来虽说非常麻烦,但也有章可循。设计一个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里读取的数据。这样做的合理性在于,一是暂停保证了在使用寄存器值的时候,必然已经算出结果;二是能通过这个优先级找到最近的修改该寄存器的操作,而不会错误地转发别的数值,比如:

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和数码管硬件实现起来也不是太麻烦,串口通信我们都没太弄懂如何处理才能够不缺失输入,不过无所谓啦。一定要注意自己设计的是硬件,只是实现一些简单的接口,其余的事情留给软件操作就好了。

P8只做出个半成品就跑路复习物理去了,就不放上来丢人了。

TIPS

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

题外话

总而言之,计组课设是一门很有趣的课程,其中的乐趣就是自己探索、测试,从零开始搭建一个正常运行的MIPS CPU。通过这门课程的磨练,或许困难都不是那么困难了,GPA也不是那么重要了呢(划掉

祝各位顺利通关。

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.