本书是一本介绍OpenRISC体系结构的图书。通读对本书的阅读,读者不仅可以获得计算机体系结构设计的基础理论知识,还可以掌握动手设计处理器的基本技能,迈入CPU设计的大门。本书的内容大致可分为三部分,即知识储备、实例分析和动手实践。其中第一部分着重介绍了体系结构设计中的概念、并行技术、局部性原理,以及进行计算机体系接结构设计的一般流程。第二部分,以OpenRISC为分析对象,深入分析了开源CPU数据通路、控制通路和存储器层次组织的实际实现,对研究体系结构设计具有很高的现实意义和实际价值。此外本部分还介绍了以OpenRISC为基础的ORPSoC的很多设计细节。第三部分,介绍如何运用前面的积累设计一个简单的RISC核,以及设计的仿真和FPGA验证。
理论精炼实用,深入浅出地阐释了体系结构设计中的重要概念。
分析深入透彻,囊括了OpenRISC所有模块源码及其深层工作机制。
实践身临其境,不仅参考代码和文件完整,还专门设计了配套开发板,极具可操作性。
具备软硬件协同设计能力必读的一本书
《深入理解OpenRISC体系结构》适合想动手设计属于自己的CPU的读者和从事嵌入式开发的技术人员。此外,本书还可作为对计算机体系结构设计感兴趣的电子工程类、自动控制类、计算机类的高年级本科生和研究生的参考用书。
《深入理解OpenRISC体系结构》兼具基础性、系统性和实践性。通过阅读本书,读者可以获得设计CPU所需的理论知识,了解真实CPU内部的运行机制,掌握动手设计CPU的技术技能,轻松跨越软件和硬件之间的知识技能障碍。
Do you want to sell sugared water for the rest of your life? Or do you want to come with me and change the world?(你想用余生卖糖水,还是和我一起来改变世界)——Steven Paul Jobs(史蒂夫·保罗·乔布斯)2002年8月10日,龙芯1号研制成功,打响了我国CPU自主研发的第一枪。从那以后,我国的集成电路设计事业进入飞速发展的快车道,经过十多年的快速发展和从业人员的不懈努力,我国的半导体行业和CPU设计技术有了长足的发展和进步。据统计,2002年,我国半导体产业的市场规模是268.4亿元人民币,到2012年,这一数值已达到3500亿美元, 2002年IC设计产业规模是21.6亿元,到2012年,仅Intel一家公司的年收入就高达500亿美元,比十年前有了数十倍甚至上百倍的增长。伴随着产业规模的快速增长,相关的企业数量、企业规模更是不可同日而语,产业规模和企业规模的不断增长和扩大,必然会增加相关人才需求量。据统计,目前仅上海地区的集成电路人才缺口就高达25万。美国、日本等国家由于高级设计工程师的人力资源成本远高于中国,所以,近年来开始把很多设计工作转移到中国大陆,以降低设计成本,这更加激化了日益增长的产业规模和落后的人才培养之间的矛盾。人才培养和教材建设是其中重要的组成部分,我作为从业者,深感相关书籍编写的迫切性,也希望借本书的出版为我国的集成电路设计事业的发展贡献出自己的一点绵薄之力。
写作原则为了提高本书的质量和价值,在写作时特别注重以下几个方面的工作。
1. 全书组织在全书组织方面力求做到客观和直观。所谓“客观”,是指所述的内容不仅包括OpenRISC相对其他计算机体系结构的优势,也包含其不足,需要进一步完善和改进的方面。“尽信书不如无书”,本书在写作时尽量做到不断章取义,不盲人摸象,完整、全面地展现OpenRISC的真实面貌。所谓“直观”,是指所述内容包括一些重要的、核心的理论概念,更重要的是将所述内容重点放在实际的OpenRISC真实的工作机制方面。尽量以对实际工作机制的具体实现来展示深奥的理论,给读者以“直观”的感觉。
2. 内容主线在写作正文时,争取使所述内容遵循两个主线,即纵向主线和横向主线。首先,纵向主线包括由浅入深、由易入难、由外及里、由虚及实四个方面。由浅入深是指从opencores开始,介绍相关的发展历程,然后依次介绍OR的深层设计细节。由易入难是指先介绍OR的简单模块,然后介绍OR的复杂模块。由外及里是指先介绍OR的外围模块,再介绍OR的核心。最后,由虚及实是指先介绍计算机体系结构设计的重要概念和理论基础,再透彻分析一个现实的开源设计实现,并引导读者自己动手,设计出属于自己的CPU。如果一上来就分析or1200的模块接口,分析指令执行时的仿真波形,而没有宏观的理解,很容易使读者感到迷茫,况且一个只能用仿真工具仿真的系统和实际可以工作的系统也是有很大差距的。其次是横向主线,横向主线的内涵是,对于每个章节,按照先概念后阐述,先理论后实践的顺序进行介绍和描述。
3. 参考文献体系结构的设计是一项复杂的工作,涉及的知识面极广,一本书不可能包含所有的细节,所以,为了进一步提高本书的使用价值,在附录E中,笔者将那些有参考价值的链接列了出来。读者可以根据自己的实际情况,选择部分或全部内容来仔细研究。
4. 习题本书在每章的结束部分都设计了一定量的习题。习题的设计并没有想象得那么简单。笔者认为好的习题必须具备三个特性。首先要有代表性,即覆盖本章的学习重点。其次要有提升性,即既要基于本章内容,又要稍有一些提升。第三,要有实践性,即能够锻炼工程操作能力。希望本书的习题成功地做到了这三点。
本书特点如果把一个开源CPU芯片比作一座大厦的话,那么体系结构设计的基本理论知识就是大厦的骨架,而其开放的RTL源代码就是建造大厦所使用的砖瓦。 “罗马不是一天建成的”,对于普通的开发者来说,单凭一个人的力量,要建造一座大厦的确不大可能,但如果要建造一个简陋的茅屋就变得可行了。要动手建造自己的“茅屋”,合理的方式是先学习和研究大厦的骨架,而不是整天在大厦里面转悠参观。也许别人的高楼大厦让人震撼,但自己的茅草屋会带来温暖。
基于上述考虑,本书具有如下几个特点:
? 基础性。“合抱之木,生于毫末;九层之台,起于垒土;千里之行,始于足下。”多么困难的事情也要一步一步地做,“一口吃不成个胖子”,计算机体系结构设计工作虽然比较复杂,技术要求比较高,但也是由一件一件小的工作做起的。所以本书十分注重基础的普及,使读者能够轻松地迈出进行体系结构设计的第一步。俗话说,“良好的开始是成功的一半”,这句话即强调了基础的重要性。
? 系统性。“上可九天揽月,下可五洋捉鳖”。所谓“上可九天揽月”指的是在结构设计过程中要充分理解与体系结构相关的应用程序、操作系统、驱动程序、编译器的原理和工作机制,所谓“下可五洋捉鳖”指的是在结构设计过程中要充分认识到所设计的模块的硬件电路和版图。
? 实践性。“work on paper”固然很重要,但更重要的是“work on silicon”。计算机体系结构的设计是一项重视工程实践的工作。有人曾说过“即使把关于体系结构设计的所有论文和文章都烧掉,也不会对当前的产业造成什么影响”。所以本书在进行内容组织时,不仅有关于体系结构设计的理论知识的介绍,也非常注重工程实践。避免“纸上谈兵”,避免“有勇无谋”。
内容组织本书以对一个真实的CPU——OpenRISC的RTL实现深入分析为核心,从介绍计算机体系结构设计的基础知识开始,到介绍如何动手设计属于自己的CPU结束。读者通过阅读本书不仅能切实学到计算机体系结构设计的理论知识,还能实际掌握进行FPGA/ASIC等集成电路设计的工程技术能力,内外兼修。
本书的内容大致可分为三部分,即知识储备、实例分析和动手实践。第一部分包括第1~2章;第二部分包括第3~5章;第三部分包括第6章。其中第一部分着重介绍了体系结构设计中的概念、并行技术、局部性原理及进行计算机体系结构设计的一般流程。第二部分以OpenRISC为分析对象,深入分析这个开源CPU数据通路,控制系统和存储器层次组织的实际实现,对研究体系结构设计具有很高的现实意义和实际价值。第三部分,经过前面的理论储备和实例分析,最后指导读者设计一个简单的RISC core—tiny_core,本部分的内容至关重要。
读者对象与阅读方法全书按照先理论、后观摩、再实践的顺序组织。
适合急于了解和掌握体系结构设计理论基础的读者。本书对or1200进行分析时以丰富的理论作为支撑,可以让你在领略or1200代码实现精妙的同时,获得理论上的升华。
适合对开源CPU内部实现充满好奇的读者。本书用大量的篇幅对or1200以及ORPSoC的所有模块细节进行了深入的分析,使CPU设计细节完全展现在读者眼前。
适合想动手设计属于自己的CPU的读者。本书各章在介绍完理论基础和分析完or1200具体实现之后,都有一个动手实践的项目,项目代码均经过仿真和验证,此外,第6章给出了一个简单的CPU设计实例,读者可根据自己的需要进行模块增减,立刻拥有属于自己的CPU。
适合从事嵌入式开发的技术人员。嵌入式开发工作中很多时候会涉及底层开发,而了解CPU的运行机制势必会有助于嵌入式的开发。
此外,本书还可作为对计算机体系结构设计感兴趣的电子工程类、自动控制类、计算机类的高年级本科生和研究生的教学用书。
致谢一本书的面世,是一项耗时耗力的工作。从策划、构思到写作、出版,整个过程凝聚了太多人的心血和汗水。这里首先要感谢机械工业出版社华章公司的策划编辑张国强先生,没有他,本书现在就不可能出现在你面前;其次还要感谢我在计算所计算机体系结构国家重点实验室的同事们,他们都是体系结构设计方面的专家,他们不仅有丰富的理论知识,还有扎实的技术功底,在我有疑问时,他们总能给我专业透彻的解答和帮助,让我醍醐灌顶;最后还要感谢我的妻子张金艳女士,没有她无微不至的关心和照顾,我不可能坚持写完本书,“军功章上有我的一半,也有她的一半”。由于篇幅限制,请原谅我无法把对本书有贡献的所有人的名字全部列在这里,但这并不意味着他们的工作微不足道。
由于计算机体系结构设计这个领域的技术发展迅速,涉及面极广,再加上作者水平有限和写作时间紧张,本书中难免有不当和疏漏之处,非常欢迎阅读本书的专家和学者给予批评指正。
谨以此书献给那些正在从事和想要从事计算机体系结构设计的人们!
甄建勇2014年7月中国科学院计算技术研究所,计算机体系结构国家重点实验室
甄建勇,嵌入式驱动工程师,芯片设计工程师,曾在中科院体系结构重点实验室工作。现供职君正集成电路,负责芯片架构设计。长期专注于嵌入式设备驱动开发和数字电路设计,并积累了大量理论和工程经验。一直以开源软件和开源硬件的发展为己任,是开源处理器OpenRISC的实践者和推动者。2010年开始关注Opencores组织的OpenRISC开源体系结构,并在2013年年初在CSDN网站开设了OpenRISC专栏,以“关注OpenRISC开源体系结构的发展,研究OpenRISC的Verilog HDL源码,讨论学习OpenRISC中遇到的各种问题”为宗旨,短时间内就吸引了成千上万的点击量和回复。
前言
第1章 绪 论 / 1
1.1 概述 / 1
1.2 计算机漫谈 / 3
1.2.1 十进制计算机 / 3
1.2.2 二进制计算机 / 7
1.3 计算机体系结构 / 12
1.3.1 图灵与图灵机 / 12
1.3.2 冯·诺依曼与冯·诺依曼体系结构 / 14
1.3.3 改进的哈佛体系结构 / 17
1.3.4 发展趋势 / 19
1.4 并行技术 / 20
1.4.1 流水线 / 20
1.4.2 乱序 / 22
1.4.4 单指令多数据流 / 22
1.4.5 同时多线程 / 23
1.4.6 单芯片多处理器 / 23
1.4.7 对称多处理器 / 25
1.5 局部性原理 / 25
1.6 计算机的评价 / 26
1.7 设计流程 / 27
1.7.1 分析 / 27
1.7.2 模拟器 / 28
1.7.3 FPGA设计 / 29
1.7.4 ASIC / 35
1.8 OpenRISC / 36
1.8.1 概述 / 36
1.8.2 OpenRISC寄存器集 / 37
1.8.3 OpenRISC指令集 / 41
1.9 小结 / 41
1.10 习题 / 42
第2章 基于OpenRISC的开发 / 43
2.1 概述 / 44
2.2 项目描述 / 44
2.3 开发环境的构建 / 44
2.3.1 开发环境的组成 / 44
2.3.2 开发环境的选择与安装 / 46
2.4 硬件的开发 / 51
2.4.1 模块划分和编码实现 / 51
2.4.2 功能仿真与时序仿真 / 51
2.5 驱动程序的开发 / 55
2.6 FPGA板级验证 / 66
2.7 硬件与软件的比较 / 66
2.8 ORPSoC与or1200 / 70
2.8.1 ORPSoC架构分析 / 70
2.8.2 ORPSoC的启动过程 / 73
2.8.3 or1200 / 83
2.9 小结 / 86
2.10 习题 / 86
第3章 数据通路设计 / 87
3.1 概述 / 87
3.2 数据通路 / 87
3.3 OpenRISC的数据通路整体架构分析 / 88
3.4 取指 / 89
3.5 译码 / 97
3.6 执行 / 118
3.6.1 运算部件基础 / 118
3.6.2 or1200的运算部件 / 127
3.7 访存 / 135
3.7.1 流水线的访存阶段 / 135
3.7.2 or1200访存阶段的具体实现分析 / 136
3.8 写回 / 142
3.8.1 or1200写回阶段整体功能 / 142
3.8.2 or1200写回阶段具体实现代码分析 / 143
3.9 设计一个简单的除法器 / 150
3.10 小结 / 156
3.11 习题 / 157
第4章 控制通路设计 / 158
4.1 概述 / 158
4.2 控制通路的复杂性 / 158
4.3 OR的控制通路设计分析 / 160
4.3.1 整体介绍 / 160
4.3.2 sprs模块 / 160
4.4 OR的异常处理 / 172
4.4.1 except模块 / 172
4.4.2 freeze模块 / 187
4.5 OR的调试系统 / 190
4.5.1 调试方案的分类 / 190
4.5.2 advanced debug system / 192
4.5.3 我的调试系统 / 195
4.5.4 JTAG模块 / 201
4.6 基于or1200的中断实验 / 223
4.7 小结 / 239
4.8 习题 / 239
第5章 存储器组织 / 240
5.1 概述 / 240
5.2 TLB与Cache / 241
5.2.1 概述 / 241
5.2.2 TLB / 243
5.2.3 Cache / 250
5.3 OR的存储器组织 / 256
5.3.1 OR的MMU / 257
5.3.2 OR的Cache / 265
5.4 自己设计一个简单的Cache / 292
5.5 小结 / 293
5.6 习题 / 294
第6章 自己设计一个简单的CPU / 295
6.1 概述 / 295
6.2 层次建模 / 295
6.3 可综合代码风格 / 299
6.4 一个简单CPU的设计、实现、仿真与综合 / 300
6.4.1 架构设计 / 301
6.4.2 模块划分 / 301
6.4.3 模块划分与接口定义 / 302
6.4.4 RTL实现 / 303
6.4.5 ModelSim仿真 / 326
6.4.6 综合 / 331
6.4.7 改进及优化 / 332
6.4.8 tiny_core的指令集 / 333
6.5 小结 / 334
6.6 习题 / 334
附录A 常用公式和定律 / 335
附录B wishbone / 337
附录C 状态机的4种写法 / 340
附录D 跨时钟域信号的同步 / 352
附录E 推荐阅读 / 362
参考文献 / 364
后记 / 365