Skip to main content
  1. 归档/

BUAA CO 学习心得

·452 words·3 mins·
心得 学习 BUAA 计算机组成
Table of Contents

可能是,可能不是,全面准备吧。


这是我 24 秋学习计组课程的心得总结,希望对你有所帮助。我主要从计分规则资源获取学习过程三个方面描述。

1. 计分规则
#

计组分为理论实验两个部分。我们这一届,理论成绩占比 60%,实验成绩占比 40%。实验部分就是令人闻风丧胆的计组上机,理论部分包括期末考试和平时作业两部分,不同老师给分不同。

计组的老师都非常棒,因此在选课时没有需要避雷的。

学习过程中,为了效益最大化:

  1. 平时可以听 gxp 老师的课,他差不多会按照上机进度去讲对应的实验部分,而其他老师不会。这点很重要,特别是在 p5 流水线设计部分,有他的引导,学起来会轻松很多。
  2. 期末复习建议听 xlm 老师的课,前几节课他的研究生会作为助教来讲复习题,最后一节课 xlm 老师会来讲透题级别的总复习,明确告诉你考什么,重点复习什么,字字千金

至于实验(上机)部分,需要注意:

  1. pre、p0~p2 打好基础,尽量完成课上课下内容,通过即满分。
  2. p3~p7 课上尽力过题,成绩是按照课上过题数量给分,而不是按照挂的次数扣分的。 课上估计有三次 gap(不通过)的机会。

2. 资源获取
#

学习过程中需要靠自己去寻找资源来辅助完成实验部分。

最主要参考就是往届学长学姐的代码和说明文档,但请注意不要构成抄袭

健康计组忠告第一条: 抵制抄袭代码,拒绝剽窃行为。

2.1 GitHub
#

GitHub 上有许多往届同学的课设代码,简单搜索 BUAA CO 即可找到一大批。

完成课程后,也欢迎把自己的代码上传到代码仓库,造福以后的学弟学妹们。但请注意要删除自己的个人信息!!!

使用 git 在最终 commit 之前一定要检查一遍自己提交的版本有没有泄露个人信息,包括但不限于你的账号密码

tangsongxiaoba/awesome-buaa-co 是我创建的一个 Awesome 项目,收录了 BUAA CO 的学习资源,包括往届代码、博客教程等,欢迎贡献!

2.2 往届博客
#

在写代码的时候一般是这样一个流程:

flowchart LR; subgraph Coding direction LR A[阅读要求] --> B[构思架构] B --> C[参考博客] C -->|还有疑惑| D[参考代码] D -->|验证设计| B D --> E[完成编写] end

往届博客是重要资源,是学长学姐对设计文档的进一步解释与完善。其中的解惑与提示往往可以给你带来很大的启发。

同时,往届博客还包含同学对上机的经验总结,每周一晚上上机之前看看往届博客对上机题的描述,会觉得有准备很多。

但同时请注意:不同时期的课程组的要求是不一样的,因此往届博客不一定正确,需要仔细对照计组网站给出的教程予以辨别。比如:

  • 在我们这一届,一开始要求实现的指令集中包含有符号加法的 add,但是一开始要求其表现与无符号加法的 addu 一样。而往届要求实现的指令集包含的却是 addu,两者在 MIPS-C 中的操作码是完全不一样的。
  • 我们的 p7 与往届相比,增加的外设是不一样的,因此也不能完全采用往届同学的代码。
尽信书,不如无书。

我在学习过程中,主要参考的往届博客有两个:

这两个博客同时都总结了大量上机题,非常珍贵。

我们这一届也涌现出了许多精彩博客,在此先推荐两个我知悉的:

  • Trash Bin for Chi:室友的博客,同时包含了他写的数据生成相关的经历。他写的数据生成器&对拍器非常强大,是我们寝室的保命依仗(
  • Lazyfish & chilly_river:首通全满分的大佬博客,每周写完计组甚至还能在周末抽空飞去各地打 ACM。他的 p7 是我写 p7 时的主要参考,虽然感觉写的不够清晰,但都是极为正确的(在我们这一届)。

2.3 其他资源
#

  1. 23 级讨论区精华帖整理(正在进行中)
  2. 学院云盘链接:指名为“计算机学院 - 学业支持手册”的北航云盘链接,关注水群信息;其中包含专业各年级课程资料以及其他珍贵资料,非常宝贵。
  3. HDLBits:练习 Verilog 的好网站,可以在这里提高 Verilog 的熟练度。

3. 学习过程
#

不要把计组课下拖到周末再完成,不然你会非常痛苦!!!

这些过程也可以多多参考往届博客以及 23 级讨论区精华帖整理

3.1 pre、p0~p2 部分
#

主要学习 Logisim、Xilinx ISE、MARS 等工具的基本使用,Verilog、MIPS-ASM 的基本语法,有限状态机、硬件描述语言的基本思想。课程组网站的教程非常丰富,照着完成即可。其中我觉得重点要注意的有:

  1. 保持对 Verilog 语言的熟悉,因为 p4~p7 主要是编写 Verilog 代码。Verilog 与一般概念的编程语言不同在于执行方式:

    • Verilog 描述并行执行的硬件电路,其信号和模块是并行运作的;
    • 一般编程语言是顺序执行的。

    也就是说,Verilog 的一些语句的先后顺序并不是它们的执行顺序:它们是并行执行的。 比如:

    always @ (posedge clk) begin
        count <= count + 1;
        ans <= count;
    end
    

    begin-end 语句块中的两句是同时执行的,也就是说 ans 被更新为 count原有值而不是自增后的值

  2. 区分 Moore 型状态机和 Mealy 型状态机:

    • Moore 型状态机的输出变化滞后于状态变化,因为其输出只和状态有关。
    • Mealy 型状态机的输出可以立即响应输入变化,因为其输出与状态和输入都有关系。

    这本质上就是第一点提到的并行性(时序性)。有限状态机的输出是由组合逻辑决定的,因此是实时变化的;而状态是由时序逻辑决定的,所以是按时钟周期逐步更新的。

    对于 Moore 型状态机来说,当在本周期状态即将发生变化时,状态的实际更新会在下一个时钟周期完成。输出逻辑在下一个时钟周期才会检测到状态的变化,并根据组合逻辑更新输出值。

    对于 Mealy 型状态机来说,即使在本周期状态还未完成更新,输出也可以在本周期根据输入的变化立即改变。而状态的更新依然会在下一个时钟周期完成。

其他部分乏善可陈,基本工具多用用,MIPS、Verilog 代码多写写就熟练了。

3.2 p3~p7 部分
#

p3 是 Logisim 单周期 CPU 的搭建。

万事开头难,p3 也许是前期比较麻烦的一次任务,需要用图形化的 Logisim 把 CPU 搭建起来。建议善用 Tunnel 部件。

在开始搭 CPU 之前建议先把数据通路画一遍,理清思路。整个 CPU 的数据通路大致如下:

flowchart LR; subgraph CPU direction LR; PC -->|pc| IM; PC -->|pc| NPC; IM -->|rs| RF; IM -->|rt| RF; IM -->|rt| mux1; IM -->|rd| mux1; IM -->|imm16| EXT; IM -->|shamt| ALU; IM -->|j26| NPC; mux1 --> RF; RF -->|RD1| ALU; RF -->|RD2| mux2; RF -->|RD2| DM; EXT -->|extImm| mux2; mux2 --> ALU; EXT -->|extImm| NPC; NPC -->|NPC| PC; NPC -->|pc+4| mux3; ALU -->|res| DM; ALU -->|res| mux3; DM -->|RD| mux3; mux3 -->|WD| RF; end

以上并未包含控制器单元到各元件的连线。Mermaid 流程图没法确定位置,看上去不够直观,建议在过程中使用 draw.io 绘制 CPU 数据通路图。

Logisim 的使用过程本身也就是一个画图的过程,所以其实也可以不绘制这个草稿。不过最终在 Logisim 顶层模块中的 CPU 数据通路应该和以上草稿的层次是一样的。也就是说,各个模块的内部连线应在子模块中完成,不要放到顶层模块中,以免增加模块复杂度导致调试难度的提升。

在 p3 可以借鉴一部分往届的代码,但不同人的 Logisim 设计很难一样,所以借鉴意义并不是很大;此外不同时期课程要求不同,也会导致与往届同学的 Logisim CPU 对拍失效,所以谨慎参考

p4 是 Verilog 单周期 CPU 的搭建。

有了 p3 的基础,p4 只是将图形转化为代码,本质上没有区别。只是要多注意 Verilog 端口接线正确。Verilog 代码复杂冗长,建议配置好编程环境以进行代码检查与风格规范,在编写过程中也要时刻保持清醒,注意接线正确。

从 p4 开始,往届同学的代码就比较有借鉴价值了,阅读往届代码往往可以加快课下任务的完成。但请确保你一定完全理解了代码及其原理(否则课上就难了),以及再次强调:不要抄袭

p5 是 Verilog 流水线 CPU 的搭建。

个人感觉 p5 是压力最大的一次任务,流水线概念理解非常困难,但是搭建时间同样只有一周,往往到课上还不能保证课下设计完全正确,而课上还很难。按顺序要做的有三件事情:

  1. 增加五级流水线寄存器。
  2. 增加转发、暂停数据通路。
  3. 增加暂停逻辑。
  4. 增加转发逻辑。

这里比较难的就是数据通路和暂停转发逻辑。数据通路的问题是:究竟哪些部件要向前转发到哪些部件? 暂停转发逻辑的问题则是对 AT 法的正确认识。这里个人感觉最麻烦的还是数据通路。建议听 gxp 老师的课以加强理解。

p6 是在 p5 的基础上增加乘除槽、更多指令以及改造 DM。难度也不大,照着教程走就行。

p7 是在 p6 的基础上进一步完善整个 MIPS 微系统,四舍五入就是一个 SoC。 p7 是继 p5 之后更艰巨的一次任务,概念理解更加困难,代码量也更大。而且,其中对于外设的要求每年都有所变化,往届代码的参考价值降低了(但大部分还是可以参考的)。p7 任务主要分为两部分:

  • 支持异常与中断
  • 添加 Bridge 与外设,形成 MIPS 微系统

最终形成的 Verilog 代码结构如下。

block-beta block columns 1 block columns 3 IM int[["Interrupt"]] DM end space:2 block columns 3 Peripherals space Bridge end space block columns 3 Pipeline space CP0 end end IM -- "instr" --> Pipeline Pipeline --> IM DM -- "mem" --> Bridge Bridge --> DM Bridge --> Peripherals Peripherals --> Bridge Bridge -- "mem" --> Pipeline Pipeline --> Bridge Bridge -- "signal" --> CP0 int -- "signal" --> CP0 Pipeline -- "Exception" --> CP0 CP0 --> Pipeline
tsxb
Author
tsxb
Evaluate. Focus. Moderate.