刘 芹,涂国庆
(武汉大学 国家网络安全学院,湖北 武汉 430072)
“计算机组成原理”是信息安全专业学生接触到的第一门硬件专业基础课程,向学生综合展示计算机系统的基本结构和工作原理,为后续的专业课程学习做好准备,CPU原理和设计是这门课程的核心[1]。以CPU为核心的各类芯片也是构建信息产业的核心基础,是影响“自主可控”国家信息产业战略实施的关键,对信息安全专业的学生尤为重要[2]。
目前高校开设“计算机组成原理”实验课的主要方式如下[3-6]:(1)使用纯硬件搭建实验平台,虽然该方式可深入接触计算机硬件模块,但实验操作机械死板,硬件平台开发成本较高;(2)采用软件系统仿真的方式,该方法不依赖硬件,成本较低、易于上手,但学生不能在实验过程中较好体会到计算机与硬件的紧密结合;(3)基于FPGA的组成原理实验平台具有可编程、直观、学生动手程度高等优点,然而存在对学生的软硬件预备知识要求高、设备调试复杂的缺点,难以在较短的实验课时内完成。
武汉大学信息安全专业曾开展过基于FPGA的开放式CPU教学实践,学生普遍反映课程难度高。由于学生初次涉足CPU结构,对计算机原理尚处于初步认识和理解阶段,CPU设计实践只是初试身手,要求过高容易使部分学生在遇到问题时无法解决,产生迷茫和挫败感,导致学生对硬件课程失去兴趣,这更为短时间内(例如24课时)完成实验任务提出了巨大的挑战。
CPU设计过于专业,相关书籍晦涩难懂,相关设计工具不易上手。面对复杂系统、陡峭的学习曲线,教育经验表明模仿是最佳的学习方法。笔者所在的教学团队对“计算机设计实践”课程进行了教学改革,为学生提供了一个极简功能的MIPS单周期CPU示例SCCPU0。SCCPU0支持少量指令,仅能完成非常简单的处理。学生无需对SCCPU0做任何修改或代码补充即可较快上手,这与提倡“从零”开始设计CPU不同。学生通过SCCPU0掌握实验环境的使用,初步了解CPU设计的全流程,理解CPU实现框架,学习Verilog HDL代码风格和编写规范。SCCPU0是实验的起点,后续任务是对SCCPU0进行迭代扩展,使CPU功能更加完善和复杂。精心的课程设计和任务分解可引导学生在比较有限的课时内在FPGA上完成验证CPU的目标。教学团队还设计了用户友好的仿真验证平台和SOC验证平台,统一的验证平台既方便了学生调试和验证CPU,也为教师现场验收实验提供了便利。教学改革成效证明多种课程改革措施有效地平缓了“计算机设计实践”课程陡峭的学习曲线,激发了学生学习硬件课程的兴趣和潜力。
“计算机设计实践”课程的目的是融会贯通“计算机组成原理”课程所教授的知识,通过对知识的综合应用,加深对CPU系统各模块的工作原理及相互联系的认识;学习采用EDA(electronic design automation)技术设计MIPS单周期CPU、多周期CPU和流水线CPU的技术与方法;培养科学研究的独立工作能力,取得CPU设计与仿真的实践和经验;了解SOC系统,并在FPGA开发板上实现简单的SOC系统。
使用Verilog HDL设计实现支持指定MIPS指令子集的单周期、多周期和流水线CPU,并在CPU上运行某任务程序(例如学号数位排序),在FPGA开发板上通过七段数码管等外设显示任务处理结果。
实验需要使用如下软硬件。
1.Nexys4-DDR 数字电路开发板。Nexys4-DDR采用了Xilinx Artix-7 FPGA芯片,它是一款简单易用的数字电路开发平台,可以支持在课堂环境中设计一些行业应用。
2.MARS。MARS是一个轻量级的、用于教学的MIPS汇编语言集成开发环境(IDE)。本课程使用MARS进行MIPS汇编语言的学习、编写和运行。
3.ModelSim。Mentor公司的ModelSim是业界最优秀的HDL语言仿真软件,它能提供友好的仿真环境,是业界唯一的单内核支持VHDL和Verilog混合仿真的仿真器。
4.Vivado。该设计套件是Xilinx公司最新为其产品定制的集成开发环境,可以完成从设计输入、综合适配、仿真到下载的完整FPGA设计流程。
本课程的实验环境包括多种功能繁杂、使用较复杂的工业级软件和硬件,实验目标CPU设计本身就具有较高的挑战性,这两大困难是学习曲线陡峭的主要原因。我们通过精心的课程设计和任务分解引导学生在比较有限的课时内在FPGA上完成验证CPU的目标。实验被分解为任务1—6,其中任务1—4是必做任务,任务5—6是选做任务。
为了帮助学生在较短的时间内清晰理解实验环境各组成部分的作用并熟练掌握其使用方法,建立对以Verilog VDL实现的CPU框架的基本认知,笔者所在的教学团队为学生提供了一个极简功能的MIPS单周期CPU示例SCCPU0。SCCPU0实现了add、sub、and、slt、or、addi、ori、lw、sw、beq、j共11条指令,支持少量算术逻辑运算、存储器读写、条件转移和无条件跳转,仅能完成非常简单的处理。
SCCPU0是任务1的操作学习对象。SCCPU0在平缓学生学习曲线方面有以下作用:(1)使用SCCPU0进行仿真、综合和下载,初步了解CPU 设计的全流程,掌握实验环境的使用;(2)理解CPU实现框架,把CPU 原理与具体实现建立连接;(3)将SCCPU0的源码作为Verilog代码的示范,快速理解各种语法规则和编码规范。
与以往的教学方法不同,SCCPU0“麻雀虽小,五脏俱全”,学生无需对SCCPU0做任何修改或代码补充即可较快上手。即使在课程初期给学生安排简单的设计型任务,学生也有可能由于对实验环境熟悉、操作失误导致无法及时完成任务,从而失去继续学习的兴趣和信心。
SCCPU0 是实验的起点,后续任务是对SCCPU0进行迭代扩展,使CPU功能更加完善和复杂。为了帮助学生进一步理解CPU功能的扩展方法,任务2是在SCCPU0中添加对jal指令的支持形成单周处理器SCCPU1。教学团队通过现场授课方式,逐步演示添加jal指令的过程,并讲解如何对新扩展的指令进行测试。虽然任务2只包括少量的设计工作,但它已能清楚地展示指令扩展从什么地方入手,涉及哪些方面的修改以及测试方法。值得注意的是,扩展CPU后不仅需要验证新增指令的功能是否正确,还需确认原有指令功能是否会因新增指令引入的bug而受到影响。
任务1~2对学生没有太多设计要求,但它们对降低课程初始的难度具有重要的作用。当CPU设计下载到FPGA开发板上运行结果正确时,微小的成功也会激发学生学习硬件的热情,提高学习的积极性。任务1和任务2可消除复杂实验环境对学生造成的困扰,也有利于学生更准确地理解实验目标。
任务3是对SCCPU1扩展指令sll、nor、sltu、lui、slti、bne、andi、srl、sllv、srlv、jr、jalr,形成单周期处理器SCCPU2,SCCPU2共支持24条指令,已经可以完成相对复杂的算法,例如排序。任务3由学生完全独立完成。由于已提供单周期CPU的设计框架,该任务的设计工作量中等。
任务4是实现多周期处理器MCCPU,MCCPU实现的指令与SCCPU2相同。多周期CPU设计的难点是如何通过有限状态机实现控制器,教学团队会为该任务提供一个简单的有限状态机FSM代码示例,其余部分由学生独立完成。由于没有提供多周期CPU的设计框架,该任务的设计工作量较高。
任务5是实现五级流水线处理器PLCPU,MIPS五级流水线需要处理数据相关和冒险相关,实现比较复杂,该任务是可选任务,供学有余力的学生选做,设计工作量高。
任务6是在SCCPU2、MCCPU或PLCPU上实现具有异常和中断功能的处理器ECPU,该任务是可选任务,供学有余力的学生选做,设计工作量较高。
计算机设计实践以CPU设计为核心,为了验证CPU功能的正确性,需要搭建用户友好的验证平台。CPU功能的验证通过两个步骤进行,首先使用ModelSim完成仿真验证,再通过Vivado综合、下载比特流文件至FPGA开发板完成SOC验证。为了方便使用,搭建CPU验证平台需满足:(1)仿真验证平台中的CPU模块与SOC验证平台中的CPU模块接口完全相同,即仿真验证平台测试通过的CPU可完全不做修改用于SOC验证;(2)验证平台中的CPU模块可指单周期CPU、多周期CPU和流水线CPU,因为它们的外部接口完全一致。
Modelsim仿真验证平台包含了CPU模块、指令存储器im和数据存储器dm。MIPS程序二进制文件固化在指令存储器im中,当testbench提供时钟激励信号时,CPU从im中不断取指令、执行指令。需要指出的是,当验证多周期CPU时,只需使用同时存放代码和数据的存储器mem。
SOC验证框架中除了CPU、指令存储器和数据存储器以外,还包含时钟分频模块、多数据通路模块、总线译码模块和七段数码管接口模块,以利用Nexys4-DDR上的IO部件实现数据输入(开关输入)和结果输出(七段数码管),这些模块的源码提供学生直接使用。指令存储器可由Vivado的IP核生成。
当比特流文件下载至FPGA后,CPU运行的结果只能通过开发板上的IO部件如七段数码管显示。SOC验证平台通过多数据通路模块对开发板上的开关设置进行了配置,不同的开关设置可在七段数码管上显示不同的内容。当CPU运行不正确时,开发者可将开关拨动到相应位置,从七段数码管上观察关注的内容,协助代码调试。需要说明的是,调试时将开关SW15置为1,CPU慢速运行(利用时钟分频得到的慢速时钟提供给CPU),模拟指令单步执行,方便观察。
以在CPU上运行学号数位排序为例说明CPU的功能验证。每位学生使用各自学号的后8位作为待排序的数据,学号的每一位采用BCD编码,构成32位二进制数据,MIPS程序对学号的各数位按升序排列,例如某学生的学号后8位为“54873530”,排序后应为“03345578”,排序前后的数值能够通过开关控制在七段数码管上显示。由于每位学生的学号不同,待排序的数据不同。差异化的任务对减少学生抄袭作弊有一定的作用,也方便教学团队进行验收。
笔者所在的武汉大学国家网络安全学院自2018年以来推行计算机实践设计改革,取得了显著成效。调查表明,在改革前,学生平均累计花费12小时才能比较熟练地掌握实验环境使用和扩展指令的方法,学习曲线陡峭;在改革后,学生平均累计花费4小时即可达到同等效果,实验完成度也明显提高。改革巩固了学生的理论知识,使学生对所学知识融会贯通,取得了较好的教学成果。越来越多学有余力的学生选做具有异常和中断功能的流水线CPU,提升了学生学习硬件课程的兴趣,提高了硬件设计水平。教学团队近4年的评教成绩位于学院前列,常有学生在评教系统中留言表明“终于真正理解CPU了”“这是到目前为止(大学二年级)收获最大的课程”。
“计算机设计实践”课程改革帮助学生克服了害怕甚至反感硬件课程的情绪,极大地调动了学生的学习积极性,取得了较好的教学效果,使学生更加深刻地理解了MIPS单周期CPU、多周期CPU、流水线CPU的设计方法,学生的动手能力得到较明显的提升。精心细致的课程设计和任务分解有效地降低了课程初期的学习难度,多项课程支持措施进一步推进了改革的成效。我们建立了课程师生群,教学团队及时解答学生问题,实验初期学生的问题大多与实验环境有关。课程还设立了FAQ列表,对常见的问题进行收集、分类和解答,方便学生搜索,自行解决一些共性问题,培养学生自主解决问题的能力。在今后的教学实践中笔者还会进行一些优化和调整,通过更有趣味的实验任务充分利用Nexys4-DDR开发板,挖掘学生的创造性,增强学生的社会竞争能力。