可能是,可能不是,全面准备吧。
这是我 24 秋学习计组课程的心得总结,希望对你有所帮助。我主要从计分规则、资源获取、学习过程三个方面描述。
1. 计分规则#
计组分为理论、实验两个部分。我们这一届,理论成绩占比 60%,实验成绩占比 40%。实验部分就是令人闻风丧胆的计组上机,理论部分包括期末考试和平时作业两部分,不同老师给分不同。
计组的老师都非常棒,因此在选课时没有需要避雷的。
学习过程中,为了效益最大化:
- 平时可以听 gxp 老师的课,他差不多会按照上机进度去讲对应的实验部分,而其他老师不会。这点很重要,特别是在 p5 流水线设计部分,有他的引导,学起来会轻松很多。
- 期末复习建议听 xlm 老师的课,前几节课他的研究生会作为助教来讲复习题,最后一节课 xlm 老师会来讲透题级别的总复习,明确告诉你考什么,重点复习什么,字字千金。
至于实验(上机)部分,需要注意:
- pre、p0~p2 打好基础,尽量完成课上课下内容,通过即满分。
- p3~p7 课上尽力过题,成绩是按照课上过题数量给分,而不是按照挂的次数扣分的。 课上估计有三次 gap(不通过)的机会。
2. 资源获取#
学习过程中需要靠自己去寻找资源来辅助完成实验部分。
最主要参考就是往届学长学姐的代码和说明文档,但请注意不要构成抄袭。
2.1 GitHub#
GitHub 上有许多往届同学的课设代码,简单搜索 BUAA CO
即可找到一大批。
完成课程后,也欢迎把自己的代码上传到代码仓库,造福以后的学弟学妹们。但请注意要删除自己的个人信息!!!
tangsongxiaoba/awesome-buaa-co 是我创建的一个 Awesome 项目,收录了 BUAA CO 的学习资源,包括往届代码、博客教程等,欢迎贡献!
2.2 往届博客#
在写代码的时候一般是这样一个流程:
往届博客是重要资源,是学长学姐对设计文档的进一步解释与完善。其中的解惑与提示往往可以给你带来很大的启发。
同时,往届博客还包含同学对上机的经验总结,每周一晚上上机之前看看往届博客对上机题的描述,会觉得有准备很多。
但同时请注意:不同时期的课程组的要求是不一样的,因此往届博客不一定正确,需要仔细对照计组网站给出的教程予以辨别。比如:
- 在我们这一届,一开始要求实现的指令集中包含有符号加法的
add
,但是一开始要求其表现与无符号加法的addu
一样。而往届要求实现的指令集包含的却是addu
,两者在 MIPS-C 中的操作码是完全不一样的。 - 我们的 p7 与往届相比,增加的外设是不一样的,因此也不能完全采用往届同学的代码。
我在学习过程中,主要参考的往届博客有两个:
- FlyingLandlord’s Blog:神中神,p7 博客写的比课程组的教程好多了(
- roife 的魔法科见闻:讲的也非常清晰到位。
这两个博客同时都总结了大量上机题,非常珍贵。
我们这一届也涌现出了许多精彩博客,在此先推荐两个我知悉的:
- Trash Bin for Chi:室友的博客,同时包含了他写的数据生成相关的经历。他写的数据生成器&对拍器非常强大,是我们寝室的保命依仗(
- Lazyfish & chilly_river:首通全满分的大佬博客,每周写完计组甚至还能在周末抽空飞去各地打 ACM。他的 p7 是我写 p7 时的主要参考,虽然感觉写的不够清晰,但都是极为正确的(在我们这一届)。
2.3 其他资源#
- 23 级讨论区精华帖整理(正在进行中)
- 学院云盘链接:指名为“计算机学院 - 学业支持手册”的北航云盘链接,关注水群信息;其中包含专业各年级课程资料以及其他珍贵资料,非常宝贵。
- HDLBits:练习 Verilog 的好网站,可以在这里提高 Verilog 的熟练度。
3. 学习过程#
这些过程也可以多多参考往届博客以及 23 级讨论区精华帖整理。
3.1 pre、p0~p2 部分#
主要学习 Logisim、Xilinx ISE、MARS 等工具的基本使用,Verilog、MIPS-ASM 的基本语法,有限状态机、硬件描述语言的基本思想。课程组网站的教程非常丰富,照着完成即可。其中我觉得重点要注意的有:
保持对 Verilog 语言的熟悉,因为 p4~p7 主要是编写 Verilog 代码。Verilog 与一般概念的编程语言不同在于执行方式:
- Verilog 描述并行执行的硬件电路,其信号和模块是并行运作的;
- 一般编程语言是顺序执行的。
也就是说,Verilog 的一些语句的先后顺序并不是它们的执行顺序:它们是并行执行的。 比如:
always @ (posedge clk) begin count <= count + 1; ans <= count; end
这
begin-end
语句块中的两句是同时执行的,也就是说ans
被更新为count
的原有值而不是自增后的值。区分 Moore 型状态机和 Mealy 型状态机:
- Moore 型状态机的输出变化滞后于状态变化,因为其输出只和状态有关。
- Mealy 型状态机的输出可以立即响应输入变化,因为其输出与状态和输入都有关系。
这本质上就是第一点提到的并行性(时序性)。有限状态机的输出是由组合逻辑决定的,因此是实时变化的;而状态是由时序逻辑决定的,所以是按时钟周期逐步更新的。
对于 Moore 型状态机来说,当在本周期状态即将发生变化时,状态的实际更新会在下一个时钟周期完成。输出逻辑在下一个时钟周期才会检测到状态的变化,并根据组合逻辑更新输出值。
对于 Mealy 型状态机来说,即使在本周期状态还未完成更新,输出也可以在本周期根据输入的变化立即改变。而状态的更新依然会在下一个时钟周期完成。
其他部分乏善可陈,基本工具多用用,MIPS、Verilog 代码多写写就熟练了。
3.2 p3~p7 部分#
p3 是 Logisim 单周期 CPU 的搭建。
万事开头难,p3 也许是前期比较麻烦的一次任务,需要用图形化的 Logisim 把 CPU 搭建起来。建议善用 Tunnel 部件。
在开始搭 CPU 之前建议先把数据通路画一遍,理清思路。整个 CPU 的数据通路大致如下:
以上并未包含控制器单元到各元件的连线。Mermaid 流程图没法确定位置,看上去不够直观,建议在过程中使用 draw.io 绘制 CPU 数据通路图。
Logisim 的使用过程本身也就是一个画图的过程,所以其实也可以不绘制这个草稿。不过最终在 Logisim 顶层模块中的 CPU 数据通路应该和以上草稿的层次是一样的。也就是说,各个模块的内部连线应在子模块中完成,不要放到顶层模块中,以免增加模块复杂度导致调试难度的提升。
在 p3 可以借鉴一部分往届的代码,但不同人的 Logisim 设计很难一样,所以借鉴意义并不是很大;此外不同时期课程要求不同,也会导致与往届同学的 Logisim CPU 对拍失效,所以谨慎参考。
p4 是 Verilog 单周期 CPU 的搭建。
有了 p3 的基础,p4 只是将图形转化为代码,本质上没有区别。只是要多注意 Verilog 端口接线正确。Verilog 代码复杂冗长,建议配置好编程环境以进行代码检查与风格规范,在编写过程中也要时刻保持清醒,注意接线正确。
从 p4 开始,往届同学的代码就比较有借鉴价值了,阅读往届代码往往可以加快课下任务的完成。但请确保你一定完全理解了代码及其原理(否则课上就难了),以及再次强调:不要抄袭!
p5 是 Verilog 流水线 CPU 的搭建。
个人感觉 p5 是压力最大的一次任务,流水线概念理解非常困难,但是搭建时间同样只有一周,往往到课上还不能保证课下设计完全正确,而课上还很难。按顺序要做的有三件事情:
- 增加五级流水线寄存器。
- 增加转发、暂停数据通路。
- 增加暂停逻辑。
- 增加转发逻辑。
这里比较难的就是数据通路和暂停转发逻辑。数据通路的问题是:究竟哪些部件要向前转发到哪些部件? 暂停转发逻辑的问题则是对 AT 法的正确认识。这里个人感觉最麻烦的还是数据通路。建议听 gxp 老师的课以加强理解。
p6 是在 p5 的基础上增加乘除槽、更多指令以及改造 DM。难度也不大,照着教程走就行。
p7 是在 p6 的基础上进一步完善整个 MIPS 微系统,四舍五入就是一个 SoC。 p7 是继 p5 之后更艰巨的一次任务,概念理解更加困难,代码量也更大。而且,其中对于外设的要求每年都有所变化,往届代码的参考价值降低了(但大部分还是可以参考的)。p7 任务主要分为两部分:
- 支持异常与中断
- 添加 Bridge 与外设,形成 MIPS 微系统
最终形成的 Verilog 代码结构如下。