步步惊“芯”
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

前言

人看见我

就是看见了父

我就是道路、真理、生命

若不借着我

没有人能到父那里去

——《约翰福音》

现在看来,用上述语句形容1971年诞生的世界上第一款商用微处理器Intel 4004,似乎也是恰当的。从“人类历史上最具革新性的产品之一”(戈登·摩尔语)的4004诞生至今,已过了四十多年,期间,处理器的应用范围不断扩展,渗透到各行各业,浸入人们的日常生活,极大地影响了第五次信息革命的进程。对其自身而言既有“变”也有“不变”,“变”的是处理器的性能,“不变”的是其高高在上的形象,处理器设计制造作为国家信息产业的基石之一,一直都是高科技行业,轻易无法涉足。幸运的是,随着可编程硬件技术的持续发展,如今可以通过编写代码实现处理器,出现了软核处理器,它的出现使得寻常人士也能有机会了解处理器内部实现原理,甚至参与处理器的设计、研发。

软核处理器有很多,比如:NiosII、OR1200、LEON3和OpenSparc等,本书选择OR1200作为分析对象,深度剖析其内部实现,理解其设计思路、工作过程。选择OR1200的原因有两个:一方面OR1200是开源的;另一方面,笔者在学习处理器的过程中有一个体会,那就是“一通百通、融会贯通、取长补短、创新提高”。我们的最终目的是了解处理器的实现原理,不必过多纠结于选择哪个、不选哪个,处理器设计中很多问题都是相通的,深入学习一款处理器,明白其架构,在这个过程中可以找到学习处理器的途径,找到适合自己的学习方法,有了方法,再学其他的处理器时就会顺利很多,所以称为“一通百通”。

分析第一个处理器内部实现时,是抱着学习的态度,学第二个、第三个就应该在头脑中形成一种比较的意识,比较这几种处理器实现相同功能的部分为何会有不同的设计方法,哪一种性能更好,这就称为“融会贯通”。通过前面的两步,我们已经如牛顿那般站在巨人的肩膀上了,学习了各种处理器的设计原理,明白了各自优劣,在自己设计处理器的时候就可以“取长补短”。此外,通过独立思考,或者由于不同设计思路的碰撞,可能会产生新的、更好的设计灵感,是谓“创新提高”。

写作目的

● 寻找一个确定性的世界

我们信科学

我们信逻辑

我们信因果

我们是理工男

科学的、逻辑的、因果的,最终表达的是确定性。恐惧源于未知,人类科技活动的目的就是为了探索未知,消除未知带来的不确定性,努力使得一切都可预测,都是确定性的。当然,现实生活中各种因素使我们个体所接触的物质世界显得如此的不确定。从大的方面讲,对于个人命运、社会变革这些宏大的命题,我们都显得渺小和茫然;从小的方面讲,即使坐在对面的是自己的意中人,因为不知她(他)的心思,从而产生一种对确定性丧失的焦虑和痛苦。这时我们迫切地需要一种满足,一种对确定性存在的满足,进而是一种理想的满足。笔者觉得这也是剖析处理器的魅力,处理器的世界就是一个确定性的世界,从加电的那一刻开始,读指令、执行、再读指令、再执行,一切都是设计好的,精准、无误、确定。即使出现意外,也可以得到一个确定的意外原因。

● 对好奇心的满足

人类进步的推动力量有两个:懒惰、好奇。这不是玩笑,而是很严肃的话题,关于第一点,大家想想洗衣机、电视、麦当劳就很容易理解了。第二点更好理解,看看婴儿打量这个世界的眼神就知道好奇心是人类与生俱来的。为什么太阳东升西落?为什么苹果会掉下来?为什么烧开的水会把壶盖顶起来?……每一个为什么的提出及解答,都使得人类前进了一步。在IT行业,人们会问,为什么可以通过计算机一边听音乐、一边上网、一边看电影?

不同的人会有不同的答案

A君:啊,这还有为什么啊,计算机本来就可以这样啊,不这样还能叫计算机!

B君:这是多线程的效果。

C君:这是操作系统调度的原因。

D君:这是由于处理器在每个时钟中断都会进入时钟中断处理例程,在其中切换进程。

A君的回答天真无邪,基本可以断定这位同学不是IT行业的。其他三位同学的答案一个比一个接近根本、接近底层、接近硬件,但好奇的我们不禁要多问一句:时钟中断是如何发生的?解答这个问题就需要深入处理器内部实现了。

● 对现有教科书的不满

国内大多数计算机方面的教科书,常给人这么一个体会:理论太多、实践太少。操作系统、计算机体系结构、计算机组成原理等课程无不如此。过多的理论、过少的实践,给学生带来的问题是:容易纸上谈兵;对具体知识的印象不深刻;知其然,不知其所以然。因此,笔者想结合一款实用的处理器,深度剖析其内部设计实现,作为现有教科书的一个补充。

适合谁读

● 适合对确定性世界狂热追求者阅读。通过阅读本书,读者将发现,虽然处理器内部十分复杂,但是从加电的那一刻开始,它就按照预定程序运行,每一刻都是可预测的,都是确定性的。

● 适合对处理器内部实现有着强烈好奇心的朋友阅读。本书通过对OR1200处理器的剖析,将使读者全方位了解32位RISC处理器设计。

● 适合不满足于教科书的同学阅读。本书可以作为实践参考书,帮助读者理解书本上抽象的概念,同时培养读者的动手能力。

● 适合正在从事软核处理器开发、设计的人员阅读。本书将提供一些经验、一些好的方法,帮助读者做到事半功倍。

● 适合正在从事嵌入式开发的人员阅读,本书对处理器的一些介绍,有助于嵌入式开发。

内容安排

全书共16章,每章的主要内容如下。

第1 章简单介绍了目前主要的开源软核处理器,并做了对比,然后重点介绍了OR1200的架构、代码组织,并对本书的分析方法进行了说明。

第2章带领读者一步一步建立起实验平台、准备好实验工具,有了平台和工具的帮助,可以更加方便地认识和理解OR1200的内部细节。

第3章剖析了OR1200中的QMEM模块,这是一个快速存储器模块,可以在一个时钟周期内读取其中的指令,同时分析了复位结束后,指令的读取过程,给出了一个理想的取指模型。

第4~9章分别剖析了OR1200中数据处理类指令、特殊寄存器访问类指令、转移类指令、异常处理类指令、乘法/除法类指令和加载存储类指令的处理过程。这些指令也是OR1200支持的全部指令,分析了这些指令的处理过程,也就明白了OR1200处理器中CPU模块的内部结构、工作原理。在第9章最后给出一个完整的OR1200流水线数据通路图,而4~9章中,对每一类指令处理过程的分析都采用相同的方法:首先写一段简单的测试代码,测试代码包含我们即将分析的指令类别中的全部或部分指令,然后使用OR1KSim模拟器查看执行情况,接下来对这一类指令中有代表性的若干条指令采用流水线驱动的方法进行分析,即分析指令处理过程中,在流水线各个阶段引起的信号变化,以及通过这些变化的信号是如何逐步实现指令目标的。

第10章剖析了MMU模块,采用的是情景分析法,即通过分析使用该模块的各种情景及各种情景下模块的工作过程,达到了解该模块原理的目的。

第11章建立了一个基于OR1200的简单SOPC,后续章节将借助该SOPC分析OR1200中的指令Cache、数据Cache等模块。

第12、13章分别剖析了OR1200中的指令Cache、数据Cache,采用的是情景分析法。

第14章剖析了Store Buffer模块,采用的是直接分析源代码的方式。

第15章剖析了OR1200处理器与外部Wishbone总线连接的接口模块WB_BIU,采用的是情景分析法。

第16章剖析了电源管理模块、计时器单元、可编程中断控制器,由于比较简单,采用的都是直接分析源代码的方式。

写作原则

● 不唯上、不唯下,只唯实

要保持质疑,哪怕对方是所谓的权威。本书对OR1200的一些介绍可能与OR1200手册及其他学者的观点不同,比如:本书认为OR1200是三级流水线。OR1200手册上认为是五级流水线,笔者在源代码的剖析中发现这种说法并不充分,在第9 章给出理由以佐证笔者的观点,整本书也是按照三级流水线进行分析的。同时,本书指出了源代码中的一些错误,有些可能是笔误,有些就是设计缺陷(如:QMEM的设计)。

● 像剥洋葱似的,一步步接近核心

OR1200是一个系统、一个整体,各个模块之间的联系很紧密,并且相互影响。最开始,只给出了一种理想情况,也是OR1200 大部分时候的运行情况,后面分析到某些指令、某些场景的时候,会具体分析这些指令、场景是如何影响这个理想情况的。比如:第3 章给出了一个理想的取指过程,在后续章节,当分析系统调用指令l.sys的时候,就会介绍l.sys对这个取指过程的影响;分析转移指令l.bf的时候,就会介绍l.bf对这个取指过程的影响;分析特殊寄存器读指令l.mfspr的时候,就会介绍l.mfspr对这个取指过程的影响。通过这样一步一步的探索,由简到繁,由不求甚解到全面了解,最后揭示得出结论,而不是直接给出结论,再分析得出这个结论的理由。笔者认为前者更符合我们认识事物的规律。

● 依据不同的分析对象使用合适的分析方法

在内容安排中可以发现,本书针对不同的模块,依据具体情况,采用了不同的分析方法,主要有:流水线驱动的分析方法、场景分析法和直接分析源代码的方法。

● 适量重复

在分析过程中,为了直观,本书大量采用了表格化的显示方法,表格中列出了当前阶段的主要变化信号,包括信号的作用说明,其中有很多信号可能在之前的表格中出现过,但笔者仍然在新的表格中重复给出这个信号的作用说明。这样适量的重复,增强了各章之间的独立性,尤其是第5~9章,便于读者选择性阅读。

● 感性与理性结合

除了对代码进行分析,本书还使用ModelSim进行仿真,通过ModelSim仿真结果可以直观地观察到任意时刻处理器内部任一信号的状态,既验证了代码分析的正确性,也使读者加深了印象。

本书特色

(1)国内第一本采用指令驱动分析法、流水线驱动分析法和情景分析法对一款成熟的32位软核处理器进行分析的图书,通过对流水线、MMU和Cache等处理器内部重要功能单元的分析,有效消除了处理器的神秘感。

(2)国内第一本采用实验的方法对处理器设计中的一些重要思想进行阐释的书,如:通过实验,给出了存储操作在Cache存在、Cache不存在时的区别,从而使读者可以更加深刻地体会到Cache的作用。

(3)国内第一本对OR1200处理器进行全面、详细介绍的图书。

阅读方法

针对不同的阅读需要,可以有粗读、精读两种阅读方法。

● 粗读

该方法适合希望快速理解处理器内部工作原理的读者使用,这些读者可能更关心处理器在流水线每个阶段的主要工作,而不关心这个工作是如何实现的。因此,本书在流水线每一个阶段分析结束的时候,都会给出一个表格,列出本阶段变化信号,其中重要的变化信号都使用“加粗斜体 ”来强调,这些重要变化信号的作用就反映了处理器在本阶段的主要工作,读者只需关注每个阶段分析结束时的表格即可,从而达到快速理解处理器内部工作原理之目的。

● 精读

该方法适合不仅希望知道处理器在流水线每个阶段的主要工作是什么,而且希望知道这个工作是如何实现的读者使用。这种方法当然比较辛苦,也比较耗时,然而读书无捷径,任何知识的获取都是要下一番苦功夫的。

引用余秋雨先生的话与读者共勉:

阅读的最大理由是想摆脱平庸

早一天就多一份人生的精彩

迟一天就多一天平庸的困扰

致谢

向OR1200的诸位作者Damjan Lampret、Julius Baxter等致敬,正是由于你们的辛苦工作和无私奉献,为我们打开了一扇窗,有机会进入另一个世界。

笔者第一次与博文视点合作,博文视点干练、敏捷的工作作风给笔者留下了深刻的印象,在此特别感谢孙学瑛老师,正是由于孙老师的出谋划策、辛苦工作才使得本书能够及时发行。

感谢酒泉卫星发射中心通信总站的各位领导、同事,虽然我们处在戈壁滩上,自然条件恶劣,但是我们共同从事的是一项伟大的事业,这一事业将我们紧紧联系在一起。若干年后,当我老得哪儿也去不了的时候,这必定将成为一段珍贵的回忆。

感谢我的好友张世伟老师在百忙之中阅读了本书,并提出许多宝贵的修改意见。

最后,感谢我的爸爸、妈妈、姐姐、姐夫,以及可爱的外甥女,任何成绩的取得都离不开家人的付出,谢谢你们!

笔者学识有限,尽管已通读数次,但仍不能保证书中无一纰漏,欢迎各位读者朋友对本书提出批评、建议,可以通过邮箱leishangwen@163.com与笔者交流。