手把手教你 RISC-V CPU (上) : 處理器設計

胡振波 主編 芯來科技生態組

  • 手把手教你 RISC-V CPU (上) : 處理器設計-preview-1
  • 手把手教你 RISC-V CPU (上) : 處理器設計-preview-2
手把手教你 RISC-V CPU (上) : 處理器設計-preview-1

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

商品描述

本書系統地介紹了 CPU 設計技巧和新興開源RISC-V架構,內容翔實,涵蓋開源蜂鳥E203處理器各模塊的具體實現,以及可擴展協處理器的實現機制。為了讓讀者學以致用,本書還集成了大量的實例,用實例把各個模塊的實現方式貫穿起來。

本書適合從事CPU設計的工程師和技術愛好者閱讀。

作者簡介

胡振波,芯來科技創辦人兼執行官,中國RISC-V領域的先行者,擁有豐富的處理器內核開發經驗,曾長期就職於外企,擔任處理器內核研發核心崗位負責人。
其打造的國內RISC-V開源項目——蜂鳥E203,對國內RISC-V的普及和推廣起到了巨大的推動作用。以胡振波為核心創辦的芯來科技目前已經成為中國先行的RISC-V處理器內核IP和解決方案公司,推出的嵌入式CPU核系列產品處於中國RISC-V處理器研發與產業化的前列。

目錄大綱

第 一部分 CPU與RISC-V綜述

第 1章 CPU之三生三世 2
1.1 眼看他起高樓,眼看他宴賓客,眼看他樓塌了—CPU眾生相 3
1.1.1 ISA—CPU的靈魂 4
1.1.2 CISC架構與RISC架構 5
1.1.3 32位架構與64位架構 6
1.1.4 ISA眾生相 6
1.1.5 CPU的領域之分 11
1.2 ISA請扛起這口鍋—為什麼國產CPU尚未足夠成熟 12
1.2.1 MIPS系—龍芯和君正 12
1.2.2 x86系—北大眾志、上海兆芯和天津海光 13
1.2.3 Power系—中晟宏芯 14
1.2.4 Alpha系—申威 14
1.2.5 ARM系—飛騰、海思、展訊 14
1.2.6 RISC-V系—平頭哥、芯來科技 16
1.2.7 背鍋俠ISA 16
1.3 人生已如此艱難,你又何必拆穿—CPU從業者的無奈 18
1.4 無敵者是多麼寂寞—ARM統治著的世界 19
1.4.1 獨樂樂與眾樂樂—ARM公司的盈利模式 19
1.4.2 小個子有大力量—無處不在的Cortex-M系列 22
1.4.3 移動王者—Cortex-A系列在手持設備領域的巨大成功 23
1.4.4 進擊的巨人—ARM進軍PC與服務器領域的雄心 25
1.4.5 ARM當前發展 26
1.5 東邊日出西邊雨,道是無晴卻有晴—RISC-V登場 26
1.5.1 緣起名校 26
1.5.2 興於開源 27
1.5.3 本土發展 29
1.6 舊時王謝堂前燕,飛入尋常百姓家—你也可以設計自己的處理器 30
第 2章 大道至簡—RISC-V架構之魂 31
2.1 簡單就是美—RISC-V架構的設計理念 32
2.1.1 無病一身輕—架構的篇幅 32
2.1.2 能屈能伸—模塊化的指令集 34
2.1.3 濃縮的都是精華—指令的數量 34
2.2 RISC-V架構簡介 35
2.2.1 模塊化的指令集 35
2.2.2 可配置的通用寄存器組 36
2.2.3 規整的指令編碼 36
2.2.4 簡潔的存儲器訪問指令 37
2.2.5 高效的分支跳轉指令 38
2.2.6 簡潔的子程序調用 38
2.2.7 無條件碼執行 39
2.2.8 無分支延遲槽 40
2.2.9 零開銷硬件循環指令 40
2.2.10 簡潔的運算指令 40
2.2.11 優雅的壓縮指令子集 41
2.2.12 特權模式 42
2.2.13 CSR 42
2.2.14 中斷和異常 42
2.2.15 P擴展指令子集 43
2.2.16 矢量指令子集 43
2.2.17 自定義指令擴展 43
2.2.18 比較 43
2.3 RISC-V軟件工具鏈 44
2.4 RISC-V和其他開放架構有何不同 47
2.4.1 平民英雄—OpenRISC 47
2.4.2 豪門顯貴—SPARC 48
2.4.3 身出名門—MIPS 48
2.4.4 名校優生—RISC-V 49
第3章 亂花漸欲迷人眼—盤點RISC-V商業版本與開源版本 50
3.1 各商業版本與開源版本綜述 51
3.1.1 Rocket Core 51
3.1.2 BOOM Core 53
3.1.3 Freedom E310 SoC 54
3.1.4 LowRISC SoC 54
3.1.5 PULPino Core與SoC 54
3.1.6 PicoRV32 Core 55
3.1.7 SCR1 Core 56
3.1.8 ORCA Core 56
3.1.9 Andes Core 56
3.1.10 Microsemi Core 56
3.1.11 Codasip Core 57
3.1.12 Nuclei Core 57
3.1.13 蜂鳥E203處理器核與SoC 58
3.2 小結 59
第4章 開源RISC-V—蜂鳥E203處理器核與SoC 60
4.1 與眾不同的蜂鳥E203處理器 61
4.2 蜂鳥E203處理器簡介—蜂鳥雖小,五臟俱全 62
4.3 蜂鳥E203處理器的性能指標 64
4.4 蜂鳥E203處理器的配套SoC 64
4.5 蜂鳥E203處理器的配置選項 66

第二部分 手把手教你使用Verilog設計CPU
第5章 先見森林,後觀樹木—蜂鳥E203處理器核設計總覽和頂層 70
5.1 處理器硬件設計概述 71
5.1.1 架構和微架構 71
5.1.2 CPU、處理器、Core和處理器核 71
5.1.3 處理器設計和驗證 71
5.2 蜂鳥E203處理器核的設計理念 72
5.3 蜂鳥E203處理器核的RTL代碼風格 73
5.3.1 使用標準DFF模塊例化生成寄存器 73
5.3.2 推薦使用assign語法替代if-else和case語法 75
5.3.3 其他若干注意事項 77
5.4 蜂鳥E203模塊層次劃分 77
5.5 蜂鳥E203處理器核的源代碼 78
5.6 蜂鳥E203處理器核的配置選項 78
5.7 蜂鳥E203處理器核支持的RISC-V指令子集 79
5.8 蜂鳥E203處理器核的流水線結構 79
5.9 蜂鳥E203處理器核的頂層接口 79
5.10 小結 82
第6章 流水線不是流水賬—蜂鳥E203處理器核流水線 83
6.1 處理器流水線概述 84
6.1.1 從經典的5級流水線說起 84
6.1.2 可否不要流水線—流水線和狀態機的關係 86
6.1.3 深處種菱淺種稻,不深不淺種荷花—流水線的深度 86
6.1.4 向上生長—越來越深的流水線 87
6.1.5 向下生長—越來越淺的流水線 88
6.2 處理器流水線中的亂序 88
6.3 處理器流水線中的反壓 88
6.4 處理器流水線中的衝突 89
6.4.1 流水線中的資源衝突 89
6.4.2 流水線中的數據衝突 90
6.5 蜂鳥E203處理器的流水線 91
6.5.1 流水線總體結構 91
6.5.2 流水線中的衝突 92
6.6 小結 92
第7章 萬事開頭難— 一切從取指令開始 93
7.1 取指概述 94
7.1.1 取指特點 94
7.1.2 如何快速取指 95
7.1.3 如何處理地址不對齊的指令 96
7.1.4 如何處理分支指令 97
7.2 RISC-V架構特點對於取指的簡化 102
7.2.1 規整的指令編碼格式 102
7.2.2 指令長度指示碼放於低位 102
7.2.3 簡單的分支跳轉指令 103
7.2.4 沒有分支延遲槽指令 104
7.2.5 提供明確的靜態分支預測依據 105
7.2.6 提供明確的RAS依據 105
7.3 蜂鳥E203處理器的取指實現 106
7.3.1 IFU總體設計思路 106
7.3.2 簡單譯碼 108
7.3.3 簡單BPU 110
7.3.4 PC生成 114
7.3.5 訪問ITCM和BIU 116
7.3.6 ITCM 120
7.3.7 BIU 120
7.4 小結 121
第8章 一鼓作氣,執行力是關鍵—執行 122
8.1 執行概述 123
8.1.1 指令譯碼 123
8.1.2 指令執行 123
8.1.3 流水線的衝突 124
8.1.4 指令的交付 124
8.1.5 指令發射、派遣、執行、寫回的順序 124
8.1.6 分支解析 126
8.2 RISC-V架構的特點對於執行的簡化 126
8.2.1 規整的指令編碼格式 127
8.2.2 優雅的16位指令 127
8.2.3 精簡的指令個數 127
8.2.4 整數指令的操作數個數是1或2 127
8.3 蜂鳥E203處理器的執行實現 127
8.3.1 執行指令列表 128
8.3.2 EXU總體設計思路 128
8.3.3 譯碼 129
8.3.4 整數通用寄存器組 135
8.3.5 CSR 138
8.3.6 指令發射、派遣 139
8.3.7 流水線衝突、長指令和OITF 143
8.3.8 ALU 149
8.3.9 交付 162
8.3.10 寫回 162
8.3.11 協處理器擴展 162
8.4 小結 163
第9章 善始者實繁,克終者蓋寡—交付 164
9.1 處理器中指令的交付、取消、沖刷 165
9.1.1 指令交付、取消、沖刷 165
9.1.2 指令交付的常見實現策略 166
9.2 RISC-V架構特點對於交付的簡化 166
9.3 蜂鳥E203處理器中指令交付的硬件實現 167
9.3.1 分支預測指令的處理 168
9.3.2 中斷和異常的處理 171
9.3.3 多周期執行的指令的交付 171
9.4 小結 172
第 10章 讓子彈飛一會兒—寫回 173
10.1 處理器的寫回 174
10.1.1 處理器寫回功能簡介 174
10.1.2 處理器常見寫回策略 174
10.2 蜂鳥E203處理器的寫回硬件實現 174
10.2.1 最終寫回仲裁 175
10.2.2 OITF模塊和長指令寫回仲裁模塊 176
10.3 小結 179
第 11章 哈弗還是比亞迪—存儲器 181
11.1 存儲器概述 182
11.1.1 誰說處理器一定要有緩存 182
11.1.2 處理器一定要有存儲器 183
11.1.3 ITCM和DTCM 185
11.2 RISC-V架構特點對於存儲器訪問指令的簡化 186
11.2.1 僅支持小端格式 186
11.2.2 無地址自增/自減模式 186
11.2.3 無一次讀多個數據和一次寫多個數據的指令 186
11.3 RISC-V架構的存儲器訪問指令 187
11.3.1 存儲器讀和寫指令 187
11.3.2 fence指令和fence. i指令 187
11.3.3 A擴展指令集 187
11.4 蜂鳥E203處理器核的存儲器子系統硬件實現 188
11.4.1 存儲器子系統總體設計思路 188
11.4.2 AGU 188
11.4.3 LSU 193
11.4.4 ITCM和DTCM 195
11.4.5 A擴展指令集的硬件實現 198
11.4.6 fence與fence. i指令的硬件實現 202
11.4.7 BIU 204
11.4.8 ECC 204
11.5 小結 204
第 12章 黑盒子的窗口—總線接口單元 205
12.1 片上總線協議概述 206
12.1.1 AXI 206
12.1.2 AHB 206
12.1.3 APB 207
12.1.4 TileLink 207
12.1.5 總結比較 207
12.2 自定義總線協議ICB 208
12.2.1 ICB協議簡介 208
12.2.2 ICB協議信號 209
12.2.3 ICB協議的時序 209
12.3 ICB的硬件實現 214
12.3.1 一主多從 214
12.3.2 多主一從 215
12.3.3 多主多從 216
12.4 蜂鳥E203處理器核BIU 217
12.4.1 BIU簡介 217
12.4.2 BIU的微架構 218
12.4.3 BIU的源代碼 218
12.5 蜂鳥E203處理器SoC總線 219
12.5.1 SoC總線簡介 219
12.5.2 SoC總線的微架構 220
12.5.3 SoC總線的源代碼 220
12.6 小結 221
第 13章 不得不說的故事—中斷和異常 222
13.1 中斷和異常概述 223
13.1.1 中斷概述 223
13.1.2 異常概述 224
13.1.3 廣義上的異常 224
13.2 RISC-V架構異常處理機制 226
13.2.1 進入異常 226
13.2.2 退出異常 229
13.2.3 異常服務程序 230
13.3 RISC-V架構中斷定義 231
13.3.1 中斷類型 231
13.3.2 中斷屏蔽 233
13.3.3 中斷等待 233
13.3.4 中斷優先級與仲裁 234
13.3.5 中斷嵌套 235
13.4 RISC-V架構中與中斷和異常相關的CSR 236
13.

5 蜂鳥E203處理器中異常處理的硬件實現 236
13.5.1 蜂鳥E203處理器的異常和中斷實現要點 236
13.5.2 蜂鳥E203處理器支持的中斷和異常類型 237
13.5.3 蜂鳥E203處理器對mepc寄存器的處理 237
13.5.4 蜂鳥E203處理器的中斷接口 238
13.5.5 蜂鳥E203處理器CLINT微架構及源代碼分析 239
13.5.6 蜂鳥E203處理器PLIC微架構及源代碼分析 242
13.5.7 蜂鳥E203處理器中交付模塊對中斷和異常的處理 244
13.6 小結 248
第 14章 最不起眼的其實是最難的—調試機制 249
14.1 調試機制概述 250
14.1.1 交互調試概述 250
14.1.2 跟踪調試概述 252
14.2 RISC-V架構的調試機制 252
14.2.1 調試器軟件的實現 253
14.2.2 調試模式 253
14.2.3 調試指令 254
14.2.4 調試模式下的CSR 254
14.2.5 調試中斷 254
14.3 蜂鳥E203處理器中的調試機制 254
14.3.1 蜂鳥E203處理器中的交互式調試 254
14.3.2 DTM 255
14.3.3 硬件調試模塊 256
14.3.4 調試中斷處理 259
14.3.5 調試模式下CSR的實現 260
14.3.6 調試機制指令的實現 261
14.4 小結 262
第 15章 動如脫兔,靜若處子—低功耗的訣竅 263
15.1 處理器低功耗技術概述 264
15.1.1 軟件層面的低功耗 264
15.1.2 系統層面的低功耗 264
15.1.3 處理器層面的低功耗 265
15.1.4 模塊和單元層面的低功耗 265
15.1.5 寄存器層面的低功耗 266
15.1.6 鎖存器層面的低功耗 267
15.1.7 SRAM層面的低功耗 267
15.1.8 組合邏輯層面的低功耗 267
15.1.9 工藝層面的低功耗 268
15.2 RISC-V架構的低功耗機制 268
15.3 蜂鳥E203處理器低功耗機制的硬件實現 268
15.3.1 蜂鳥E203處理器在系統層面的低功耗 268
15.3.2 蜂鳥E203處理器層面的低功耗 270
15.3.3 蜂鳥E203處理器在單元層面的低功耗 272
15.3.4 蜂鳥E203處理器在寄存器層面的低功耗 272
15.3.5 蜂鳥E203處理器在鎖存器層面的低功耗 275
15.3.6 蜂鳥E203處理器在SRAM層面的低功耗 276
15.3.7 蜂鳥E203處理器在組合邏輯層面的低功耗 277
15.3.8 蜂鳥E203處理器在工藝層面的低功耗 278
15.4 小結 278
第 16章 工欲善其事,必先利其器—RISC-V可擴展協處理器 279
16.1 領域特定架構 280
16.2 RISC-V架構的可擴展性 281
16.2.1 RISC-V架構的預留指令編碼空間 281
16.2.2 RISC-V架構的預定義指令 282
16.3 蜂鳥E203處理器的協處理器擴展機制—NICE 282
16.3.1 NICE指令的編碼 282

16.3.2 NICE協處理器的接口信號 283
16.3.3 NICE協處理器的流水線接口 284
16.3.4 NICE協處理器的存儲器接口 285
16.3.5 NICE協處理器的接口時序 286
16.4 蜂鳥E203處理器的協處理器參考示例 290
16.4.1 示例協處理器的實現需求 290
16.4.2 示例協處理器的自定義指令 291
16.4.3 示例協處理器的硬件實現 292
16.4.4 示例協處理器的軟件驅動 292
16.4.5 示例協處理器的性能分析 294

第三部分 開發實戰
第 17章 先冒個煙—運行Verilog仿真測試 298
17.1 E203開源項目的代碼層次結構 299
17.2 E203開源項目的測試用例 300
17.2.1 riscv-tests自測試用例 300
17.2.2 編譯ISA自測試用例 301
17.3 E203 開源項目的測試平台 304
17.4 在測試平台中運行測試用例 304
第 18章 套上殼子上路—更多實踐 308

附錄A RISC-V架構的指令集 311
附錄B RISC-V架構的CSR 341
附錄C RISC-V架構的PLIC 351
附錄D 存儲器模型背景 359
附錄E 存儲器原子操作指令背景 364
附錄F RISC-V指令編碼列表 367
附錄G RISC-V偽指令列表 374