在东大本科的大学四年里,我有幸作为强化班的一员参与了一系列的计算机系统能力培养的系列特色课程——数电、组成、接口、编译以及综合课程设计的学习。现在回想起来,这几门课一门一门课程向后面积累,最终累积成为我们最后的综合课程设计这样一个比较大的工程。感觉这些特色课程教会了我不少东西。

01
从数电到组成,从部件到核心模块
首先是数电实验,数电实验虽然是在学校统一大平台做的,但安排的实验很多都是和计算机专业有关的,比如寄存器、多路选择器、计数器、编码器、移位器等等,不过我们当时只是知道这些东西是计算机中常用的东西,但并没有感性认识,直到开始学习计算机组成原理。这门课程主要内容是计算机核心模块CPU的组成,而这门课程的课程设计,是使用xilinx工具和FPGA器件设计一个单周期31条指令的CPU,设计CPU是一个艰难的过程,也花了我们不少时间,但是在老师的指导下,完成了CPU的设计,并完成了仿真和下载,简单粗暴地加深了我们对CPU内部构成的理解,这是整个计算机系统的第一步,ALU和CU。但这门课也让我们深刻体会到数电的实验成果,真的是在CPU设计中可以用到,或者经过改造后可以用到。我们体会到了学以致用的快乐!

02
接口和编译让我们初步体会到从核心到机器外,从硬件到软件的联系
进入大三之后了,开设了接口课以及编译原理课程,接口顾名思义是讲授学习计算机接口,告诉我们CPU是如何使用接口与外部交互,处理外部提交的各种各样的任务。课程结尾之际依然以接口设计收尾,要求我们使用vivado设计中断处理接口、定时器、平行口等接口,这一次设计相比CPU设计,更进一步,要求我们不仅将设计的接口下板子,还要解决接口软件的衔接问题。这让我们不仅进一步感受到,在仿真到下板子之间有一道鸿沟,各种细节都需要注意,这是计算机设计需要跨越的坎,更让我们深刻感受到,硬件和软件只有密切配合,CPU和外设协调工作,才是真正的计算机系统。

而编译原理,给了我们不同于硬件的另外的东西,本来我们日常接触的高级语言,汇编语言接触的不多,更不用说机器语言了。编译原理本质上,是教导我们(编程)语言这一个系统,如何进行语言之间的转换,以及实现这些转换的方法。课程最后,我们自己设计了自己的yacc和lex,为之后的计算机课程设计打下了基础。在这门课上,我开始对在接口课的汇编语言那部分谈到的C语言翻译成汇编如何根据指令集进行优化有了更深的体会。

03
计算机系统综合课程设计——神一般的存在
大三的时候就听学长们说,大四有个神一般存在的课程设计,到了大四,我终于等到了它的出现。

计算机系统综合课程设计使用了以上几门课程的成果,从CPU到接口,从编译器到汇编器,设计一个能够运行的计算机系统以及为此计算机系统准备的IDE。在这一次课程设计中,在团队中我担任了软件部分的开发者,继承修改并使用了编译原理设计中的yacc和lex。这一个课程设计难度大,耗时长,真的不愧为本科阶段最后一个课程设计。我在编译原理课程设计的基础上,加了很多东西,除去软件设计编写中的各种基础管理与接口统一,主要是词法语法的设计、语义分析、寄存器分配(当然还有很多细小的问题),使用自己在编译原理课程设计中编写的yacc和lex生成了编译器和汇编器,并使用QT编写了编辑器,将编译器和汇编器集成到编辑器中做成了IDE。这个工程是我目前为止所做的最大的工程,代码量庞大,不过相应我们的编译汇编器(包括lex和yacc)功能较为强大。做完了之后,感觉这个人对编程语言的理解加深了。而且通过计组课程设计和编译课程设计,还让我们更加体会到,不同结构的指令集和微结构的处理器对高级语言编写的影响,甚至于我们开始理解为什么我们过去写的C++程序的时候会出现意想不到的错误,有对语义理解的不够,也有对计算机组成理解不够深入。随着从C语言到汇编语言再到机器语言的翻译过程的切实实现,对于微结构对高级语言的限制也更清晰明了了,这有反过来指导我进行高级语言程序设计的优化。

我们团队在CPU和接口方面,主要是灵活运用大二大三学到的知识,除了要整体把握五级流水(IF、ID、EXE、MEM、WE)的分布,还要把握每一级内部的分工和相互的衔接。整个实验做下来,最大的感受是工程大了就很难凭一己之力完成。人有所长,寸有所短,每个人都会有自己擅长的和相对薄弱的,而且对于一个新的领域,我们也没办法处处涉猎。这个时候就需要大家的协调合作,比如我可以针对不同问题,去修改调整原理性的电路图,但前提得有仿真测试的同学发现相应的问题,比如相对跳转的时候存在跳转位置不到位等。

而对于我们使用的软件本身,错误提醒不够明确会有一定漏洞,比如符号的半角全角、括号前的逗号要省略等很容易把我们粗心的毛病放大。通过控制台可以查到一些具体的ERROR,但还是需要查错的同学对整个工程有一定的了解和把握。往往有些整体上的错误可能归根结底只是一个小到不能再小的细节性问题,这种时候就需要我们耐心地把整个工程拆分成一个个小的细项来深入考虑。
总体来说,这一系列的几门课程,内容挺多的,难度也不低,但是完成这些课程之后收获是很多的。主要集中在对整个计算机系统的理解上,整个系统具体是如何实现,能有怎样的方法实现,硬件和软件之间的相互依存关系,让我们深刻领会根据不同微结构优化程序的方法,一门课不仅涵盖硬件软件几门主要课程内容,还把这些课程内容贯穿起来,让我们从部件设计到整机设计再到系统审计,从硬件一直涉及到软件,又反过来不断完善我们对前面课程的理解,怪不得学长们称这门课是神一般的存在。我想,之后在我们的学习、工作中,会感受到更多的从这一系列课程中收获的益处吧。

联系方式:edu@e-elements.com

E-Elements
FPGA我们是认真的!


