CPU製作入門·基於RISC·V和Chisel
![]() |
《CPU製作入門·基於RISC·V和Chisel》,[日] 西山悠太朗,[日] 井田健太 著,蔣萌 譯,出版社: 科學出版社。
科學出版社是中國最大的綜合性科技出版機構[1],由前中國科學院編譯局與1930年代創建的有較大影響的龍門聯合書局合併而來。科學出版社比鄰皇城根遺址公園,是一個歷史悠久、力量雄厚,以出版學術書刊為主的開放式出版社[2]。
目錄
內容簡介
本書基於RISC-V和Chisel講解自定義CPU的實現。全書分為5個部分,立足於CPU、存儲器、計算機架構等基礎知識,逐步帶領讀者實現簡單的加減法、分支、比較等基礎指令,理解流水線對於CPU高速化的重要意義及實現,最後應用向量擴展語言實現自定義CPU。要提醒的是,本書所指的「CPU製作」僅限於軟件上的設計和模擬,不涉及FPGA上的實現。
目錄
第Ⅰ部分 CPU製作的基礎知識
第1章什麼是CPU 2
1.1 電路能夠描述邏輯的理由 3
1.1.1 轉換為數字信號 3
1.1.2 描述邏輯運算的電路 4
1.1.3 可以描述任何真值表的基本邏輯電路 7
1.2 為何能用基本邏輯電路實現CPU 9
1.2.1 時序邏輯電路:鎖存器 10
1.2.2 有限狀態機 11
1.2.3 通過時鐘信號同步 13
1.3 CPU的製造流程 17
第2章計算機架構 19
2.1 存儲器 20
2.1.1 寄存器 21
2.1.2 主存 21
2.2 計算機的基本處理流程 22
2.2.1 取指令(IF) 23
2.2.2 指令譯碼(ID) 23
2.2.3 運算(EX)27
2.2.4 訪存(MEM) 27
CPU製作入門:基於RISC-V和Chisel
2.2.5 回寫 27
第3章 Chisel基礎 30
3.1 什麼是Chisel 31
3.2 什麼是面向對象 32
3.2.1 類和實例 32
3.2.2 繼承 33
3.3 Scala的基本語法 34
3.3.1 變量var和val 35
3.3.2 方法:def() 35
3.3.3 集合:Seq 35
3.3.4 for表達式 36
3.3.5 對象 37
3.3.6 命名空間 40
3.4 Chisel的基本語法 42
3.4.1 位值的基本類型 42
3.4.2 運算符 44
3.4.3 Module類 47
3.4.4 IO對象 48
3.4.5 Flipped對象 49
3.4.6 信號連接 50
3.4.7 組合邏輯電路:Wire/WireDefault 51
3.4.8 時序邏輯電路:RegInit 51
3.4.9 用Mem定義寄存器文件 52
3.4.10 控制電路 52
3.4.11 位操作 56
3.4.12 用printf調試 57
第Ⅱ部分簡單的CPU實現
第4章環境架構 60
4.1 下載chisel-template 60
4.2 用Docker架構運行環境 61
4.2.1 安裝Docker 61
4.2.2 創建Dockerfile 61
4.2.3 創建鏡像 62
4.2.4 創建容器 63
4.3 指令位列和常量文件 63
4.3.1 Instructions.scala …
4.3.2 Consts.scala 66
4.4 第Ⅱ部分要實現的指令和Chisel完整代碼 69
第5章取指令的實現 76
5.1 Chisel代碼概要 76
5.2 Chisel的實現 77
第6章用ChiselTest進行取指令測試 80
6.1 ChiselTest的實現 80
6.2 測試流程 81
6.3 創建Chisel測試代碼 81
6.3.1 特徵:trait 82
6.3.2 peek() 方法 83
6.3.3 clock.step() 方法 83
6.4 創建存儲器用HEX文件 83
6.5 用printf輸出調試信號 85
6.6 運行測試 85
6.7 Docker容器的commit 86
第7章指令譯碼器的實現 87
7.1 Chisel的實現 87
7.1.1 寄存器編號的譯碼 87
7.1.2 寄存器數據的讀取 87
7.1.3 調試信號的輸出 88
7.2 運行測試 88
第8章 LW指令的實現 90
8.1 RISC-V的LW指令定義 90
8.2 Chisel的實現 91
8.2.1 指令位模式的定義 92
8.2.2 CPU和存儲器之間的端口定義 93
8.2.3 CPU內部的處理實現 94
8.2.4 存儲器的數據讀取實現 95
8.3 運行測試 96
8.3.1 創建指令文件lw.hex96
8.3.2 存儲器加載文件名的修改 97
8.3.3 測試結束條件的修改 97
8.3.4 添加調試信號 97
8.3.5 運行測試 98
第9章 SW指令的實現 99
9.1 RISC-V的SW指令定義 99
9.2 Chisel的實現 100
9.2.1 指令位模式的定義 101
9.2.2 CPU和存儲器間的端口定義 101
9.2.3 CPU內部的處理實現 101
9.2.4 存儲器的數據寫入實現 102
9.3 運行測試 102
9.3.1 創建指令文件sw.hex 102
9.3.2 存儲器加載文件名的修改 104
9.3.3 測試結束條件的修改 104
9.3.4 添加調試信號 104
9.3.5 運行測試 104
第10章加減法指令的實現 106
10.1 RISC-V的加減法指令定義 106
10.2 Chisel的實現 107
10.2.1 指令位模式的定義 107
10.2.2 加減法結果的連接(EX階段) 107
10.2.3 加減法結果的寄存器回寫(WB階段) 108
第11章邏輯運算的實現 109
11.1 RISC-V的邏輯運算指令定義 109
11.2 Chisel的實現 110
11.2.1 指令位模式的定義 110
11.2.2 邏輯運算結果的連接(EX階段) 111
11.2.3 邏輯運算結果的寄存器回寫(WB階段) 111
第12章譯碼器的強化 112
12.1 ALU譯碼 112
12.1.1 譯碼器的強化(ID階段) 112
12.1.2 利用譯碼信號簡化ALU(EX階段) 113
12.2 MEM譯碼 114
12.2.1 譯碼器的強化(ID階段) 114
12.2.2 指令譯碼的非必要化(MEM階段) 115
12.3 WB譯碼 115
12.3.1 譯碼器強化(ID階段) 116
12.3.2 指令譯碼的非必要化(WB階段) 116
第13章移位運算的實現 118
13.1 RISC-V的移位運算指令定義 118
13.2 Chisel的實現 119
13.2.1 指令位模式的定義 119
13.2.2 譯碼信號的生成(ID階段) 120
13.2.3 移位運算結果的連接(EX階段) 120
第14章比較運算的實現 121
14.1 RISC-V的比較運算指令定義 121
14.2 Chisel的實現 122
14.2.1 指令位模式的定義 122
14.2.2 譯碼信號的生成(ID階段) 122
14.2.3 比較運算結果的連接(EX階段) 123
第15章分支指令的實現 124
15.1 RISC-V的分支指令定義 124
15.2 Chisel的實現 126
15.2.1 指令位模式的定義 126
15.2.2 PC的控制(IF階段) 126
15.2.3 立即數和譯碼信號的生成(ID階段) 127
15.2.4 分支可否、跳轉目標地址的計算(EX階段) 128
第16章跳轉指令的實現 129
16.1 RISC-V的跳轉指令定義 129
16.2 Chisel的實現 131
16.2.1 指令位模式的定義 131
16.2.2 譯碼和操作數數據的讀取(ID階段) 131
16.2.3 添加JALR運算(EX階段) 132
16.2.4 PC的控制(IF階段) 132
16.2.5 ra的回寫(WB階段) 133
第17章立即數加載指令的實現 134
17.1 RISC-V的立即數加載指令定義 134
17.2 Chisel的實現 135
17.2.1 指令位模式的定義 135
17.2.2 譯碼和操作數數據的讀取(ID階段) 136
第18章 CSR指令的實現 138
18.1 RISC-V的CSR指令定義 138
18.2 Chisel的實現 141
18.2.1 指令位模式的定義 141
18.2.2 立即數和譯碼信號的生成(ID階段) 141
18.2.3 op1_data的連接(EX階段) 142
18.2.4 CSR的讀寫(MEM階段) 142
18.2.5 CSR讀取數據的寄存器回寫(WB階段) 143
第19章 ECALL的實現 144
19.1 RISC-V的ECALL指令定義 144
19.2 Chisel的實現 145
19.2.1 指令位模式的定義 145
xvi
CPU製作入門:基於RISC-V和Chisel
19.2.2 PC的控制(IF階段) 145
19.2.3 譯碼信號的生成(ID階段) 146
19.2.4 CSR寫入(MEM階段) 146
第20章用riscv-tests進行測試 147
20.1 riscv-tests的構建 147
20.2 將ELF文件轉換為BIN文件 148
20.3 BIN文件的十六進制化 149
20.4 riscv-tests的路徑條件 150
20.5 riscv-tests的執行 153
20.5.1 Chisel的實現 153
20.5.2 運行測試 154
20.6 批量測試腳本 156
20.6.1 HEX文件的批量生成:tohex.sh 156
20.6.2 riscv-tests的批量運行:riscv-tests.sh 156
第21章試運行C程序 159
21.1 創建C程序 159
21.2 編譯 161
21.3 鏈接 163
21.4 機器語言的十六進制化和DUMP文件的創建 1…
21.5 運行測試 165
第Ⅲ部分流水線的實現
第22章什麼是流水線 168
22.1 流水線的意義 168
22.2 創建CPU流水線 170
22.3 在第Ⅲ部分完成的Chisel代碼 170
第23章流水線寄存器的設置 179
23.1 寄存器的定義 179
23.2 IF階段 181
23.2.1 取指令和PC控制 181
23.2.2 IF/ID寄存器的寫入 181
23.3 ID階段 182
23.3.1 寄存器編號的譯碼和寄存器數據的讀取 182
23.3.2 立即數的譯碼 182
23.3.3 csignals的譯碼 182
23.3.4 操作數數據的選擇 183
23.3.5 生成csr_addr 183
23.3.6 ID/EX寄存器的寫入 183
23.4 EX階段 184
23.4.1 至alu_out的信號連接 184
23.4.2 分支指令的處理 185
23.4.3 EX/MEM寄存器的寫入 185
23.5 MEM階段 186
23.5.1 存儲器訪問 186
23.5.2 CSR 186
23.5.3 wb_data 186
23.5.4 寫入MEM/WB寄存器 187
23.6 WB階段 187
第24章分支冒險處理 188
24.1 什麼是分支冒險 188
24.2 Chisel的實現 189
24.2.1 禁用IF階段 189
24.2.2 禁用ID階段 190
24.2.3 增加調試信號 190
24.3 分支冒險的測試 191
24.3.1 創建用於測試的C程序 191
24.3.2 創建HEX文件和DUMP文件 192
24.3.3 分支冒險處理前的CPU測試 194
24.3.4 分支冒險處理後的CPU測試 195
第25章數據冒險處理 199
25.1 什麼是數據冒險 199
25.2 直通的Chisel實現 200
25.3 停頓的Chisel實現 201
25.3.1 添加stall_flg信號(ID階段) 202
25.3.2 停頓處理(IF階段) 203
25.3.3 BUBBLE化(ID階段) 203
25.3.4 添加調試信號 204
25.4 數據冒險測試 204
25.4.1 ID/WB間數據冒險直通模式 204
25.4.2 ID/EX間數據冒險引發停頓→ ID/MEM間直通模式 207
25.4.3 riscv-tests測試 209
第Ⅳ部分向量擴展指令的實現
第26章什麼是向量指令 212
26.1 什麼是SIMD 212
26.2 既有的向量架構 215
26.3 RISC-V向量指令和SIMD指令的不同 216
26.3.1 SIMD指令的向量寄存器長度 216
26.3.2 RVV指令的向量寄存器長度 217
26.4 在第Ⅳ部分完成的Chisel代碼 219
第27章 VSETVLI指令的實現 227
27.1 RISC-V的VSETVLI指令定義 227
27.2 VTYPE 228
27.2.1 SEW和LMUL 229
27.2.2 vill、vta、vma 231
27.3 Chisel的實現 233
27.3.1 指令位模式的定義 233
27.3.2 譯碼信號的生成(ID階段) 233
27.3.3 向量CSR的寫入(MEM階段) 234
27.3.4 VL的寄存器回寫(WB階段) 235
27.4 運行測試 235
27.4.1 e32/m1 測試 235
27.4.2 e…/m1 測試 239
27.4.3 e32/m2 測試 240
第28章向量加載指令的實現 242
28.1 unit-stride向量加載指令定義 243
28.1.1 SEW和EEW 244
28.1.2 位配置 245
28.2 Chisel的實現 246
28.2.1 指令位模式的定義 246
28.2.2 DmemPortIo的擴展 246
28.2.3 添加向量寄存器 247
28.2.4 譯碼信號的生成(ID階段) 247
28.2.5 向量加載數據的寄存器回寫(WB階段) 247
28.2.6 從存儲器讀取向量數據(使用Memory類) 249
28.2.7 添加調試信號 250
28.3 運行測試 250
28.3.1 e32/m1 測試 250
28.3.2 e…/m1 測試 254
28.3.3 e32/m2 測試 256
第29章向量加法指令VADD.VV的實現 260
29.1 RISC-V的VADD.VV指令定義 260
29.2 Chisel的實現 261
29.2.1 指令位模式的定義 261
29.2.2 向量寄存器的讀取(ID階段) 261
29.2.3 譯碼信號的生成(ID階段) 262
29.2.4 添加向量加法器(EX階段) 262
29.2.5 加法結果的寄存器回寫(WB階段) 265
29.2.6 添加調試信號 265
29.3 運行測試 265
29.3.1 e32/m1 測試 265
29.3.2 e…/m1 測試 269
29.3.3 e32/m2 測試 272
第30章向量存儲指令的實現 275
30.1 unit-stride向量存儲指令定義 275
30.2 Chisel的實現 276
30.2.1 指令位模式的定義 276
30.2.2 DmemPortIo的擴展 276
30.2.3 譯碼信號的生成,存儲數據的讀取(ID階段) 277
30.2.4 存儲數據的連接(MEM階段) 277
30.2.5 向量數據存儲器的寫入(使用Memory類) 278
30.3 運行測試 279
30.3.1 e32/m1 測試 279
30.3.2 e…/m1 測試 282
30.3.3 e32/m2 測試 285
第Ⅴ部分自定義指令的實現
第31章自定義指令的意義 290
31.1 單核的性能提升和極限 290
31.1.1 摩爾定律 290
31.1.2 登納德定律 291
31.1.3 登納德定律的崩潰 291
31.2 多核並行處理的效率提升和極限 291
31.2.1 轉向多核 291
31.2.2 並行處理的效率提升極限 292
31.3 DSA的可能性 293
31.3.1 ASIC 293
31.3.2 FPGA 293
31.3.3 DSA的缺點 294
31.4 DSA和RISC-V 294
31.4.1 自由的架構設計 294
31.4.2 自定義指令 295
第32章種群統計指令的實現 298
32.1 什麼是種群統計指令 298
32.2 不實現自定義指令時的種群統計程序 299
32.3 自定義指令編譯器(匯編器)實現 300
32.3.1 GNU Assembler概要 300
32.3.2 添加PCNT指令到GAS 303
32.3.3 編譯器的二次構建 309
32.3.4 PCNT指令的編譯 309
32.4 Chisel的實現 310
32.4.1 指令列的定義 310
32.4.2 譯碼信號的生成(ID階段) 310
32.4.3 添加ALU(EX階段) 311
32.5 運行測試 311
附錄 RISC-V的價值
A.1 開源ISA的重要性 314
A.2 RISC-V的應用目標 315
A.2.1 兼顧高性能和低成本的DSA 315
A.2.2 廉價的通用CPU 316
A.2.3 任何人都能輕鬆學習、實踐的教育環境 316
A.3 芯片製造的成本壁壘及未來 316
參考文獻
- ↑ 國家對出版社等級是怎樣評估的 ,搜狐,2024-07-06
- ↑ 公司簡介,中國科技出版傳媒股份有限公司