案例教学法在计算机系统结构课程中的应用
2018-09-17丁贤庆李建华
陈 田,丁贤庆,路 强,安 鑫,李建华
(合肥工业大学 计算机与信息学院,安徽 合肥 230009)
0 前言
计算机系统结构课程是计算机专业的一门核心专业课程,知识点较多——有指令集结构、流水线结构、指令静态调度、指令动态调度、cache存储、多核并行编程等主要知识点。在参考文献[1-2]中,强调了动画教学和模拟器教学;动画教学需要教师课前制作好相关的动画,课程讲解中教师将PPT和演示动画相结合教学;模拟器教学需要教师编写对应的模拟器软件,利用该软件,动态模拟和显示指令的执行过程。比较有名的模拟器软件有winDLX和DLXView。在参考文献[3]中,强调了并行算法编程的重要性,要求在学习计算机结构概念的同时,增强MPI并行编程能力的训练。
通过近几年计算机系统结构课程的教学,笔者发现该课程存在以下问题:①课程概念较多,学生觉得内容抽象、枯燥难学;②课程学时少、教学知识点多,特别是与计算机系统结构有关的新技术和新结构更新很快,这些新知识也要添加到课程中;③综合性实验难度较大,难以在短时间内实现;④verilog硬件描述语言没有前序课程涉及,学生完全自学感觉费力,课设中要用到该部分知识。针对问题,吸收国内外计算机系统结构方面的先进教学理念,可以将先进教学方法和创新思想引入课堂。改变以往的灌输式、照本宣科式的教学模式,采用案例式教学为主,并和启发式教学、引导式教学和讨论式教学相结合,通过促进学生自主学习,提高教学效果。此外,紧跟国际计算机技术发展潮流,不断更新计算机系统结构课程内容,在有限的教学学时内协调好经典知识和先进技术的讲授关系,通过引入科技发展的新成果和前言知识,拓宽学生的视野。
1 案例教学法的具体实现
为了更好地调动学生学习的积极性,为了将抽象的理论和实践结合,可以在课程教学中,结合CPU设计这个具体案例来讲解重要知识点。CPU设计案例教学法分为3步:第1步,围绕着CPU设计这个案例,通过提出问题来激发学生主动思考、自主学习;第2步,通过理论知识点的引导式学习,给后续的CPU具体设计打好铺垫;第3步,课堂上给出CPU设计的框架结构,通过设计作业让学生课后完成具体设计,以此来锻炼学生的动手能力、创新能力。
1.1 CPU设计问题的提出
在课程教学中可以先用2个学时补充verilog相关知识,然后给出任务:设计一个具有6条指令的CPU。这6条指令分别是Load指令、Store指令、Mov指令、Add指令、Xor指令和Bnz指令,这6条指令涵盖了访存指令、传送指令、算术与逻辑指令和分支指令,具有一定的代表性。假设这6条指令的机器码已经给出(如图1所示)。
图1 6条指令的机器码
1.2 结合案例设计过程学习主要知识点
课程案例设计教学中将该任务分解成多个子任务。实现每个子任务前,先讲解理论知识点,然后用verilog实现框架结构。围绕着每个子过程的设计,学生可以先提出问题,进行知识点学习。理论讲解以引导为主、自学为辅。教学中强调夯实基础,注重综合应用,减少重复。将学生由“被动实践”变为“主动实践”,学生的质疑力、观察力和协同力得到了培养和提高。
1.2.1 结合机器码的分段,学习I、R、J类型指令格式
在讲解指令系统之前,首先抛出3个问题让同学们思考。问题1:图1中的指令怎样分段。从而看出操作码和地址码部分?问题2:怎样看出图1地址码部分对应的操作数代表的是整数还是浮点数?问题3:怎样知道地址码中对应的是内存地址还是寄存器编号?然后带着这3个问题开始指令系统部分理论学习[4-5]。最后给出上述3个问题的答案。问题1:在MIPS指令集中,将机器码分为I、R、J三种类型,在I类型指令中将机器码分为4段。在R类型指令中将机器码分为6段。在J类型指令中将机器码分为2段。问题2:数据表示常见的有两种。其一是带标志符的数据表示,通过操作数的前几位指明数据是整数还是浮点数。另一种是通过不同的操作码来指明后面的操作数是整数还是浮点数。问题3:通过操作码来指明地址码中对应的是内存地址还是寄存器编号。回答完问题后,再结合图1中的机器码来介绍MIPS、arm和X86不同指令集的优缺点。
1.2.2 结合操作码的设计,学习流水线和流水线中状态机的设计(译码)
讲解指令流水线之前,首先提出2个问题。问题1:图1中6条指令怎样实现能使总执行时间最短?问题2:如果这些指令的操作码已经知道,怎样设计指令译码器部分?带着这两个问题,开始流水线章节的理论学习,最后给出上述2个问题的答案。问题1:采用流水线技术能够加快多条指令的执行速度[6]。问题2:由于不同操作码对应的控制信号不同,可以用时序电路设计中常用到的状态机设计技术来实现。
1.2.3 结合操作码的设计,学习相关的检测机理
在介绍流水线中“相关”理论知识点之前,首先提出一个问题,图1中6条指令中,如果出现后面指令需要用到前面指令的结果,怎样检测和处理?带着该问题学习指令相关的理论知识点,然后给出问题答案:在流水线的译码阶段,检测前后两条指令的地址码是否相同,如果相同就认为出现了数据相关。处理数据相关的办法很多,其中常用解决方法是:由“相关”检测电路发控制信号给多路开关从而使数据定向通路打开,或者使后一条指令暂停,或者通过编译器进行指令静态调度来消除数据相关。
1.2.4 结合地址码的设计,讲述访存阶段
讲述流水线中访存阶段时,首先提出2个问题。问题1:如何在指令中指明寻址方式?问题2:由于存储器地址的特殊性,如何在间接寻址中,计算出正确的绝对地址?介绍完寄存器寻址、立即数寻址、间接寻址等10种寻址方式后,给出答案。问题1:在指令系统中寻址方式可以通过操作码来指明,一般系统中只保留常用的几种寻址方式,从而使译码系统简化,提高性价比。问题2:可以在流水线的执行阶段来实现绝对地址的计算,这样就可以不必额外添加进行绝对地址计算的运算器,但是需要增加多路开关来实现地址和数据的分时选择和计算。
1.2.5 结合运算器设计,讲述定向通路,并行操作(多操作部件的设计),超长指令字技术
在讲述运算器的设计时,首先提出3个问题。问题1:图1中6条指令对应的运算器怎样实现性价比高?问题2:如果有减法指令,怎样在加法器上设计?问题3:如果要实现多条指令完全并行执行,运算器怎样设计?讲述完运算器的主要功能和结构特点等主要知识点后,给出上述问题的答案。问题1:图1中6条指令对应的运算器应该采用复用技术,共用同一个运算器,通过多路开关控制运算器的输入,并且构成指令流水线,性价比更好。问题2:对于减法指令,可以通过补码结构转换为加法,从而减少硬件成本。问题3:如果要实现多条指令完全并行执行,运算器就需要设置多个,例如设置整数运算器、浮点运算器、地址运算器等,利用硬件成本代价的增加来提高并行速度。
1.2.6 结合流水线指令阶段和写回阶段,讲述Tomasulo算法和指令动态执行技术
在讲述指令动态执行技术时,首先提出2个问题。问题1:图1中6条指令能否顺序流出,乱序执行?怎样实现?问题2:能否设计一个能实现100条指令乱序的执行系统?如果能需要考虑哪些问题?讲述完Tomasulo算法和指令保留站知识点后,给出问题的答案。问题1:图1中6条指令能顺序流出,乱序执行,关键是要有多个保留站和多个执行部件,通过保留站消除指令之间的相关,通过多个执行部件的并行工作,实现了乱序执行。问题2:要实现100条指令的乱序执行,系统设计中就要求至少有100个保留站,执行部件数量如果比较少,很难有好的并行性,并且100条指令之间相关检测硬件结构非常复杂,总之,100条指令的乱序执行理论上能实现,但是硬件成本高,系统性价比低。
围绕着CPU设计提出对应的问题,只是为了激发学生们主动学习积极性,通过verilog硬件描述语言来动手设计CPU,就可以将理论知识和实践结合,加深对相关知识点的理解和掌握,同时通过设计的完成,锻炼了学生们的动手能力和创新能力。设计过程以课堂引导为主,学生自主设计为辅。这样就与课内学时比较少的实际情况相吻合,同时给学生们课后作业留下了任务,达到了课内教学和课外训练的齐头并进。
1.3 案例教学中采用的软硬件环境和系统框架图
案例教学中采用的硬件是Xilinx virtex5开发板,软件环境是ISE10.4。课程教学时将该设计任务分解成多个子任务,包括取指令部件的设计、译码部件的设计、运算器部件的设计、存储器部件的设计、写回部件的设计等,实现每个子任务前,先讲解理论知识点,然后用verilog实现框架结构。这样就将理论知识点和动手设计结合起来,一边讲,一边练,一边讨论,激发了学生学习的兴趣。在设计环节主要是通过verilog硬件描述语言设计出对应的硬件结构[7,2]。对于五段指令流水线,可以先画出系统框图(如图2所示),根据系统框图给出每个verilog代码模块的输入与输出引脚。
图2 流水线系统框图
案例设计中,需要设计时钟模块。时钟模块可以提供对主时钟信号的分频、倍频、移相等功能,给流水线电路提供对应的时钟信号(如图3所示)。在时钟模块中,输入信号有CLKIN_IN和复位信号RST_IN,输出信号为CLK0_OUT、CLK180_OUT和锁频信号LOCKED_OUT。只有在输出时钟信号稳定的情况下,锁频信号LOCKED_OUT才变为有效的高电平,否则为低电平。图4是时钟波形图。从图4中可以看出,在锁频信号LOCKED_OUT上升沿来临前,时钟信号CLK0_OUT、CLK180_OUT的信号是不稳定的。在时钟信号稳定后, CLK0_OUT信号的相位与CLKIN_IN相位相同,CLK180_OUT信号的相位与CLKIN_IN相位相差180度。
图3 时钟模块图
图4 时钟波形图
案例教学中,针对每个流水段先确定输入和输出引脚数目,然后设计输出和输入之间的逻辑结构。为了激发学生学习的积极性,上课时只给出系统框图和关键模块的设计,其它次要部分就作为设计作业,让学生课后完成,完成的作业要提交给老师评分。通过这种动手设计,学生能主动思考问题,积极给出设计结果,同时还会为下次课的学习积极准备,激发了学生求解未知知识的兴趣。教师也能通过学生的设计,收获颇多。
2 案例法教学效果
理论结合实践,采用案例教学法具有理解快、记忆效果好的特点。从实施的效果来看,学生上课积极性得到提高,实验完成质量稳步上升,学生自主学习和研究的热情高涨,培养了学生的设计能力和创新能力,达到了本课程要求的培养研究和应用兼重的复合型人才的目标。在学生教学评价中,学生反馈是“通过设计,全面认识了计算机系统”“设计过程就是一个非常好的理解和掌握过程”“看着我的设计作品,我有种成就感”等。 通过统计发现,采用案例教学法后,期末考试平均成绩得到了提升,成绩为“优秀”的人数也在上升。同样,采用案例教学法后,课程设计完成难度和优秀比例也得到了提升。
3 结语
计算机技术的不断发展,推动着课程建设的不断改革和创新[8]。笔者下一步的改革思路是:以自主设计的CPU为核心,完善外设和操作系统、编译系统,从而形成一个完整的系统。方法是:采用FPGA设计基于arm指令集的CPU,在非易失性存储器flash中装载linux嵌入式操作系统。通过配置引导程序参数,使系统启动时能直接运行flash存储器中存放的虚拟机和嵌入式应用程序。通过开发嵌入式驱动程序,让CPU可以接收输入外设传送过来的信号,也可以控制输出外设进行正确的工作。这种案例教学法对于学生全面理解课程知识点,加强动手能力和创新设计能力的培养有着积极的意义[9]。