本書是一本介紹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