CPU 設計實戰

汪文祥 邢金璋 著

  • 出版商: 機械工業
  • 出版日期: 2021-03-01
  • 售價: $594
  • 貴賓價: 9.5$564
  • 語言: 簡體中文
  • 頁數: 376
  • 裝訂: 平裝
  • ISBN: 7111674138
  • ISBN-13: 9787111674139
  • 立即出貨

買這商品的人也買了...

商品描述

本書的目標是幫助讀者循序漸進地完成從單周期CPU到帶有流水線、指令、高速緩存等功能的CPU設計。有興趣的讀者還可以在此基礎上進一步添加指令和功能,設計出接近真實產品的CPU。在學習的過程中,我們有如下建議:
不斷學習CPU設計與開發應具備的電腦組成與體系結構、FPGA設計、Verilog、軟硬件平臺等方面的基礎知識。
認真學習各章理論部分的知識,然後按照各章“任務與實踐”部分的指導進行動手實踐。“任務與實踐”部分所需的學習資源請登錄華章網站下載。
充分利用網絡資源進行交流和學習。讀者可以登錄“龍芯杯”全國大學生系統能力培養大賽網站(http://cpu.csc-he.com/index.html)學習歷屆優秀參賽隊的CPU設計方案,也可以從其他渠道獲得相關的學習資料。
  自己動手設計CPU是綜合運用知識、培養工程思維和能力的工作,過程極具挑戰性,但設計完成時你將獲得極大的成就感,期待你能設計出自己的CPU!

長期以來,我國一直面臨CPU人才短缺的困境。一方面,CPU芯片雖小,但它是一個復雜的大型系統,涉及軟件、硬件的方方面面,因此設計CPU是一項工程量極大的工作。另一方面,CPU設計考驗設計者綜合運用知識和經驗的能力,即使學過CPU設計有關的所有課程,要設計出一個完整的CPU也是很有難度的,更不用說在設計過程中要根據實踐經驗對各種工程細節進行權衡和考量。
本書作者從事CPU產品自主研發工作近20年,在CPU設計方面積累了豐富的經驗,並一直嘗試在教學過程中將這些經驗轉化為教學內容,探索一條培養CPU設計人才的行之有效的途徑。本書是作者在這項工作上的總結。
本書特點:
按照CPU設計的實際工程過程安排內容。本書分為三個部分:第一部分從工程化的視角介紹業界進行CPU研發的過程,並且提煉出完成CPU設計應具備的FPGA設計、Verilog、軟硬件平臺等方面的基礎知識;第二部分圍繞一個基本的單周期CPU的設計,逐步引入流水線、指令、例外和中斷、總線、高速緩存等部分的設計和實現,最終完成一個入門級的CPU設計;第三部分則在基本CPU的基礎上進一步添加常見指令和功能,啟發讀者的創造力,使設計出的CPU更接近真實產品。通過這樣循序漸進、層層深入的安排,引導讀者逐步掌握CPU的設計方法。
融入大量工程實踐經驗、設計原則、開發技巧、需要規避的設計風險、常見錯誤等內容,幫助讀者理解在真實的工程場景中應該考慮的問題,學會在各種現實條件下進行權衡,根據目標找到最優的解決方案。
涵蓋設計思維、設計方法到設計工具的全面介紹,案例豐富,可操作性強。通過學習本書,讀者不僅可以掌握CPU的設計方法,更能在這個過程中很好地訓練工程設計思維,為今後的工作打下堅實的基礎。

作者簡介

汪文祥工學博士,龍芯中科技術股份有限公司首席工程師,中國科學院大學崗位教授。
主要研究方向為處理器體系結構設計、處理器驗證及計算機系統性能分析優化等,參與了多項國家“核高基”、863 和973 項目,在國內外各種期刊會議發表文章十餘篇,申請專利數十項,授權專利十餘項。
2012年起任龍芯中科芯片研發部IP組組長,負責龍芯系列CPU IP核的開發研製及維護,參與製訂龍芯指令系統架構規範。


邢金璋碩士畢業於中國科學院計算技術研究所,2015年加入龍芯中科技術股份有限公司,從事處理器核結構設計工作,是龍芯小、中系列處理器核演進版本的主要結構設計者之一。
近年來,積極參與“龍芯杯”全國大學生計算機系統能力培養大賽的技術支持、培訓等工作。

目錄大綱

叢書序言

前言

第1章 CPU芯片研發過程概述 1
1.1 處理器和處理器核 1
1.2 芯片產品的研製過程 2
1.3 芯片設計的工作階段 3

第2章 硬件實驗平臺及FPGA設計流程 5
2.1 硬件實驗平臺 5
2.1.1 龍芯CPU設計與體系結構教學實驗系統 5
2.1.2 龍芯電腦系統能力培養遠程實驗平臺 7
2.2 FPGA的設計流程 8
2.2.1 FPGA的一般設計流程 9
2.2.2 基於Vivado的FPGA設計流程 10
2.2.3 Vivado使用小貼士 33
2.3 任務與實踐 35

第3章 數字邏輯電路設計基礎 36
3.1 數字邏輯電路設計與Verilog代碼開發 36
3.1.1 面向硬件電路的設計思維方式 37
3.1.2 行為描述的Verilog編程風格 38
3.1.3 自頂向下的設計劃分過程 38
3.1.4 常用數字邏輯電路的Verilog描述 39
3.2 數字邏輯電路功能模擬的常見錯誤及其調試方法 55
3.2.1 功能模擬波形分析 56
3.2.2 波形異常類錯誤的調試 60
3.3 進一步使用Vivado 66
3.3.1 定製同步RAM IP核 66
3.3.2 定製異步RAM IP核 68
3.3.3 查看時序結果和資源利用率 69
3.4 任務與實踐 69
3.4.1 實踐任務一:寄存器堆模擬 70
3.4.2 實踐任務二:同步RAM和異步RAM模擬、綜合與實現 71
3.4.3 實踐任務三:數字邏輯電路的設計與調試 72

第4章 簡單流水線CPU設計 74
4.1 設計一個簡單的單周期CPU 75
4.1.1 設計單周期CPU的總體思路 75
4.1.2 單周期CPU的數據通路設計 76
4.1.3 單周期CPU的控制信號生成 88
4.1.4 復位的處理 91
4.2 不考慮相關沖突的流水線CPU設計 92
4.2.1 添加流水級間緩存 92
4.2.2 同步RAM的引入 93
4.2.3 調整更新PC的數據通路 96
4.2.4 不考慮相關沖突情況下流水線控制信號的設計 96
4.3 CPU設計開發環境(CPU_CDE) 97
4.3.1 快速上手CPU設計的開發環境 97
4.3.2 CPU設計開發環境的組織與結構 99
4.3.3 CPU設計開發環境使用進階 113
4.4 CPU設計的功能模擬調試技術 117
4.4.1 為什麽要用基於Trace比對的調試輔助手段 117
4.4.2 基於Trace比對調試手段的盲區及其對策 119
4.4.3 學會閱讀匯編程序和反匯編代碼 119
4.4.4 CPU調試中要抓取的信號以及如何看這些信號 124
4.5 指令相關與流水線沖突 125
4.5.1 處理寄存器寫後讀數據相關引發的流水線沖突 126
4.5.2 轉移計算未完成 127
4.6 流水線數據的前遞設計 127
4.6.1 前遞的數據通路設計 128
4.6.2 前遞的流水線控制信號調整 130
4.6.3 前遞引發的主頻下降 131
4.7 任務與實踐 131
4.7.1 實踐任務一:簡單CPU參考設計調試 132
4.7.2 實踐任務二:用阻塞技術解決相關引發的沖突 132
4.7.3 實踐任務三:用前遞技術解決相關引發的沖突 133

第5章 在流水線中添加運算類指令 134
5.1 算術邏輯運算類指令的添加 134
5.1.1 ADD、ADDI和SUB指令的添加 134
5.1.2 SLTI和SLTIU指令的添加 135
5.1.3 ANDI、ORI和XORI指令的添加 135
5.1.4 SLLV、SRLV和SRAV指令的添加 135
5.2 乘除法運算類指令的添加 136
5.2.1 調用Xilinx IP實現乘除法運算部件 136
5.2.2 電路級實現乘法器 140
5.2.3 電路級實現除法器 147
5.3 乘除法配套數據搬運指令的添加 154
5.3.1 乘法運算實現為單周期的情況 155
5.3.2 乘法運算實現為多周期流水的情況 155
5.4 任務與實踐 156

第6章 在流水線中添加轉移指令和訪存指令 157
6.1 轉移指令的添加 157
6.1.1 BGEZ、BGTZ、BLEZ和BLTZ指令 158
6.1.2 J指令 158
6.1.3 BLTZAL和BGEZAL指令 158
6.1.4 JALR指令 158
6.2 訪存指令的添加 158
6.2.1 LB、LBU、LH和LHU指令的添加 158
6.2.2 SB和SH指令的添加 159
6.2.3 非對齊訪存指令的說明 160
6.2.4 LWL和LWR指令的添加 162
6.2.5 SWL和SWR指令的添加 164
6.3 任務與實踐 164

第7章 例外和中斷的支持 166
7.1 例外和中斷的基本概念 166
7.1.1 例外是一套軟硬件協同處理的機制 166
7.1.2 精確例外 167
7.2 MIPS指令系統中與例外相關的功能定義 168
7.2.1 CP0寄存器 168
7.2.2 例外產生條件的判定 168
7.2.3 例外入口 170
7.2.4 MFC0和MTC0指令 170
7.2.5 ERET指令 170
7.3 流水線CPU實現例外和中斷的設計要點 170
7.3.1 例外檢測邏輯 170
7.3.2 精確例外的實現 172
7.3.3 CP0寄存器 173
7.3.4 CP0沖突 179
7.4 任務與實踐 180
7.4.1 實踐任務一:添加syscall例外支持 181
7.4.2 實踐任務二:添加其他例外支持 181

第8章 AXI總線接口設計 184
8.1 類SRAM總線 184
8.1.1 主方和從方 185
8.1.2 類SRAM總線接口信號的定義 185
8.1.3 類SRAM總線的讀寫時序 186
8.1.4 類SRAM總線的約束 189
8.2 類SRAM總線的設計 189
8.2.1 取指設計的考慮 190
8.2.2 訪存設計的考慮 195
8.3 AXI總線協議 195
8.3.1 AXI總線信號一覽 195
8.3.2 理解AXI總線協議 197
8.3.3 類SRAM總線接口信號與AXI總線接口信號的關系 202
8.4 類SRAM-AXI的轉接橋設計 203
8.4.1 轉接橋的頂層接口 203
8.4.2 轉接橋的設計要求 204
8.4.3 轉接橋的設計建議 204
8.5 任務與實踐 205
8.5.1 實踐任務一:添加類SRAM總線支持 205
8.5.2 實踐任務二:添加AXI總線支持 208
8.5.3 實踐任務三:完成AXI隨機延遲驗證 210

第9章 TLB MMU設計 211
9.1 TLB模塊的基礎知識 212
9.1.1 TLB的虛實地址轉換 212
9.1.2 TLB的軟件訪問 214
9.1.3 TLB的軟硬件交互機制 215
9.2 TLB模塊設計的分析 217
9.3 TLB相關的CP0寄存器與指令的實現 219
9.4 利用TLB進行虛實地址轉換及TLB例外 221
9.5 任務與實踐 222
9.5.1 實踐任務一:TLB模塊設計 222
9.5.2 實踐任務二:添加TLB相關指令和CP0寄存器 224
9.5.3 實踐任務三:添加TLB相關例外支持 225

第10章 高速緩存設計 226
10.1 Cache模塊的設計 227
10.1.1 Cache的設計規格 227
10.1.2 Cache模塊的數據通路設計 228
10.1.3 Cache模塊內部的控制邏輯設計 237
10.1.4 Cache的硬件初始化問題 241
10.2 將Cache模塊集成至CPU中 242
10.2.1 Cache命中情況下的CPU流水線適配 242
10.2.2 Cache缺失情況下的CPU流水線適配 243
10.2.3 Uncache訪問的處理 243
10.3 CACHE指令 245
10.3.1 CACHE指令的定義 245
10.3.2 CACHE指令的實現 247
10.4 性能測試程序 247
10.4.1 Dhrystone 247
10.4.2 Coremark 250
10.5 Cache的性能 251
10.6 任務與實踐 252
10.6.1 實踐任務一:Cache模塊設計 252
10.6.2 實踐任務二:在CPU中集成ICache 254
10.6.3 實踐任務三:在CPU中集成DCache 255
10.6.4 實踐任務四:在CPU中添加CACHE指令 256

第11章 進階設計 258
11.1 運行Linux內核 258
11.1.1 復雜SoC搭建 259
11.1.2 CPU的進一步完善 259
11.1.3 調試建議 260
11.2 提升主頻的常用方法 261
11.2.1 平衡各級流水線的延遲 261
11.2.2 優化大概率事件的處理邏輯 261
11.2.3 用面積和功耗換時序 262
11.2.4 進一步切分流水線 262
11.3 靜態雙發射流水線的實現 262
11.4 動態調度機制的實現 263
11.4.1 一個雙發射動態調度流水線的設計實例 263
11.4.2 動態調度中常見電路結構的RTL實現 266
11.5 硬件轉移預測技術 266
11.5.1 硬件轉移預測的流水線設計框架 267
11.5.2 一個輕量級轉移預測器的設計規格 268
11.6 訪存優化技術 269
11.6.1 store buffer 269
11.6.2 Non-blocking Cache 270
11.6.3 訪存亂序執行 271
11.6.4 多級Cache 271
11.6.5 Cache預取 272
11.7 多核處理器的實現 272
11.7.1 多核互聯結構 273
11.7.2 多核編號 273
11.7.3 核間中斷 273
11.7.4 多核情況下的存儲一致性 274
11.7.5 LL-SC指令對的訪存原子性 282

附錄A 龍芯CPU設計與體系結構教學實驗系統 285
附錄B Vivado的安裝 288
附錄C 簡單MIPS指令系統規範 301
附錄D Vivado使用進階 345