陈海波,王占全,梁道雷
(1.浙江理工大学理学院,浙江杭州310018;2.华东理工大学信息科学与工程学院,上海200237)
《计算机组成》课程是我国计算机科学与技术专业、自动化专业等的基础必修课程之一。该课程以《数字电路》《汇编语言》为先修课程,主要围绕计算机硬件的内部构造和工作机制开展教学,旨在让学生掌握现代计算机的内部工作原理,为计算机系统的工程设计实践打下基础,同时加深学生对软件运行原理的理解,提高学生的软件设计和调试能力。《计算机组成》课程注重实践,理论教学与实验教学的比重一般为2∶1到4∶1之间,有些学校还有配套的课程设计,可见课程对学生动手能力要求是比较高的。
实验教学按照目标和方式不同可以分为以下几类:①部件验证型实验。这类实验要求学生在专用实验仪器上以操纵开关的方式模拟特定部件的状态变化,达到加深理论知识学习的目的。实验操作简单易于开展,也是国内《计算机组成》课程实验开展最普遍的形式。②综合性设计型实验。采用VHDL等硬件设计语言自行设计计算机部件、指令系统,并基于FPGA开发板完成硬件的开发。这类实验要求学生具备一定的自学能力和知识综合运用能力,难度较大,一般分多个阶段实验完成。③软件仿真实验[2]。使用软件替代传统的计算机组成实验箱仪器,学生的实验操作是在可视化软件上完成的。如基于Multisim仿真软件开展的计算机组成实验[3]。由于实验箱仪器维护和更新繁琐,且随着越来越多的非计算机专业也开设 《计算机组成》课程(如软件工程、信息与计算科学等专业),软件仿真实验也越来越普遍。
在教学实践中,三种实验方式都存在一定的不足,部件验证型实验过程容易流于形式,学生自主性不强,只有少数学生能够将现场操作与前面的理论知识关联起来;综合设计实验只能在课时充裕的情况下开设,且需要学生对先修课程掌握较好;软件仿真实验主要针对不具备硬件实验条件或者软件专业的学生开设,具有节约教学成本的作用,但是会弱化学生硬件设计与开发能力。
笔者近十年来分别为计算机科学与技术专业、信息与计算科学专业、应用数学专业本科生开设《计算机组成》课程,以上三类实验课程在不同的教学环节都有所尝试。其中信息与计算科学专业、应用数学专业本身侧重软件、算法和架构,实验课程开设基本以软件仿真实验为主。因此,针对不同专业特点设计了不同实践教学内容,包括部件验证实验、综合设计实验、软件仿真实验[4][6]等环节,通过调查、成绩对比等手段,发现这些教学方式的实际成效基本相当,不存在显著差异。
自2015年开始,进一步针对软件仿真实验进行深化教学改革,针对信息与计算科学专业和数学专业学生开发了基于MIPS指令的自主仿真实验系统,并由原来的仿真实验改成了翻转实验[1][5],即以现有仿真系统和硬件器材为原型参照,要求学生自己补全缺失的实验环节和仿真模块,然后相互交付给同学完成实验操作。近三年的教学实践过程表明,通过自主实验内容的合理设计,自主仿真实验能够使得学生在知识理解、参与度、综合运用能力等方面都有所提升,教学质量有所提升。2017年开始将自主仿真实验拓展到其他学校和其他专业,也取得了较好的效果。
基于MIPS指令的自主仿真实验系统由三个部分组成,如图1所示。
图1 仿真系统总体设计图
其中MIPS指令硬件仿真模型由总线、控制器、运算器、存储器、时钟信号发生器等硬件的软件仿真模块,以及二进制运算等基本模块构成,是实验系统的核心模块,这些模块可以构成一个完成的虚拟机运行子系统。
为了能够进一步配合翻转实验的开展,进一步设计了MIPS指令程序的运行子系统,根据实验开展的难度情况,提供编译子系统和解释子系统两个不同的子系统,每个子系统可以拆解为若干个子模块。
可视化控制子系统提供基于网络通信的远程实验系统控制界面环节,允许实验子系统后台服务执行,操作过程可以控制MIPS指令的单步执行和顺序执行方式,可以直接查看到实验系统中各个仿真部件的内部状态。
图2 系统抽象结构
为了满足翻转实验实施的需要,整个系统设计为组件化,是可拆解的,具体实验实施过程中会让其中某些软件模块缺失,学生自己根据翻转实验要求设计和开发相应模块单元,这就要求整个实验系统满足统一的可插拔标准设计规则,因此系统整体结构基于抽象工厂和建造者模式构建,图2给出了软件模块的抽象构成,具体实现则可以由学生自行替换。
这些抽象构成包括构建者模块(Builder)、抽象芯片模块 (Chip和IChip芯片)、抽象硬件模块(IHardware)、器件模块(IParts)。具体实现的主要难点和核心是MIPS指令执行CPU的设计。CPU执行指令时通过程序计数器来控制,约定控制器的状态有空闲状态、取指令状态、指令执行状态。如果状态为取指令状态,那么在节拍器上升时去执行取指令操作;如果状态为执行状态,那么在节拍器下降时去执行指令。其实现结构如图3所示。
图3 CPU仿真软件结构图
翻转实验实施过程与实际指令分解执行的过程基本相当,被分解为四个步骤完成,包括:①内存模块初始化。内存模块通过总线挂载到CPU上,根据内存的工作原理,实现内存寻址、内存传输。内存的引脚对应着节拍信号,CPU向内存写入地址时,此时引脚对应的节拍信号是写信号。②总线模块实现写入程序地址和数据,读取线路上的数据,告知其他连接在总线上的器件,并且可加载其他功能器件等。③CPU模块主要通过总线加载运算器、控制器、内存、缓存及实现它们之间联系的数据,其运作过程分别为 Fetch(提取)、Decode(解码)、Execute(执行)、Writeback(写回)。 ④零部件模块(ALU等)完成算术逻辑运算如加减乘除、与或非异或等一系列运算功能,高速缓冲存储器实现数据暂存功能,通用存储器存储数据,程序计数器计算并指向下一条指令地址,译码器根据得到的数据译码,缓存暂存CPU运算数据。
以上实验过程可通过可视化界面来导入程序和数据,运行或者控制仿真系统执行过程,如图4所示。
图4 仿真系统可视化界面汇编程序编译并加载到内存图
2007-2014年之间的《计算机组成》教学中,针对计算机科学与技术、信息与计算科学、应用数学三个不同的专业采用了不同的实验内容和形式,其中计算机科学与技术专业每学年约40-60人,开设的实验包括运算器部件实验、存储器部件实验、微程序控制器部件实验、多级嵌套的中断实验,实验器材采用多种型号的实验箱。信息与计算科学专业和应用数学专业每学年约70-90人,开设的实验包括74LS181运算和逻辑实验、单片机仿真设计实验、单片机应用实验,实验在Multisim仿真软件系统上完成,不需要硬件器材。
对这两种不同的实验教学方式进行比较,比较的主要依据是2012-2014年三年间学生期末考试成绩,用于了解学生知识点的掌握情况,后者用于了解教学过程质量水平。图5为计算机科学与技术专业的知识点考核错误率,图6为信息与计算科学专业和应用数学专业知识点考核错误率,笔者对数据进行了归一化处理,可以看出,信息与计算科学专业学生的知识掌握程度要稍微弱于计算机科学与技术专业学生,但总体水平差异不大。
图5
图6
2015年开始对信息与计算科学专业、应用数学专业的《计算机组成》课程进行了试验性改革,改革的主要形式是实践课程的翻转实验[6][8]。开始仅要求学生自主仿真总线系统,逐步扩展到CPU、内存和指令系统多个环节,目前已经可以实现芯片级的MIPS指令仿真硬件系统由学生自主设计完成。为了配合进一步的翻转实验教学,在理论教学方面也进行了课时和内容的调整。
(1)理论教学的调整
①培养自主学习认知水平[7][9]:在学期开始就向学生强化自主仿真教学的实用意义和最终能取得的成就;在每一章授课开始时先演示已有仿真系统的操作,并布置需要完成的仿真设计和开发任务。整个理论知识教授过程中都带有明显的目的性,让学生认为理论知识是基础,重点是如何运用理论知识完成仿真任务。在教学过程中,每周会抽出15分钟时间对仿真任务的难点进行讲解和讨论。从实际教学情况看,这些教学方式调整是十分必要的。
②调整理论和自主学习课时比例:《计算机组成》课程的知识体系是按照计算机组织结构由一般到复杂的顺序组织的,分为基础知识、系统总线、存储器、输入输出系统、运算方法、指令系统。每部分知识点都设置一部分自主学习的课时比例,要求通过自主学习完成自主仿真实验的设计。
表1 自主仿真实验内容
(2)翻转实验内容
自主仿真实验分为若干个实验模块,基本上平均地分配在各章节知识点中,如表1所示。
按照由易到难的原则,共有6个自主仿真实验,第一学期只用了其中的3个,逐步扩展到其中5个,基本涵盖了计算机组成原理的主要内容。6个自主仿真实验被分成3组,要求学生按照组来递交实验成果,成果包括自主开发的仿真程序和实验实施报告。
①BIT和Binary运算实验的主要内容是采用面向对象软件开发的方法实现二进制位和二进制数的基本运算,实验实施目标为学生开始具备熟悉面向对象封装的实际经验,以及必要的二进制数运算知识。该实验设计与计算机组成的知识点关系并不密切,主要面向信息与计算科学和应用数学两个专业学生开设。
②MIPS指令系统解释器试验分为两步,首先要求学生根据MIPS指令集(可以修改和简化)编写斐波那契数列实现程序,进一步要求学生自主开发解释器系统执行程序,其中涉及到CPU寄存器和内存存储,都只是要求简单地采用数组代替,因此该实验设计的主要目标是熟悉MIPS指令系统,具备初步的指令系统设计能力。
③系统总线与时钟信号控制实验要求学生用软件仿真实现板集总线的信号(同步)传输过程,能够显示出系统总线的数据传输状态和挂接的芯片名称。该实现设计的主要目标是使得学生理解系统总线传输过程时钟同步信号的作用,以及系统总线的基本分类。
④内存工作仿真是自主仿真实验的难点,实验要求学生用软件实现内存存储芯片的引脚封装,结合已经实现的系统总线,通过MAR和MDR寄存器仿真数据的存取操作,进一步实现内存组相联cache的仿真功能。实验目标是形成对存储器工作原理的感性认识,加深对cache工作细节的理解。
⑤中断控制器实验要求学生自主仿真实现单片Intel8259中断控制器,能够仿真中断向量的形成过程。实验目标是掌握中断控制器和CPU之间的工作过程。由于受到课时限制,该部分实验实际没有开展。
⑥CPU和控制器运行仿真实验,是所有自主仿真实验的重点和难点,实验内容要求完成寄存器、ALU、组合逻辑控制器的软件仿真,并能够让MIPS指令系统解释器实验中的斐波那契数列程序正常运行。实验目标是促成学生理解CPU是如何执行各类指令的运行原理。
所有翻转实验连接成整体实际上构成一个完整计算机,涵盖的知识点比较齐全。内容设计目标还考虑提升学生软件开发的能力和经验,这个目标主要是针对信息与计算科学和应用数学两个专业的。此外自主仿真实验内容是否合理还有一个关键性因素——仿真硬件的粒度,最理想是能够仿真到门电路级别,限于课时、讲师和学生能力,目前无法达到,因此实验内容设计只要学生将芯片内部看成无结构的黑箱,只要实现芯片的输入输出就可以。对于翻转实验中“缺失”的部分,选择了其中相对独立、与理论教学知识点比较密切的几个方面,如图7所示。
图7 “翻转”部分模块图
其中虚线框部分为需要进行“翻转”的实验部分,整个实验要求围绕“斐波那契数列数据前n位值”程序的设计、开发、运行为主线,要求完成算法编程、指令验证、虚拟计算系统执行过程,而对于虚拟计算系统中缺失的部分,则需要由各实验组自主完成。
对于翻转实验实施成效,主要从对知识点考核成绩方面进行分析。考核包括理论考核和实验考核两个部分。由于翻转实验对学生的自主学习能力有较高的要求,在实验考核部分也设计了一种基本难度等级的灵活性实验组合选择,如表2所示(部分)。
对2015-2017年实施自主仿真实践教学改革以来学生知识点掌握情况进行了分析,分析的主要依据是三年来期末考试成绩的知识点得分率(知识点平均得分/知识点总分值)。数据进行了归一化处理,如图8所示,可以看出,采用自主仿真软件实验后,指令系统的知识点得到了明显提高,总线和内存知识点的掌握也有了一定程度的提高,CPU控制器部分则无明显变化。
表2 自主仿真实验考核等级表
图8 2015-2017年知识点得分率对比
对实验教学方式进行比较,比较的主要依据是2012-2014年三年间学生期末考试成绩,用于了解学生知识点的掌握情况,后者用于了解教学过程质量水平。图5为计算机科学与技术专业的知识点考核错误率,图6为信息与计算科学专业和应用数学专业知识点考核错误率,对数据进行了归一化处理,可以看出,信息与计算科学专业学生的知识掌握程度要稍微弱于计算机科学与技术专业学生,但总体水平差异不大。
翻转实验系统和实施都是《计算机组成》课程改革的一步创新,是近几年来数位教师花费了很多心思并付出努力得到的一些成果。下一步应在巩固这个教学成果的基础上,进一步提高实验的效率和考核标准。此外,自主型实验是否可以在其他课程上采用,以形成一种教学的创新模式,是今后需要研究和尝试的重要方向。