OSOC学习记录(1):F阶段总结

成元 2026-04-22 { 教程, 笔记, 日常 }

前言

我是在3月20号接触的OSOC项目,断断续续做了一周,也算是完成 F 阶段了,这里打算每完成一个阶段就记录一篇文章。

值得注意的是可以看到这篇文章的分类除了教程笔记还有日常。这是因为我并不打算像前面的几个系列一样,出一个类似手册或者说明性质的文章,告知读者如何快速的完成这个项目,或者每个题目的答案以及完整的解题步骤(因为自我感觉个人水平不足以教会别人,此外如果你阅读过F1部分,就知道这不是项目主办方提倡的做法)。更多的是借助这个项目说明一下自己对某些技术或者行业的看法,以及一些感想,可以说教程笔记还有日常这三者都沾一点边。

说回正题,这篇文章(和以后的文章)主要基于学习讲义,说一下我的看法。

F1

F1 部分涉及如何科学地提问。这一部分我其实在大学,甚至更早之前的生活中就深有体会:很多人其实并不会提问。遇到问题时,他们不是先搜索、先尝试自己解决,而是直接去问别人。

我曾经从零开始手把手教一个人解压压缩包:从怎么下载解压软件开始,到怎么右键文件并解压。教完之后,我就再也不想理会这种完全不思考的人了。

F2、F3

F2、F3 部分推荐了一个软件 Logisim,并讲解了一些数电基础,然后一步步引导我们使用 Logisim 搭建基础的电子元件。

学完后感觉 Logisim 这个软件不错。一是开源免费,二是元件基本上该有的都有,而且字如其名,不是一些乱七八糟的型号。相比我学校要求使用的 MultisimProteus,不知道好到哪里去了。

此外,这部分也帮我复习了数电,加深了我对一些门电路、基本组合逻辑电路以及时序逻辑电路的理解。

F4

F4 我感觉特别有趣。看完之后,我直接对汇编和机器指令祛魅了。之前总觉得这些指令特别高大上,既原始又难懂,不知道为什么要这么写。看完 F4 并跟着做任务后,我理解了程序、ISA 和 CPU 之间的关系,以及相应的状态机模型。现在只感觉它们原始,但不再觉得难懂了。和之前用 C 语言给芯片写驱动一样,归根结底也不过是查手册罢了。

还有就是加深了我对编译的理解。果然高级语言的代码就应该只“写给人看”,越容易理解越好。反正 CPU 也看不懂 C 语言之类的高级语言,它只认机器指令。很多无所谓的优化,大多数时候除了让别人看不懂以外,感觉没有任何意义。最终编译器会优化并处理成机器指令,让 CPU 看懂就行了。

F5

F5 部分承接 F4 的内容,跟着完成了支持 sISA 的 sCPU,同时也体验到了“古法编程”(手搓机器指令)的痛苦,体会到了汇编语言以及高级语言的伟大之处。没有这些编程语言和编译器,给现在支持上千条指令的商业 CPU 编写程序,感觉真要“皆尧舜”才能完成了。

另外,F5 的最后给出了一个不算任务的问答:“能设计一条让 10 个数相加的指令吗?”我一开始觉得这不是挺好的吗?像 F4 章节给出的汇编指令要 8 行,如果实现了这个指令的话,一行就够了。后来我想了一下,这就和问“在 C 语言里面设计一个能让 10 个数相加的函数有用吗?”一样。如果要实现,我肯定会实现一个“n 个数相加的函数”,而不是固定 10个。所以我改变了对这个问题的看法。我觉得没有必要,ISA 中应该尽量只留通用的指令,而 CPU 中也应该尽可能舍弃不必要的功能,以降低功耗,同时给更重要的功能留出空间。

F6

F6 部分在 F5 的基础上,基于 RV32I 与 RV32E 设计了一个 CPU,即 minirv。在实现 minirv 的过程中,我遇到了很多困难,也体会到了 Logisim 这个软件的局限性,不过最后还是成功显示 Logo 了!

最后讲义提到了 HDL 语言。这个好像是电子类专业的课程,我的专业不是完全的电子类,所以没怎么看。不过我问了下学弟,他说比较像 C 语言,那应该也不难,应该很快就能学会了。

总结

通过 F1 的学习,我感觉到了自己对于计算机底层知识的热爱,很多东西只是看起来难,但是有机会上手之后其实也就那么一回事。最后希望自己能像 OSOC 宗旨中提到的那样,在毕业的时候获得自己设计的芯片!