開啟主選單

求真百科

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

參考文獻

  1. 國家對出版社等級是怎樣評估的 ,搜狐,2024-07-06
  2. 公司簡介,中國科技出版傳媒股份有限公司