
| 作 者 | 高小鹏 万寒 |
|---|---|
| 单 位 | 北京航空航天大学 |
| 内容提要 | 本书是计算机领域本科教育教学改革试点工作(“101计划”)系列教材之一,以开发一个具有数十条指令规模且能够通过严格测试的功能型CPU为挑战性学习成果,培养学生掌握基于模型的CPU开发方法,进而具备分析、设计和开发计算机硬件系统的基本能力,为后续专业学习与职业发展奠定坚实基础。
本书根据设计一台计算机的教学要求,将传统意义上的汇编语言和计算机组成两门课程的相关知识进行重构,包括计算机概述、数据表示与运算方法、计算机指令、单周期CPU、多周期CPU、流水线CPU、存储层次、输入输出和集成MIPS微系统等内容。同时,创新性地介绍“CPU形式建模综合方法”,并以“系统设计详解”的形式讲解系统设计中的思考重点与权衡精要。为了满足读者对在线开放学习的需求,本书配套建设了重难点知识点视频、相关工具操作视频、教学课件、难度递进的实验体系和自动评测系统。上述所有教学资源均部署在希冀平台(具体操作参见附录B.5),便于读者在线实践。
本书既可作为高校本科计算机类专业计算机组成课程教材,也可供相关技术人员参考。 |
一、本书写作背景
本书起因于我作为亲历者至今仍深度参与的一项教学研究工作。2006年,北京航空航天大学计算机学院(以下简称“学院”)经历了首批工程教育专业认证试点工作。这项工作让我们认识到“学习知识≠具备能力”,明确了教学体系必须从“传授知识转向能力培养”,并思考一个问题:计算机专业学生的核心能力是什么?2007年,学院启动了一项对计算机专业本科教育教学产生深远影响的改革工作:将计算机组成、操作系统、编译技术等计算机专业必修课程组建为课程群,并提出课程群建设目标是培养本科生自主开发功能型的“CPU、操作系统、编译器”的能力。后来,教育部高等学校计算机类专业教学指导委员会将这种能力命名为“计算机系统能力”,在全国范围内开展并推动“系统能力培养”教育教学改革工作。这项工作从2007年至今持续近二十年,已经逐步成为当前计算机类专业的教学改革热点之一,有力地支撑了“能力培养”等核心理念在一大批计算机专业的有效实施。
计算机组成是课程群的首门课程,也是学院本科课程体系中变革最剧烈的课程,我提出了“大课重课”建设思路,即知识面宽、挑战度高、实验强度大。课程不仅要在一个学期内讲授大量的理论知识,还要求学生独立开发一个具有数十条指令规模且通过严格测试的功能型CPU。目前,学院2/3以上本科生能够开发出具有30条指令以上规模且充分转发的5级标准流水线,并通过高强度的自动化评测。
教学实践表明,对于正在学习计算机组成课程的本科生来说,开发如此复杂度的CPU是极具挑战的。显然,本项工作对教师也提出了挑战。教师不能仅仅给学生定义挑战性教学目标,更要探寻一条帮助学生直达顶峰的可行之路!于是,这催生了本书的核心内容——CPU形式建模综合方法。
二、本书的特点
本书的第1个特点是精简教学内容。
经历了数十年的高速发展,计算机硬件技术的知识体系已经非常庞大,绝大多数计算机组成教材讲授的内容也随之越来越多。在规划本书内容时,我曾经一度非常纠结。
为了实现CPU开发这个教学目标,学院的计算机组成课程包含传统意义上的数字电路、汇编语言和计算机组成3门课程的知识体系。要在一门课程中容纳如此庞大的知识体量并且在一个学期内完成教学,就要采用颇为激进的方法。RISC——计算机领域里程碑式的技术,也是本书讲授的内容,为我们指明了思路:围绕顶层教学目标剔除大量关联度极低甚至无关联的知识点,从而构建出必须讲授的核心知识。于是,这些在教学过程中形成的核心知识,就成为本书讲述的内容。考虑到很多高校仍设置了独立的数字电路相关课程,因此这部分内容未纳入本教材中。
本书的第2个特点是重视工程实践。
要想了解计算机的工作原理,最好的方式莫过于亲自动手设计一台计算机。为帮助学生完成这个任务,本书除介绍理论知识外,还包含大量工程实践相关的内容。本书还在最后一章给出了一个较为完整的功能型计算机的开发过程,有助于学生形成对计算机完整的、系统的认识。此外,本书以“系统设计详解”方式探讨了设计思想、思考要素、设计权衡以及软硬件协同等高层次内容,且这些内容具有广泛的适用性,不仅局限在计算机硬件方面。
在课程讲授和教材建设过程中,也同步自主开发了配套的实验体系与相应的自动评测系统。读者可以登录在线平台进行实验学习,并完成自动评测,以检验所学效果。具体操作请参见附录B.5。另外,我们针对部分章节的重点内容还配套了微视频,以帮助读者更好地理解教学内容。
本书的第3个特点是讲授CPU开发方法。
迄今为止,CPU始终处于计算机硬件技术体系的核心位置。因此,无论是教材、课程,还是实验,CPU都是核心内容。我们希望学生开发的CPU能支持数十条指令而不仅是几条指令。这是因为:一是使学生对整个计算机系统理解得更全面、更深刻,二是为学生学习后续操作系统课程打下坚实的基础,三是使学生能够以CPU为例体会系统设计的思想精要。严格地说,缺乏规模的系统就不称其为系统!
一般认为,当指令集规模增长后需要更多的开发时间和大量的“技巧”来应对复杂度的非线性增长。本书介绍的“CPU形式建模综合方法”可以高效地分解CPU开发任务,极大地降低开发复杂度。如果遵循这套方法并保持足够细心,学生就能在有限的时间内完成以前难以完成的任务。
现代计算机的底层硬件、核心软件以及关键算法的复杂度越来越高,因此其开发过程也越来越依赖于基于模型的开发方法。本书之所以要花费很大篇幅来讲授该方法的目的在于:通过CPU开发这一实例,帮助学生学习和实践了一种基于模型的开发方法。我始终认为,掌握一般性方法比掌握具体知识更重要。
本书的第4个特点是同时讲授MIPS和LoongArch两种计算机体系结构。
无须避讳,我国长期以来在CPU、操作系统、编译器等计算机底层核心技术方面缺乏储备,从而导致计算机核心技术和产品高度依赖国外。随着国家政策的持续发力以及科研体系的不断完善,一大批具有完全知识产权的自主计算技术正在迅速发展并逐步成为市场不可或缺的力量。我认为在本科教学体系中非常有必要让学生同时学习多种技术。为此,本书同时讲授了MIPS和LoongArch两种CPU指令集,前者是源自国外的技术,后者则是我国具有完全自主知识产权的CPU核心技术。我希望通过对比分析式学习,能让学生扩大知识面并在一定程度上提升思辨能力。
本书的第5个特点是将内容分为基础与拓展两部分。
我国目前有1000余个计算机相关专业。由于它们在人才培养方面存在显著的差异化和层次化,因此不能要求一本教材讲授的知识适用于所有专业,也很难要求每位学生学习并掌握教材中的全部内容。为此,本书将教学内容分为基础和拓展两部分。基础部分侧重讲授核心知识,因此我个人认为基础部分应该作为绝大多数学生都应该学习的内容。拓展部分则主要侧重讲授CPU形式建模综合方法、LoongArch体系结构以及少量前沿技术。对于拓展部分来说,教师和学生可以根据自己的实际情况选择学习内容。例如CPU形式建模综合方法涉及单周期、多周期和流水线三种架构,学生可以只做单周期CPU,或者做完单周期再做多周期,再或者三者皆做。
三、本书主要内容及组织本书主要内容按基础部分和拓展部分组织。其中基础部分包括如下主要内容:
1)指令集是整个计算机硬件部分最重要的抽象技术之一,是计算机软硬件的接口。它向上提供给软件操作硬件的基本方法,并隐藏了硬件的实现细节,向下则为CPU硬件开发提供了设计需求。学习指令集就是学习计算机硬件语言,这是深入学习其他内容的前提。
2)虽然汇编语言在现代软件开发中愈发不重要,但是掌握汇编语言是开发CPU的基础,也有助于理解计算机系统行为。
3)由于CPU是整个计算机硬件的核心,因此本书规划了3章来分别论述单周期CPU、多周期CPU和流水线CPU。
4)虽然不理解存储层次也能编写程序,但很难编写出高性能的程序。存储层次中有两个极为关键的技术:首先是cache。cache是计算机领域的里程碑式技术,它使得人们只花费少量投入,就形成了成本靠近廉价存储但以接近CPU性能的快速存储速度提供数据的大型存储池。其次是虚拟存储。类似于cache,虚拟存储也是通过少量代价就使得Windows、Linux等现代操作系统几乎可以无限制地运行内存需求远超主存实际容量的任意多的软件。
5)没有鼠标、键盘等输入输出设备的计算机是没有实用价值的。总线以及点对点等互联方式使得设备与CPU、存储器连接在一起,形成了完整的计算机系统。中断是计算机发展史上的又一重要概念,它使得CPU具有并发执行多个程序片段的能力,从而奠定了现代操作系统的基础。学习中断对于学生真正掌握软硬件协同机制具有重要意义。
6)基础部分最后要求综合运用前述的多项技术来构造一个功能相对完备的小型MIPS系统。通过完成这个任务,即可将前面各章知识真正地融会贯通。
拓展部分主要包含如下内容:
1)本书除了在基础部分讲解MIPS指令系统外,还讲解了LoongArch指令系统。考虑到学生在学习LoongArch前已经具有了MIPS的基础,因此这部分内容将以对比分析的方式讲授,进一步提高学习效果。
2)CPU开发方法是拓展部分的另一主要内容。本书将分别讲授适用于单周期、多周期和流水线三种架构的开发方法,其中单周期CPU开发方法是后续两者的基础。这部分内容不仅着眼于让学生通过运用CPU开发方法驾驭复杂CPU的设计,更重要的是让学生通过这样的实际案例来逐步学习和理解现代工程为了降低开发复杂度、提高开发效率而广泛采用的开发方法——基于模型的开发方法。或者说,CPU开发方法是现代开发方法在本领域的具体体现。
3)随着CPU技术的快速发展,市场上已经很难见到非多核的CPU计算机了。多核化、向量化是今天CPU的典型技术特征。此外,原本用于图形处理的图形处理单元(graphics processing unit,GPU)也因为其具有海量的小型核心、巨大的存储带宽以及日趋友善的编程能力,逐渐成为高性能计算的主角。特别的,GPU强大的计算性能助推了深度学习等人工智能技术的高速发展。为此,拓展部分将适度介绍上述内容。
四、先修知识
考虑到国内绝大多数高等学校现行教学体系的特点,本书没有包含数字逻辑部分。为了能顺利地学习本书,读者需要先具备数字逻辑基础知识,并初步掌握Verilog HDL 语言。为了更好地理解本书中汇编程序的部分内容,建议读者具备初步的程序设计知识与编程能力,例如编写过50 ~ 100行的C程序代码,并使用过数组、函数等。
五、如何学习本书
本书内容均为在教学过程中形成的核心内容,虽然具有较强的先后关联性,但也并非必须从第1章开始学习到最后一章。其中第7章存储层次与第8章输入输出可以在流水线CPU之前学习。虽然最后一章是前面所学知识的综合运用,但也不妨先阅读或者在学习中途时翻阅,留下些许的印象,这将有助于建立对计算机的整体认识以及更好地理解前面各章节内容。想完全学好本书必须辅以大量的实验。为了帮助学生完成CPU实验,本书还配套了在线实验平台,并部署在希冀公司的云平台上。该在线实验平台内容非常丰富,读者可以在该平台上找到为本书配套的实验内容。实验内容难度递进,包含汇编语言、CPU的功能部件设计、单周期CPU、流水线CPU等大量实验。此外,平台上还有多个模拟器、硬件开发软件、硬件设计技巧等相关学习资料。最重要的是,该在线实验平台提供了自动评测功能,可以让学生知道自己编写的代码是否正确。在学习本书的过程中,读者会发现还有大量知识点未被包含在本书中。怎么办?我的回答是:利用互联网自学。互联网具有丰富的学习资源,并且保持着惊人的增长速度,这是任何一本教科书都无法匹敌的。互联网资源很多但过于杂乱,该从何处着手学习呢?不必担心。在学习本书的过程中,学生就会建立起一个关于计算机硬件知识的核心体系,这个体系会为学生通过互联网搜索与学习相关知识提供必要的线索。事实上,利用互联网进行学习是学生应该具备的一项重要能力,并且这个能力也只能是在不断实践中逐步形成的。
六、勘误
本书各章理论教学内容由高小鹏负责,涉及实践性教学内容由万寒负责。由于作者水平有限,书中难免有不当甚至错误之处。读者若发现任何问题,请通过E-mail及时给予反馈,以便再版或再次印刷时进行修正。反馈方式如下:邮件地址:gxp@buaa.edu.cn邮件标题:“计算机组成与实现”勘误
七、致谢
首先我要感谢马殿富老师。
他是系统能力培养的倡导者,也是我编写本书的主要推动者。CPU开发方法中相当多的内容是在与马老师的大量讨论中形成的。无论是担任计算机学院院长期间还是卸任后,马老师都始终高度重视本科教学。在北航新主楼G座1117房间,我们之间进行了难以计数的交流,有争执、有共识、有郁闷、有快乐、有成就、有意义。这些是我们对教育教学持续探究的具体体现,值得永远留念。同样,我要感谢清华大学郑纬民院士,他是本书的主审专家,细致入微地审阅全部书稿,提出了诸多建设性意见,使这本教材更具科学性和先进性。
在此我还要感谢计算机组成课程教学团队:刘旭东、肖利民、栾钟治、杨建磊、万寒。刘老师在曾任学院领导与课程的责任教师期间,不仅一直督促着整个团队持续改进教学内容,而且鼓励我们大胆实施教学改革。肖老师、栾老师和杨老师在教学过程中给予很多意见与建议,这些反馈对于本书的编写是极为宝贵的。另外,本书部分例题的思路与原型甚至就来自他们以往的试题。万老师是我在实践性教学资源建设方面的主要合作者,主导了硬件实验设备的在线化与硬件自动化评测系统的开发工作,带领团队建设了本课程全过程在线教学平台及一大批在线资源,有力贯彻并实现了在线实验的构想。她在各方面都尽心尽力尽责,并在重要时间节点上友情提醒我。
南京航空航天大学计算机学院的冯爱民老师是第一位应用CPU开发方法的外校教师,她阅读了本书部分章节初稿并提出很多好的建议,并多次邀请我给南航培优班学生讲授暑期短训课。曾宇祥是培优班的学生之一,他后来成为了我的研究生,为实验环境建设做了大量工作。他在香港科技大学取得博士学位后又入职学院,现在是我的同事,这令人特别开心。
感谢北航计算机学院上这门课程的学生们。我非常享受与他们的课堂互动,相当多的学生聪明勤奋、有独立思考精神且乐于实践,他们发现了授课内容的一些瑕疵,甚至给出了CPU开发方法的具体改进措施,其中部分已经直接体现在书中了。不仅如此,在他们当中每年都涌现出一批富有责任感与使命感的优秀成员,如刘乾、刘康旭等,直接深度参与课程建设并做出了重要贡献。
高等教育出版社的张龙和刘茜是必须要感谢的。尤其是张龙,因为一些工作的原因,我与他经常见面交流。我发现无论我们讨论什么问题,好像一定少不了他对写作进展的询问。刘茜的工作非常细致周密,而且总能在张龙缺位的时候适时地补位以继续询问写作进展,并以温和但持续的方式保持对写作进程的推动。
最后,我要感谢家人对我的关爱和支持,使我有更多的精力投入本书的写作。这里重点感谢我的父亲和我的女儿。作为一名拥有学术专著和畅销教材的老教授,父亲曾太多次地要求我加快本书的工作,“写完了没有?!”与“什么时候写完?!”就成为父亲生前关于本书与我交流最多的两句话。虽然本书再版一拖再拖,但我仍然希望本书能对父亲有所告慰。另一位是我的女儿,不知为什么貌似也有拖延症。当我批评她拖拖拉拉时,她就会用父亲的那两个问题来拷问我。现在是我火力全开的时候了!
第 1 章 计算机概述
1.1 计算机的应用及其分类
1.2 计算机的基本硬件构成
1.3 计算机的层次结构
1.4 本章小结
第 2 章 数据表示与运算方法
2.1 常见进制及其转换
2.2 字节、字等常用术语
2.3 二进制加法
2.4 整数的二进制表示方法
2.5 浮点数的二进制表示方法
2.6 补码的常见基本运算
2.7 本章小结
第 3 章 计算机指令
3.1 MIPS 指令集概述
3.2 CPU 执行程序的基本原理
3.3 计算器:一个综合案例
3.4 指令格式及其操作数
3.5 指令集与汇编程序
3.6 指令编码
3.7 汇编与反汇编实战
3.8 实验指引
3.9 本章小结
第 4 章 单周期 CPU
4.1 单周期 CPU 设计模型
4.2 数据通路基础部件建模
4.3 构建单周期 CPU 的数据通路
4.4 构建单周期 CPU 的控制器
4.5 集成数据通路与控制器
4.6 单周期 CPU 性能分析
4.7 实验指引
4.8 本章小结
第 5 章 多周期 CPU
5.1 破解关键路径的一般方法
5.2 改造单周期数据通路为多周期数据通路
5.3 指令执行过程与控制信号取值分析
5.4 构建多周期控制器
5.5 多周期 CPU 性能分析
5.6 本章小结
第 6 章 流水线 CPU
6.1 简单的流水线电路
6.2 流水线概述
6.3 流水线数据通路
6.4 流水线控制
6.5 流水线冒险
6.6 性能分析
6.7 3 种 CPU 模型对比
6.8 实验指引
6.9 本章小结
第 7 章 存储层次
7.1 概述
7.2 cache
7.3 虚拟存储
7.4 硬盘
7.5 本章小结
第 8 章 输入输出
8.1 典型的输入输出系统
8.2 总线基础
8.3 I/O 接口基本功能与结构
8.4 程序访问设备
8.5 PCI 总线概述
8.6 PCI 总线实现 P&P 的原理
8.7 中断
8.8 3 种数据传输方式
8.9 异常
8.10 本章小结
第 9 章 集成 MIPS 微系统
9.1 概述
9.2 MIPS 体系结构
9.3 定时概述
9.4 串行通信概述
9.5 完善 CPU 设计
9.6 通过系统桥连接设备
9.7 定时器设计
9.8 MiniUART 设计
9.9 软件开发
9.10 软硬件协同分析
9.11 本章小结

