這是一本強(qiáng)調(diào)從實(shí)踐中學(xué)理念的計(jì)算機(jī)體系結(jié)構(gòu)的教材。作者結(jié)合自身從事國產(chǎn)龍芯高性能通用處理器研制的實(shí)踐,以準(zhǔn)確精練、生動(dòng)活潑的語言,將計(jì)算機(jī)體系結(jié)構(gòu)的知識(shí)深入淺出地傳授給讀者。
全書共13章,第1~4章從計(jì)算機(jī)體系結(jié)構(gòu)的研究?jī)?nèi)容和發(fā)展趨勢(shì)、二進(jìn)制和邏輯電路、指令系統(tǒng)結(jié)構(gòu)等方面介紹計(jì)算機(jī)體系結(jié)構(gòu)的基礎(chǔ)內(nèi)容。第5~7章從靜態(tài)流水線、動(dòng)態(tài)流水線、多發(fā)射數(shù)據(jù)通路等方面介紹指令流水線結(jié)構(gòu)。第8~11章從轉(zhuǎn)移預(yù)測(cè)、功能部件、高速緩存、存儲(chǔ)管理等方面介紹處理器的模塊級(jí)結(jié)構(gòu)。第12章介紹多處理器結(jié)構(gòu)。第13章主要介紹作者在龍芯處理器設(shè)計(jì)過程中的經(jīng)驗(yàn)教訓(xùn)。
本書適合作為高等學(xué)校計(jì)算機(jī)專業(yè)的高年級(jí)本科生、研究生的教材,也可以作為相關(guān)工程技術(shù)人員的學(xué)習(xí)參考書。
本書是胡偉武老師2011年在清華大學(xué)出版社出版的《計(jì)算機(jī)體系結(jié)構(gòu)》一書的新版。本書是國內(nèi)從事微處理器設(shè)計(jì)的一線科研人員撰寫的教材,充分結(jié)合了作者從事龍芯處理器研制的科研結(jié)晶和體會(huì)。中科院計(jì)算所胡偉武研究員是我國自主通用龍芯CPU的總設(shè)計(jì)師,在處理器設(shè)計(jì)方面具有豐富的理論知識(shí)和工程經(jīng)驗(yàn)。本書具有兩個(gè)鮮明的特點(diǎn): 內(nèi)容精練而實(shí)用,表述清楚而易懂。本書適合作為高等學(xué)校計(jì)算機(jī)專業(yè)的高年級(jí)本科生、研究生的教材,也可以作為相關(guān)工程技術(shù)人員的學(xué)習(xí)參考書。
2002年初,我剛開始龍芯處理器的研制沒多久,中科院計(jì)算技術(shù)研究所負(fù)責(zé)研究生教育的徐志偉老師就找我說有沒有可能在計(jì)算技術(shù)研究所開設(shè)一門計(jì)算機(jī)系統(tǒng)結(jié)構(gòu)方面的“大課程”。他進(jìn)一步解釋說,在國外很好的學(xué)校經(jīng)常有這樣的課程,讓學(xué)生每天都忙得“死去活來”,熬夜到凌晨?jī)扇c(diǎn)才能完成作業(yè),但從中還“真正能學(xué)到東西”。我便欣然應(yīng)允。
我從2002年秋季開始給計(jì)算技術(shù)研究所博士生開設(shè)“處理器設(shè)計(jì)”課程,講課后才知道給學(xué)生上課比做研究難。一方面是因?yàn)槭谡n比做研究在內(nèi)容上要求更加全面系統(tǒng),尤其是講體系結(jié)構(gòu)課程,除了體系結(jié)構(gòu)本身外,還需要對(duì)操作系統(tǒng)、編譯器原理、晶體管原理和基本工藝流程等相關(guān)領(lǐng)域的知識(shí)融會(huì)貫通;另一方面做研究時(shí)很多內(nèi)容只要宏觀了解就可以了,但授課就必須對(duì)其搞清楚,不清楚就不敢講或者講起來不生動(dòng)。例如,在龍芯處理器設(shè)計(jì)時(shí)我安排了專門的人負(fù)責(zé)浮點(diǎn)模塊,因?yàn)樽约簩?duì)于IEEE的浮點(diǎn)數(shù)據(jù)格式標(biāo)準(zhǔn)只是大致了解,但要給學(xué)生講自己就得搞清楚;又如,在講TLB時(shí),就得搞清楚操作系統(tǒng)的存儲(chǔ)管理,否則越講學(xué)生就越糊涂;谏鲜鲈,這門課程幾乎花掉了我前3年的所有業(yè)余時(shí)間,每一講都至少需要花一周的時(shí)間做準(zhǔn)備,而且每一年都要對(duì)講義做大幅度調(diào)整,成為一個(gè)沉重的負(fù)擔(dān)。經(jīng)過3年的積累,課程的章節(jié)框架才基本定型。
在此基礎(chǔ)上,2005年開始在中國科學(xué)院研究生院同時(shí)針對(duì)碩士和博士講授“高性能計(jì)算機(jī)系統(tǒng)結(jié)構(gòu)”課程。碩士和博士課程的主要區(qū)別在于作業(yè)和考試內(nèi)容不同。由于要針對(duì)碩士講授,因此在基礎(chǔ)性方面又做了補(bǔ)充和加強(qiáng),并根據(jù)授課的實(shí)際需要每年再對(duì)各章的內(nèi)容進(jìn)行了調(diào)整和完善。到2008年,準(zhǔn)備根據(jù)講課的內(nèi)容出版一部教材,因此對(duì)2008年的講授進(jìn)行了錄音整理。為了增加教材的可讀性和趣味性,在整理教材時(shí)保持了第一人稱的形式,同時(shí)盡量做到句子及內(nèi)容的簡(jiǎn)潔和嚴(yán)謹(jǐn)。
本教材具有如下幾個(gè)特點(diǎn)。
一是基礎(chǔ)性,在快速變化的體系結(jié)構(gòu)學(xué)科中總結(jié)出其中不變的原理性東西。計(jì)算機(jī)體系結(jié)構(gòu)發(fā)展得很快,不斷有新的內(nèi)容出現(xiàn),但幾十年來積淀下來的東西并不多。關(guān)鍵是要發(fā)現(xiàn)快速變化中不變的原理性的東西,如果掌握了這些原理,就能以不變應(yīng)萬變。因此,在教材編寫時(shí)“不趕時(shí)髦”且“不跟風(fēng)”,把計(jì)算機(jī)體系結(jié)構(gòu)在幾十年的發(fā)展過程中形成的里程碑的工作講透,重點(diǎn)介紹具體結(jié)構(gòu)背后的原理和思路。
二是系統(tǒng)性,做到對(duì)體系結(jié)構(gòu)、基礎(chǔ)軟件、電路和器件的融會(huì)貫通。根據(jù)我自己從事處理器設(shè)計(jì)的經(jīng)驗(yàn),一個(gè)體系結(jié)構(gòu)的設(shè)計(jì)者就像一個(gè)帶兵打仗的將領(lǐng),結(jié)構(gòu)設(shè)計(jì)就是“排兵布陣”。更重要的是要“上知天文,下知地理”。所謂“上知天文”,指的是在結(jié)構(gòu)設(shè)計(jì)過程中要充分地了解與處理器聯(lián)系緊密的操作系統(tǒng)、編譯器以及應(yīng)用程序的原理和行為;所謂“下知地理”,指的是在做結(jié)構(gòu)設(shè)計(jì)時(shí)要充分考慮到所設(shè)計(jì)的模塊和功能部件的電路和版圖結(jié)構(gòu)。要做到一以貫之。例如在打字時(shí),要很清楚地知道從按鍵盤到屏幕上出現(xiàn)一個(gè)字的過程中應(yīng)用程序、操作系統(tǒng)、硬件、芯片、晶體管等的完整的交互行為。
三是實(shí)踐性,做“在硅上工作(work on silicon)”的設(shè)計(jì)。在龍芯處理器的研發(fā)中深刻感覺到,計(jì)算機(jī)體系結(jié)構(gòu)是實(shí)踐性很強(qiáng)的學(xué)科。因此,在本教材的內(nèi)容中充分結(jié)合了龍芯處理器研發(fā)過程中獲得的體驗(yàn),強(qiáng)調(diào)要做work on silicon的設(shè)計(jì),而不要停留在work on paper的設(shè)計(jì)上。本教材的最后一章“實(shí)踐是最好的課堂”,通過龍芯研制過程中發(fā)生的10個(gè)故事來進(jìn)一步強(qiáng)調(diào)學(xué)習(xí)計(jì)算機(jī)體系結(jié)構(gòu)設(shè)計(jì)實(shí)踐的重要性。此外,在教材的習(xí)題部分安排了不少需要學(xué)生動(dòng)手實(shí)踐的內(nèi)容。這些習(xí)題是對(duì)內(nèi)容的延伸,需要學(xué)生在領(lǐng)會(huì)教材內(nèi)容的精神之后進(jìn)行發(fā)揮。
由于體系結(jié)構(gòu)這門學(xué)科發(fā)展迅速,涉及面廣,因此本教材中難免有不當(dāng)和疏漏之處,敬請(qǐng)批評(píng)指正。同時(shí)我也意識(shí)到,以活潑生動(dòng)的形式編寫教材是一種大膽的嘗試,需要面臨很多挑戰(zhàn)。因此,非常歡迎使用本教材的教師和學(xué)生對(duì)本教材提出寶貴意見。
胡偉武2017年暑期前言計(jì)算機(jī)體系結(jié)構(gòu)(第2版)
第1章引言1
1.1什么是CPU1
1.2一以貫之3
1.3本書的內(nèi)容4
1.4本書的習(xí)題與參考文獻(xiàn)說明5
第2章計(jì)算機(jī)系統(tǒng)結(jié)構(gòu)基礎(chǔ)6
2.1什么是計(jì)算機(jī)6
2.2計(jì)算機(jī)的基本組成7
2.3計(jì)算機(jī)系統(tǒng)結(jié)構(gòu)的發(fā)展9
2.4摩爾定律和工藝的發(fā)展11
2.5計(jì)算機(jī)應(yīng)用的發(fā)展趨勢(shì)14
2.6計(jì)算機(jī)系統(tǒng)結(jié)構(gòu)發(fā)展趨勢(shì)15
2.7多核結(jié)構(gòu)的發(fā)展及其面臨的問題18
2.8衡量計(jì)算機(jī)的指標(biāo)21
2.9性能評(píng)價(jià)22
2.10成本評(píng)價(jià)28
2.11功耗評(píng)價(jià)30
2.12本章小結(jié)32
習(xí)題32
第3章二進(jìn)制與邏輯電路34
3.1計(jì)算機(jī)中數(shù)的表示34
3.2MOS管工作原理37
3.3MOS基本工藝40
3.4邏輯電路44
3.5CMOS電路的延遲47
3.6Verilog語言49
3.7本章小結(jié)52
習(xí)題52目錄計(jì)算機(jī)體系結(jié)構(gòu)(第2版)第4章指令系統(tǒng)結(jié)構(gòu)55
4.1指令系統(tǒng)結(jié)構(gòu)的設(shè)計(jì)原則55
4.2影響指令系統(tǒng)結(jié)構(gòu)設(shè)計(jì)的因素56
4.3指令系統(tǒng)的分類58
4.4指令系統(tǒng)的組成部分60
4.5RISC指令系統(tǒng)結(jié)構(gòu)62
4.6RISC的發(fā)展歷史64
4.7不同RISC指令系統(tǒng)結(jié)構(gòu)的比較65
4.8本章小結(jié)71
習(xí)題71
第5章靜態(tài)流水線73
5.1數(shù)據(jù)通路設(shè)計(jì)74
5.2控制邏輯設(shè)計(jì)76
5.3時(shí)序78
5.4流水線技術(shù)79
5.5指令相關(guān)和流水線沖突83
5.6流水線的前遞技術(shù)86
5.7流水線和例外89
5.8多功能部件與多拍操作90
5.9本章小結(jié)93
習(xí)題93
第6章動(dòng)態(tài)流水線102
6.1影響流水線效率的因素102
6.2指令調(diào)度技術(shù)103
6.3動(dòng)態(tài)調(diào)度原理106
6.4Tomasulo算法109
6.5例外與動(dòng)態(tài)流水線114
6.6本章小結(jié)122
習(xí)題123
第7章多發(fā)射數(shù)據(jù)通路127
7.1指令級(jí)并行技術(shù)127
7.2保留站的組織128
7.3保留站和寄存器的關(guān)系131
7.4重命名寄存器的組織133
7.5亂序執(zhí)行的流水線通路137
7.6多發(fā)射結(jié)構(gòu)139
7.7龍芯2號(hào)多發(fā)射結(jié)構(gòu)簡(jiǎn)介140
7.8本章小結(jié)142
習(xí)題143
第8章轉(zhuǎn)移預(yù)測(cè)146
8.1轉(zhuǎn)移指令146
8.2程序的轉(zhuǎn)移行為148
8.3軟件方法解決控制相關(guān)151
8.4硬件轉(zhuǎn)移預(yù)測(cè)技術(shù)155
8.5一些典型商用處理器的分支預(yù)測(cè)機(jī)制162
8.6本章小結(jié)164
習(xí)題164
第9章功能部件167
9.1定點(diǎn)補(bǔ)碼加法器167
9.2龍芯1號(hào)的ALU設(shè)計(jì)172
9.3定點(diǎn)補(bǔ)碼乘法器176
9.4本章小結(jié)183
習(xí)題183
第10章高速緩存185
10.1存儲(chǔ)層次185
10.2cache結(jié)構(gòu)187
10.3cache性能和優(yōu)化191
10.4常見處理器的存儲(chǔ)層次199
10.5本章小結(jié)201
習(xí)題202
第11章存儲(chǔ)管理204
11.1虛擬存儲(chǔ)的基本原理204
11.2MIPS處理器對(duì)虛存系統(tǒng)的支持207
11.3Linux操作系統(tǒng)的存儲(chǔ)管理210
11.4TLB的性能分析和優(yōu)化215
11.5本章小結(jié)217
習(xí)題217
第12章多處理器系統(tǒng)219
12.1共享存儲(chǔ)與消息傳遞系統(tǒng)219
12.2常見的共享存儲(chǔ)系統(tǒng)223
12.3共享存儲(chǔ)系統(tǒng)的指令相關(guān)225
12.4共享存儲(chǔ)系統(tǒng)的訪存事件次序228
12.5存儲(chǔ)一致性模型229
12.6cache一致性協(xié)議233
12.7本章小結(jié)238
習(xí)題238
第13章實(shí)踐是最好的課堂240
13.1龍芯處理器簡(jiǎn)介240
13.2硅是檢驗(yàn)結(jié)構(gòu)設(shè)計(jì)的唯一標(biāo)準(zhǔn)244
13.3設(shè)計(jì)要統(tǒng)籌兼顧251
13.4設(shè)計(jì)要重點(diǎn)突出257
13.5皮體系結(jié)構(gòu)設(shè)計(jì)260
13.6本章小結(jié)261
參考文獻(xiàn)262
后記265
第5章靜態(tài)流水線前4章分別介紹了計(jì)算機(jī)系統(tǒng)結(jié)構(gòu)的基本概念、二進(jìn)制和邏輯電路以及指令系統(tǒng)結(jié)構(gòu)。有了這些基礎(chǔ),這一章以一個(gè)簡(jiǎn)單的CPU為例介紹CPU的流水線設(shè)計(jì),后面2章再介紹比較復(fù)雜的流水線和多發(fā)射結(jié)構(gòu)。
我們從MIPS指令集揀選部分代表性的指令作為簡(jiǎn)單CPU需要實(shí)現(xiàn)的指令集,其中指令及其編碼列舉在表5.1中,指令的具體含義及指令集的其他定義請(qǐng)參看本書的第4章。
表5.1簡(jiǎn)單CPU指令和指令編碼t第5章靜態(tài)流水線計(jì)算機(jī)體系結(jié)構(gòu)(第2版)5.1數(shù)據(jù)通路設(shè)計(jì)基于指令系統(tǒng)的定義,先設(shè)計(jì)這個(gè)簡(jiǎn)單CPU的數(shù)據(jù)通路,其主要模塊包括一個(gè)指令存儲(chǔ)器、一個(gè)數(shù)據(jù)存儲(chǔ)器、一個(gè)通用寄存器堆、一個(gè)指令寄存器(IR)和一個(gè)程序計(jì)數(shù)器(PC),如圖5.1所示。
圖5.1主要數(shù)據(jù)通路CPU工作時(shí),首先用PC作為地址去指令存儲(chǔ)器中取指令。PC的值是怎么來的呢?有兩種情況,第一種是執(zhí)行完一條指令順序執(zhí)行時(shí),下一條指令的PC(Next PC,NPC)的值是PC+4,因?yàn)橹噶钫?個(gè)字節(jié);第二種是執(zhí)行轉(zhuǎn)移指令時(shí)NPC值是延遲槽PC+offset。因?yàn)檠舆t槽指令總是需要執(zhí)行的,所以當(dāng)前指令是跳轉(zhuǎn)的轉(zhuǎn)移指令時(shí)并不能立即修改PC為跳轉(zhuǎn)目標(biāo),只能是延遲槽指令在CPU里時(shí)才能修改。這樣,生成NPC的部分有一個(gè)2選1邏輯根據(jù)轉(zhuǎn)移指令跳轉(zhuǎn)是否成功來選擇offset值和4,選擇之后再由一個(gè)加法器跟PC的值相加,并送到PC中。然后,根據(jù)這個(gè)PC的值到指令存儲(chǔ)器取指,指令取出來以后放到指令寄存器IR中。IR中的指令包含操作碼(op)和功能碼(func),目標(biāo)寄存器號(hào)(rd),兩個(gè)源寄存器號(hào)(rs、rt),還有立即數(shù)/偏移量(imm),其中立即數(shù)/偏移量有16位,與rd和func域有部分重疊。
通用寄存器堆、運(yùn)算部件和存儲(chǔ)器的通路由IR中的域統(tǒng)一控制。通用寄存器的內(nèi)部電路結(jié)構(gòu)如圖5.2所示,其讀地址RA1通過控制一個(gè)32選1邏輯從32組寄存器中選出一組將其值輸出至RD1,同樣的RA2控制另一個(gè)32選1邏輯從32組寄存器中選出另一組將其值輸出至RD2;當(dāng)發(fā)生寫操作時(shí),寫地址WA1通過譯碼器得到各組的選擇信號(hào)再與上全局寫使能WE1形成每一組寄存器的寫使能,用來控制將寫入數(shù)據(jù)WD1寫入到相應(yīng)的寄存器組中。IR的rs域連接到通用寄存器堆的讀端口1的地址輸入,從中選出一個(gè)將其值送到ALU的其中一端;IR的rt域連接到通用寄存器堆的讀端口2的地址輸入,從中也選出一個(gè)值來,并和符號(hào)擴(kuò)展后的立即數(shù)/偏移量2選1后送到ALU的另外一端。這是因?yàn)锳DDIU、LW和SW指令不用寄存器讀出的值作為第二個(gè)源操作數(shù)進(jìn)行運(yùn)算,而是用指令中的立即數(shù)/偏移量進(jìn)行運(yùn)算。轉(zhuǎn)移指令也用到立即數(shù)/偏移量,但僅在計(jì)算NPC時(shí)使用,這里我們使用獨(dú)立的加法器進(jìn)行NPC的計(jì)算。ALU完成計(jì)算操作之后要把算術(shù)運(yùn)算或邏輯運(yùn)算的結(jié)果寫回到通用寄存器堆里去,具體寫回到哪個(gè)寄存器由指令中的rd或rt域來控制,目標(biāo)連接到通用寄存器堆的寫端口1的地址輸入,進(jìn)而選中一個(gè)寄存器并打開其寫使能。對(duì)于LW指令來說,其目標(biāo)寄存器號(hào)來自于指令的rt域而非其他指令的rd域,所以需要通過一個(gè)2選1邏輯選擇出目標(biāo)寄存器號(hào)。訪存指令LW和SW把ALU的運(yùn)算結(jié)果作為訪存地址。LW從數(shù)據(jù)存儲(chǔ)器中把值取出,然后寫回到目標(biāo)寄存器去,所以寫入通用寄存器堆的數(shù)據(jù)也需要通過一個(gè)2選1邏輯從ALU運(yùn)算結(jié)果和數(shù)據(jù)存儲(chǔ)器讀出結(jié)果之間選擇。SW將寄存器堆中讀出的值寫入到數(shù)據(jù)存儲(chǔ)器中。
圖5.2寄存器堆電路結(jié)構(gòu)上述描述實(shí)現(xiàn)了這個(gè)CPU中的主要數(shù)據(jù)通路,并涵蓋了指令系統(tǒng)中定義的所有指令,但沒有描述這個(gè)通路的控制邏輯部分。下面我們一步一步地往里加?xùn)|西。
5.2控制邏輯設(shè)計(jì)實(shí)現(xiàn)了CPU的數(shù)據(jù)通路之后,下面先添加CPU的控制邏輯。控制邏輯根據(jù)指令的要求控制數(shù)據(jù)在數(shù)據(jù)通路中流動(dòng)。
從上述數(shù)據(jù)通路可以看出,為了讓數(shù)據(jù)根據(jù)指令的要求在數(shù)據(jù)通路中正確地流動(dòng),需要對(duì)以下通路進(jìn)行控制: 計(jì)算PC的加法器是否需要看轉(zhuǎn)移跳轉(zhuǎn)情況決定是加4還是加offset(C1);是選擇寄存器的值還是選擇立即數(shù)作為ALU的第二個(gè)源操作數(shù)(C2);ALU做什么運(yùn)算(ALUOp);運(yùn)算結(jié)果是把ALU的運(yùn)算結(jié)果寫回,還是把從數(shù)據(jù)存儲(chǔ)器讀出來的結(jié)果寫回(C3);目的寄存器號(hào)是來自指令的rd域還是rt域(C4);什么情況下使能通用寄存器堆的寫使能(C5),因?yàn)橛幸恍┲噶钍遣粚懠拇嫫鞯,例如SW指令和轉(zhuǎn)移指令;什么情況下使能數(shù)據(jù)存儲(chǔ)的寫使能(C6)。
根據(jù)指令的功能和數(shù)據(jù)通路的情況,表5.2給出了CPU中控制邏輯的真值表,其中X表示是0或1無所謂。
……