步步驚「芯」——軟核處理器內部設計分析

步步驚「芯」——軟核處理器內部設計分析(含CD光盤1張)(掀開處理器的神祕面紗,帶你遨遊在一個簡潔但不簡單、複雜但不混亂的二進制世界ios

雷思磊 著編程

ISBN 978-7-121-20489-0緩存

2013年7月出版多線程

訂價:75.00元架構

500頁工具

16開性能

編輯推薦:學習

不惟上、不惟下、只惟實——本書對OR1200的一些介紹與OR1200手冊以及其餘學者不一樣,整本書也是按照三級流水線進行分析的。同時,本書指出了源代碼中的一些錯誤,有些多是筆誤,有些就是設計缺陷(如:QMEM的設計)。開發工具

像剝洋蔥似的,一步步接近核心——OR1200是一個系統、一個總體,各個模塊之間的聯繫很緊密,相互影響。經過一步一步的探索,由簡到繁,由不求甚解到全面瞭解,最後揭示得出結論,而不是直接給出結論,而後分析得出這個結論的理由。測試

感性與理性結合——除了對代碼進行分析,本書還使用ModelSim進行仿真,經過ModelSim仿真結果能夠直觀地觀察到任意時刻處理器內部任一信號的狀態,既驗證了代碼分析的正確性,也使讀者加深了印象。

內容提要

本書以開源32位軟核處理器OR1200爲研究對象,像引導讀者如作解剖學實驗那般,對其進行剖析,力圖使讀者對教科書上介紹的處理器有一個實踐上的認識,打破處理器使人高深莫測的印象,同時使讀者瞭解處理器設計的細節。OR1200包括CPUMMUCache、總線接口、電源管理、中斷控制和計時器單元等多個模塊,對於不一樣的模塊,根據其難易程度,採用指令驅動分析法、情景分析法及直接分析源代碼等不一樣的分析方法,便於讀者理解。

經過閱讀本書,讀者能夠掌握一款成熟的軟核處理器OR1200的設計思路、實現方法,同時更加深入、具體地理解計算機組成原理、計算機體系結構等課程介紹的知識。

本書適合計算機專業的學生、FPGA開發人員、處理器設計者、嵌入式系統應用開發工程師、對處理器內部實現感興趣的讀者及對這個世界充滿好奇心的讀者閱讀,也能夠做爲高等院校計算機組成原理、計算機體系結構等課程的實踐參考書。

目錄

1OpenRISC介紹   1

1.1  開源軟核處理器   1

1.2  OpenRISC 1000架構      4

1.3  OR1200——OpenRISC 1000架構的一個實現     4

1.3.1  尋址模式    5

1.3.2  位和字節次序    6

1.3.3  寄存器集    6

1.3.4  指令集         7

1.3.5  異常模型    8

1.4  OR1200代碼組織 8

1.5  本書的分析方法   11

2章實驗環境的搭建     13

2.1  GNU開發工具鏈的安裝       13

2.2  GNU開發工具鏈的使用       18

2.2.1  一個簡單的彙編程序         18

2.2.2  編譯及ELF文件介紹 19

2.2.3  連接    21

2.2.4  Makefile文件      23

2.2.5  使用OR1KSim模擬器運行程序         24

2.3  建立OR1200運行的最小系統     25

2.3.1  最小系統的建立         26

2.3.2  運行仿真    29

2.3.3  修改Makefile      30

2.3.4  觀察流水線         32

2.3.5  流水線介紹         33

2.4  本書的一些說明及定義        34

2.4.1  一些說明    34

2.4.2  一些定義    35

3  QMEM剖析     37

3.1  QMEM的做用        37

3.2  Wishbone總線快速瞭解       40

3.3  QMEMWishbone總線接口      43

3.3.1  QMEMCPUIMMU的鏈接          44

3.3.2  QMEMICache的鏈接   45

3.3.3  QMEMCPUDMMU的鏈接        46

3.3.4  QMEMDCache的鏈接 47

3.4  QMEM的內部RAM       49

3.5  復位後取第一條指令的過程分析        51

3.5.1  復位信號有效階段    51

3.5.2  復位信號無效後的第一個時鐘週期上升沿    56

3.5.3  復位信號無效後的第一個時鐘週期的組合邏輯階段    57

3.6  第二條及後續指令的讀取過程分析   58

3.6.1  復位信號無效後的第二個時鐘週期的上升沿         58

3.6.2  復位信號無效後的第二個時鐘週期的組合邏輯階段    59

4章數據處理類指令剖析     61

4.1  數據處理類指令說明   61

4.2  分析用例        65

4.3  流水線的簡單模型        67

4.4  l.add指令分析       69

4.4.1  l.add取指階段的組合邏輯輸出        70

4.4.2  l.add取指階段的時序邏輯輸出        73

4.4.3  l.add譯碼階段的組合邏輯輸出        75

4.4.4  l.add譯碼階段的時序邏輯輸出        80

4.4.5  l.add執行階段的組合邏輯輸出        91

4.4.6  l.add執行階段的時序邏輯輸出        97

4.4.7  第一條指令分析小結         98

4.5  l.sfeqi指令分析     99

4.5.1  l.sfeqi取指階段的組合邏輯輸出      99

4.5.2  l.sfeqi取指階段的時序邏輯輸出      100

4.5.3  l.sfeqi譯碼階段的組合邏輯輸出      100

4.5.4  l.sfeqi譯碼階段的時序邏輯輸出      101

4.5.5  l.sfeqi執行階段的組合邏輯輸出      102

4.5.6  l.sfeqi執行階段的時序邏輯輸出      105

4.5.7  第二條指令分析小結         106

4.6  ALU分析         106

4.7  流水線數據相關的解決方法        112

4.8  定製屬於本身的指令   117

4.9  不完整流水線數據通路圖   121

5章特殊寄存器訪問類指令剖析          123

5.1  OR1200中的特殊寄存器      123

5.2  0組特殊寄存器        125

5.3  特殊寄存器訪問類指令說明        127

5.4  分析用例        128

5.5  l.mfspr指令分析   130

5.5.1  l.mfspr取指階段的組合邏輯輸出    131

5.5.2  l.mfspr取指階段的時序邏輯輸出    132

5.5.3  l.mfspr譯碼階段的組合邏輯輸出    132

5.5.4  l.mfspr譯碼階段的時序邏輯輸出    133

5.5.5  l.mfspr執行階段第1個時鐘週期的組合邏輯輸出         135

5.5.6  l.mfspr執行階段第1個時鐘週期的時序邏輯輸出         138

5.5.7  l.mfspr執行階段第2個時鐘週期的組合邏輯輸出         141

5.5.8  l.mfspr執行階段第2個時鐘週期的時序邏輯輸出         144

5.5.9  l.mfspr指令分析小結         144

5.6  l.mtspr指令分析   145

5.6.1  l.mtspr執行階段的組合邏輯輸出    147

5.6.2  l.mtspr執行階段的時序邏輯輸出    148

5.7  SPRS分析       148

5.8  完善流水線數據通路圖        155

6章轉移類指令剖析     157

6.1  延遲槽   157

6.2  轉移類指令說明   158

6.3  分析用例        159

6.4  l.bf指令分析 161

6.4.1  l.bf取指階段的組合邏輯輸出  162

6.4.2  l.bf取指階段的時序邏輯輸出  163

6.4.3  l.bf譯碼階段的組合邏輯輸出  164

6.4.4  l.bf譯碼階段的時序邏輯輸出  166

6.4.5  l.bf執行階段第1個時鐘週期的組合邏輯輸出       169

6.4.6  l.bf執行階段第2個時鐘週期的組合邏輯輸出       173

6.4.7  l.bf執行階段第2個時鐘週期的時序邏輯輸出       174

6.4.8  l.bf指令分析小結       175

6.5  l.jalr指令分析        176

6.5.1  l.jalr取指階段的組合邏輯輸出         177

6.5.2  l.jalr取指階段的時序邏輯輸出         177

6.5.3  l.jalr譯碼階段的組合邏輯輸出         177

6.5.4  l.jalr譯碼階段的時序邏輯輸出         179

6.5.5  l.jalr執行階段第1個時鐘週期的組合邏輯輸出     180

6.5.6  l.jalr執行階段第2個時鐘週期的組合邏輯輸出     181

6.5.7  l.jalr執行階段第2個時鐘週期的時序邏輯輸出     182

6.6  轉移類指令對處理器效率的影響        182

6.7  繼續完善流水線數據通路圖        183

7章異常處理類指令剖析     185

7.1  OR1200中的異常分類 185

7.2  OR1200中的異常處理過程 185

7.3  異常處理類指令說明   187

7.4  分析用例        187

7.5  EXCEPTION模塊的做用         190

7.6  l.sys指令分析        195

7.6.1  l.sys取指階段的組合邏輯輸出         196

7.6.2  l.sys取指階段的時序邏輯輸出         196

7.6.3  l.sys譯碼階段的組合邏輯輸出         197

7.6.4  l.sys譯碼階段的時序邏輯輸出         198

7.6.5  l.sys執行階段的組合邏輯輸出         199

7.6.6  l.sys執行階段的時序邏輯輸出         201

7.6.7  異常處理過程——FLU1狀態   207

7.6.8  異常處理過程——FLU2狀態   211

7.6.9  異常處理過程——FLU3狀態   212

7.6.10  異常處理過程——FLU4狀態 212

7.6.11  異常處理過程——FLU5狀態 213

7.6.12  l.sys分析小結  214

7.7  l.trap指令分析      215

7.7.1  l.trap譯碼階段的時序邏輯輸出       216

7.7.2  l.trap執行階段的組合邏輯輸出       216

7.7.3  l.trap執行階段的時序邏輯輸出       216

7.7.4  異常處理過程——FLU1狀態   217

7.7.5  異常處理過程——FLU2狀態   217

7.7.6  l.trap分析小結  218

7.8  l.rfe指令分析         218

7.8.1  l.rfe取指階段的組合邏輯輸出          219

7.8.2  l.rfe取指階段的時序邏輯輸出          219

7.8.3  l.rfe譯碼階段的組合邏輯輸出          220

7.8.4  l.rfe譯碼階段的時序邏輯輸出          221

7.8.5  l.rfe執行階段第1個時鐘週期的組合邏輯輸出     223

7.8.6  l.rfe執行階段第2個時鐘週期的組合邏輯輸出     224

7.8.7  l.rfe執行階段第2個時鐘週期的時序邏輯輸出     225

7.9  繼續完善流水線數據通路圖        226

8章乘法、除法類指令剖析          228

8.1  串行乘法與並行乘法   228

8.1.1  串行乘法    228

8.1.2  並行乘法    229

8.2  串行除法與並行除法   230

8.2.1  串行除法    230

8.2.2  並行除法    231

8.3  乘法、除法類指令說明        232

8.4  OR1200中關於乘法、除法的一些配置      234

8.5  分析用例        234

8.6  l.mul指令分析(串行乘法)       238

8.6.1  l.mul取指階段的組合邏輯輸出        239

8.6.2  l.mul取指階段的時序邏輯輸出        240

8.6.3  l.mul譯碼階段的組合邏輯輸出        240

8.6.4  l.mul譯碼階段的時序邏輯輸出        241

8.6.5  l.mul執行階段第1個時鐘週期的組合邏輯輸出    243

8.6.6  l.mul執行階段第1個時鐘週期的時序邏輯輸出    245

8.6.7  l.mul執行階段第2個時鐘週期的組合邏輯輸出    247

8.6.8  l.mul執行階段第2個時鐘週期的時序邏輯輸出    249

8.6.9  l.mul執行階段第33個時鐘週期的時序邏輯輸出 250

8.6.10  l.mul執行階段第34個時鐘週期的組合邏輯輸出        250

8.6.11  l.mul執行階段第34個時鐘週期的時序邏輯輸出        252

8.6.12  l.mul執行階段第35個時鐘週期的時序邏輯輸出        252

8.6.13  l.mul分析小結 252

8.7  l.mul指令分析(並行乘法)       253

8.7.1  l.mul執行階段第1個時鐘週期的組合邏輯輸出(並行乘法)    253

8.7.2  l.mul執行階段第1個時鐘週期的時序邏輯輸出(並行乘法)    254

8.7.3  l.mul執行階段第2個時鐘週期的組合邏輯輸出(並行乘法)    255

8.7.4  l.mul執行階段第2個時鐘週期的時序邏輯輸出(並行乘法)    256

8.7.5  l.mul執行階段第3個時鐘週期的時序邏輯輸出(並行乘法)    256

8.7.6  l.mul執行階段第4個時鐘週期的組合邏輯輸出(並行乘法)    256

8.7.7  l.mul執行階段第4個時鐘週期的時序邏輯輸出(並行乘法)    257

8.7.8  l.mul執行階段第5個時鐘週期的時序邏輯輸出(並行乘法)    257

8.7.9  l.mul分析小結(並行乘法)   257

8.8  l.mac指令分析      257

8.8.1  l.mac執行階段第1個時鐘週期的組合邏輯輸出   259

8.8.2  l.mac執行階段第1個時鐘週期的時序邏輯輸出   260

8.8.3  l.mac執行階段第2個時鐘週期的組合邏輯輸出   261

8.8.4  l.mac執行階段第2個時鐘週期的時序邏輯輸出   261

8.8.5  l.mac執行階段第1個時鐘週期的時序邏輯輸出      262

8.8.6  l.mac執行階段第2個時鐘週期的時序邏輯輸出      262

8.8.7  l.mac指令分析小結  263

8.9  l.div指令分析(串行除法)         263

8.10  繼續完善流水線數據通路圖      266

9章加載存儲類指令剖析     268

9.1  加載存儲類指令說明   268

9.2  分析用例        270

9.3  l.sb指令分析          274

9.3.1  l.sb取指階段的組合邏輯輸出 276

9.3.2  l.sb取指階段的時序邏輯輸出 276

9.3.3  l.sb譯碼階段的組合邏輯輸出 276

9.3.4  l.sb譯碼階段的時序邏輯輸出 278

9.3.5  l.sb執行階段第1個時鐘週期的組合邏輯輸出      280

9.3.6  l.sb執行階段第2個時鐘週期的組合邏輯輸出      286

9.3.7  l.sb執行階段第2個時鐘週期的時序邏輯輸出      287

9.3.8  l.sb指令分析小結      287

9.4  l.lbs指令分析         288

9.4.1  l.lbs執行階段第1個時鐘週期的組合邏輯輸出     290

9.4.2  l.lbs執行階段第2個時鐘週期的組合邏輯輸出     291

9.4.3  l.lbs執行階段第2個時鐘週期的時序邏輯輸出     294

9.4.4  l.lbs指令分析小結     294

9.5  對齊異常處理流程        295

9.6  三級流水線仍是五級流水線        297

9.7  完整的流水線數據通路圖   298

10  MMU剖析     301

10.1  MMU的做用及工做過程   301

10.2  TLB的做用及工做過程       303

10.3  IMMU分析  305

10.3.1  IMMU結構       305

10.3.2  IMMU中的特殊寄存器   307

10.3.3  OR1200中關於IMMU的一些配置         308

10.3.4  ITLB代碼分析  309

10.3.5  IMMU使用情景       313

10.3.6  分析用例  313

10.3.7  IMMU使用情景之一——指令取指階段ITLB命中且無頁錯誤狀況下IMMU工做分析 324

10.3.8  IMMU使用情景之二——指令取指階段ITLB未命中狀況下IMMU工做分析 329

10.3.9  IMMU使用情景之三——指令取指階段ITLB命中但有頁錯誤狀況下IMMU工做分析 333

10.3.10  IMMU使用情景之四——l.mtspr執行階段IMMU工做分析    333

10.3.11  IMMU使用情景之五——l.mfspr執行階段IMMU工做分析    335

10.3.12  IMMU分析小結     336

10.4  DMMU分析         336

10.4.1  DTLB結構圖     337

10.4.2  DMMU中的特殊寄存器 337

10.4.3  DMMU使用情景      338

11章基於OR1200的一個簡單SOPC   340

11.1  簡單SOPC的結構        340

11.2  Wishbone總線互聯矩陣WB_CONMAX     341

11.3  掛接在互聯矩陣WB_CONMAX下的RAM模塊        342

11.4  SOPC頂層文件    344

11.5  ModelSim新建工程min_or1200_sopc       346

11.6  示例程序      348

12  ICache剖析   350

12.1  Cache基本知識  350

12.1.1  Cache的做用   350

12.1.2  Cache的結構與工做過程        351

12.2  OR1200Cache簡介         352

12.3  ICache結構 353

12.3.1  ICache模塊與其他模塊的鏈接關係       353

12.3.2  ICache中數據部分  354

12.3.3  ICache中控制部分  356

12.3.4  ICache數據部分與控制部分的對外接口       357

12.4  ICache中的特殊寄存器      358

12.5  ICache使用情景 358

12.6  分析用例      359

12.7  ICache使用情景之一——l.mtspr執行階段ICache工做分析         364

12.7.1  執行階段的組合邏輯輸出       364

12.7.2  執行階段的時序邏輯輸出       364

12.8  ICache使用情景之二——指令取指階段ICache失靶狀況下ICache工做分析    365

12.8.1  1個時鐘週期的組合邏輯輸出  365

12.8.2  1個時鐘週期的時序邏輯輸出  368

12.8.3  2個時鐘週期的組合邏輯輸出  370

12.8.4  2個時鐘週期的時序邏輯輸出  371

12.8.5  n個時鐘週期的組合邏輯輸出  373

12.8.6  n個時鐘週期的時序邏輯輸出  373

12.8.7  n+1個時鐘週期的組合邏輯輸出       375

12.8.8  2n個時鐘週期的組合邏輯輸出         376

12.8.9  2n個時鐘週期的時序邏輯輸出         377

12.8.10  2n+1個時鐘週期的組合邏輯輸出  378

12.8.11  3n個時鐘週期的組合邏輯輸出       379

12.8.12  3n個時鐘週期的時序邏輯輸出       379

12.8.13  3n+1個時鐘週期的組合邏輯輸出  379

12.8.14  4n個時鐘週期的組合邏輯輸出       379

12.8.15  4n個時鐘週期的時序邏輯輸出       380

12.8.16  4n+1個時鐘週期的組合邏輯輸出  380

12.8.17  ICache失靶時工做過程小結         381

12.9  ICache使用情景之三——指令取指階段ICache命中狀況下ICache工做分析    381

12.9.1  1個時鐘週期的組合邏輯輸出  382

12.9.2  1個時鐘週期的時序邏輯輸出  382

12.9.3  2個時鐘週期的組合邏輯輸出  383

12.10  ICache使用情景之四——指令取指階段內存頁禁止緩存狀況下ICache工做分析  384

12.10.1  1個時鐘週期的組合邏輯輸出         384

12.10.2  1個時鐘週期的時序邏輯輸出         385

12.10.3  2個時鐘週期的組合邏輯輸出         385

12.10.4  2個時鐘週期的時序邏輯輸出         386

12.10.5  3個時鐘週期的組合邏輯輸出         386

12.10.6  n個時鐘週期的組合邏輯輸出         387

12.10.7  n個時鐘週期的時序邏輯輸出         387

13  DCache剖析 389

13.1  DCache的特別之處    389

13.2  DCache結構         390

13.2.1  DCache模塊與其他模塊的鏈接關係     391

13.2.2  DCache中數據部分          392

13.2.3  DCache中控制部分          394

13.2.4  DCache數據部分與控制部分的對外接口     395

13.3  DCache中的特殊寄存器    396

13.4  DCache使用情景         397

13.5  分析用例      398

13.5.1  修改已有的簡單SOPC     398

13.5.2  分析用例  398

13.6  DMMU地址翻譯         405

13.7  DCache使用情景之一——存儲指令執行階段DCache失靶 405

13.7.1  通寫法下DCache工做過程分析    406

13.7.2  回寫法下DCache工做過程分析    413

13.8  DCache使用情景之二——存儲指令執行階段DCache命中 422

13.8.1  通寫法下DCache工做過程分析    422

13.8.2  回寫法下DCache工做過程分析    424

13.9  DCache使用情景之三——l.mtspr指令寫DCache中特殊寄存器 427

13.9.1  通寫法策略下指令l.mtsprDCBIRDCBFR的過程分析428

13.9.2  回寫法策略下指令l.mtsprDCBIR的過程分析         429

13.9.3  回寫法策略下指令l.mtsprDCBWR的過程分析       431

13.9.4  回寫法策略下指令l.mtsprDCBFR的過程分析         437

13.10  DCache分析小結      438

14  Store BufferSB)剖析        440

14.1  SB模塊的做用與工做過程         440

14.2  SB模塊的結構     441

14.2.1  SB模塊的對外鏈接關係 441

14.2.2  SB模塊內部結構      442

14.2.3  SB模塊有關的宏定義      442

14.3  示例程序      442

14.4  SB模塊代碼分析         444

14.4.1  FIFO分析  444

14.4.2  SB分析      447

15  WB_BIU剖析         450

15.1  WB_BIU模塊的對外鏈接關係   450

15.2  Wishbone寄存反饋總線週期     451

15.3  WB_BIU代碼分析       454

15.3.1  WB_BIU中的有限狀態機        455

15.3.2  總線時鐘與處理器時鐘不一樣時的處理代碼  462

16  PMTTPIC剖析        466

16.1  電源管理模塊PM分析       466

16.1.1  PM介紹    466

16.1.2  PM模塊的對外鏈接關係、特殊寄存器及相關宏定義         466

16.1.3  PM代碼分析    468

16.2  計時器單元TT分析    471

16.2.1  TT介紹      471

16.2.2  TT的對外鏈接關係及相關宏定義 472

16.2.3  TT代碼分析      473

16.2.4  計時器中斷響應過程       475

16.3  可編程中斷控制器PIC分析       477

16.3.1  PIC介紹    477

16.3.2  PIC的對外鏈接關係及相關宏定義         478

16.3.3  PIC代碼分析    479

做者簡介

雷思磊,理工男,好靜,倡導低碳生活,常以環保人士自居,喜讀書,自幼篤信「博觀而約取 厚積而薄發」,是故,所讀書籍甚爲駁雜,年近而立,尚不肯定根本興趣目標,一日,駐足書架以前,細覽所讀書籍,驚覺隨歲月增加,關注點依次從應用編程、操做系統、驅動設計轉移至處理器結構,此一脈絡極其清晰,遂如醍醐灌頂,幡然醒悟,原來餘根本興趣目標在「底層」,在於從根本上理解世界之運行,遂耗數年時間鑽研處理器工做原理,乃有些微收穫,拙做當爲數年辛苦之小結,然學無止境,科技發展亦突飛猛進,惟有持續鑽研,方能大成,屈子曰:路漫漫其修遠兮,吾將上下而求索。此言甚是,餘定謹記而遵行之。

前言

人看見我

就是看見了父

 

我就是道路、真理、生命

若不借着我

沒有人能到父那裏去

          ——《約翰福音》

 

如今看來,用上述語句形容1971年誕生的世界上第一款商用微處理器Intel4004,彷佛也是恰當的。從「人類歷史上最具革新性的產品之一」(戈登•摩爾語)的4004誕生至今,已過了四十多年,期間,處理器的應用範圍不斷擴展,滲透到各行各業,浸入人們的平常生活,極大地影響了第五次信息革命的進程。對其自身而言既有「變」也有「不變」,「變」的是處理器的性能,「不變」的是其高高在上的形象,處理器設計製造做爲國家信息產業的基石之一,一直都是高科技行業,輕易沒法涉足。幸運的是,隨着可編程硬件技術的持續發展,現在能夠經過編寫代碼實現處理器,出現了軟核處理器,它的出現使得尋常人士也能有機會了解處理器內部實現原理,甚至參與處理器的設計、研發。

軟核處理器有不少,好比:NiosIIOR1200LEON3OpenSparc等,本書選擇OR1200做爲分析對象,深度剖析其內部實現,理解其設計思路、工做過程。選擇OR1200的緣由有兩個:一方面OR1200是開源的;另外一方面,筆者在學習處理器的過程當中有一個體會,那就是「一通百通、融會貫通、取長補短、創新提升」。咱們的最終目的是瞭解處理器的實現原理,沒必要過多糾結於選擇哪一個、不選哪一個,處理器設計中不少問題都是相通的,深刻學習一款處理器,明白其架構,在這個過程當中能夠找到學習處理器的途徑,找到適合本身的學習方法,有了方法,再學其餘的處理器時就會順利不少,因此稱爲「一通百通」。

分析第一個處理器內部實現時,是抱着學習的態度,學第二個、第三個就應該在頭腦中造成一種比較的意識,比較這幾種處理器實現相同功能的部分爲什麼會有不一樣的設計方法,哪種性能更好,這就稱爲「融會貫通」。經過前面的兩步,咱們已經如牛頓那般站在巨人的肩膀上了,學習了各類處理器的設計原理,明白了各自優劣,在本身設計處理器的時候就能夠「取長補短」。此外,經過獨立思考,或者因爲不一樣設計思路的碰撞,可能會產生新的、更好的設計靈感,是謂「創新提升」。

 

寫做目的

尋找一個肯定性的世界

咱們信科學

咱們信邏輯

咱們信因果

咱們是理工男

科學的、邏輯的、因果的,最終表達的是肯定性。恐懼源於未知,人類科技活動的目的就是爲了探索未知,消除未知帶來的不肯定性,努力使得一切均可預測,都是肯定性的。固然,現實生活中各類因素使咱們個體所接觸的物質世界顯得如此的不肯定。從大的方面講,對於我的命運、社會變革這些宏大的命題,咱們都顯得眇小和茫然;從小的方面講,即便坐在對面的是本身的意中人,由於不知她(他)的心思,從而產生一種對肯定性喪失的焦慮和痛苦。這時咱們迫切地須要一種知足,一種對肯定性存在的知足,進而是一種理想的知足。筆者以爲這也是剖析處理器的魅力,處理器的世界就是一個肯定性的世界,從加電的那一刻開始,讀指令、執行、再讀指令、再執行,一切都是設計好的,精準、無誤、肯定。即便出現意外,也能夠獲得一個肯定的意外緣由。

     對好奇心的知足

人類進步的推進力量有兩個:懶惰、好奇。這不是玩笑,而是很嚴肅的話題,關於第一點,你們想一想洗衣機、電視、麥當勞就很容易理解了。第二點更好理解,看看嬰兒打量這個世界的眼神就知道好奇心是人類與生俱來的。爲何太陽東昇西落?爲何蘋果會掉下來?爲何燒開的水會把壺蓋頂起來?……每個爲何的提出及解答,都使得人類前進了一步。在IT行業,人們會問,爲何能夠經過計算機一邊聽音樂、一邊上網、一邊看電影?

不一樣的人會有不一樣的答案

A君:啊,這還有爲何啊,計算機原本就能夠這樣啊,不這樣還能叫計算機!

B君:這是多線程的效果。

C君:這是操做系統調度的緣由。

D君:這是因爲處理器在每一個時鐘中斷都會進入時鐘中斷處理例程,在其中切換進程。

A君的回答天真無邪,基本能夠判定這位同窗不是IT行業的。其餘三位同窗的答案一個比一個接近根本、接近底層、接近硬件,但好奇的咱們不由要多問一句:時鐘中斷是如何發生的?解答這個問題就須要深刻處理器內部實現了。

     對現有教科書的不滿

國內大多數計算機方面的教科書,常給人這麼一個體會:理論太多、實踐太少。操做系統、計算機體系結構、計算機組成原理等課程無不如此。過多的理論、過少的實踐,給學生帶來的問題是:容易紙上談兵;對具體知識的印象不深入;知其然,不知其因此然。所以,筆者想結合一款實用的處理器,深度剖析其內部設計實現,做爲現有教科書的一個補充。

 

適合誰讀

     適合對肯定性世界狂熱追求者閱讀。經過閱讀本書,讀者將發現,雖然處理器內部十分複雜,可是從加電的那一刻開始,它就按照預約程序運行,每一刻都是可預測的,都是肯定性的。

     適合對處理器內部實現有着強烈好奇心的朋友閱讀。本書經過對OR1200處理器的剖析,將使讀者全方位瞭解32RISC處理器設計。

     適合不知足於教科書的同窗閱讀。本書能夠做爲實踐參考書,幫助讀者理解書本上抽象的概念,同時培養讀者的動手能力。

     適合正在從事軟核處理器開發、設計的人員閱讀。本書將提供一些經驗、一些好的方法,幫助讀者作到事半功倍。

     適合正在從事嵌入式開發的人員閱讀,本書對處理器的一些介紹,有助於嵌入式開發。

 

內容安排

全書共16章,每章的主要內容以下。

1章簡單介紹了目前主要的開源軟核處理器,並作了對比,而後重點介紹了OR1200的架構、代碼組織,並對本書的分析方法進行了說明。

2章帶領讀者一步一步創建起實驗平臺、準備好實驗工具,有了平臺和工具的幫助,能夠更加方便地認識和理解OR1200的內部細節。

3章剖析了OR1200中的QMEM模塊,這是一個快速存儲器模塊,能夠在一個時鐘週期內讀取其中的指令,同時分析了復位結束後,指令的讀取過程,給出了一個理想的取指模型。

49章分別剖析了OR1200中數據處理類指令、特殊寄存器訪問類指令、轉移類指令、異常處理類指令、乘法/除法類指令和加載存儲類指令的處理過程。這些指令也是OR1200支持的所有指令,分析了這些指令的處理過程,也就明白了OR1200處理器中CPU模塊的內部結構、工做原理。在第9章最後給出一個完整的OR1200流水線數據通路圖,而49章中,對每一類指令處理過程的分析都採用相同的方法:首先寫一段簡單的測試代碼,測試代碼包含咱們即將分析的指令類別中的所有或部分指令,而後使用OR1KSim模擬器查看執行狀況,接下來對這一類指令中有表明性的若干條指令採用流水線驅動的方法進行分析,即分析指令處理過程當中,在流水線各個階段引發的信號變化,以及經過這些變化的信號是如何逐步實現指令目標的。

10章剖析了MMU模塊,採用的是情景分析法,即經過分析使用該模塊的各類情景及各類情景下模塊的工做過程,達到了解該模塊原理的目的。

11章創建了一個基於OR1200的簡單SOPC,後續章節將藉助該SOPC分析OR1200中的指令Cache、數據Cache等模塊。

1213章分別剖析了OR1200中的指令Cache、數據Cache,採用的是情景分析法。

14章剖析了Store Buffer模塊,採用的是直接分析源代碼的方式。

15章剖析了OR1200處理器與外部Wishbone總線鏈接的接口模塊WB_BIU,採用的是情景分析法。

16章剖析了電源管理模塊、計時器單元、可編程中斷控制器,因爲比較簡單,採用的都是直接分析源代碼的方式。

 

寫做原則

     不惟上、不惟下,只惟實

要保持質疑,哪怕對方是所謂的權威。本書對OR1200的一些介紹可能與OR1200手冊及其餘學者的觀點不一樣,好比:本書認爲OR1200是三級流水線。OR1200手冊上認爲是五級流水線,筆者在源代碼的剖析中發現這種說法並不充分,在第9章給出理由以佐證筆者的觀點,整本書也是按照三級流水線進行分析的。同時,本書指出了源代碼中的一些錯誤,有些多是筆誤,有些就是設計缺陷(如:QMEM的設計)。

     像剝洋蔥似的,一步步接近核心

OR1200是一個系統、一個總體,各個模塊之間的聯繫很緊密,而且相互影響。最開始,只給出了一種理想狀況,也是OR1200大部分時候的運行狀況,後面分析到某些指令、某些場景的時候,會具體分析這些指令、場景是如何影響這個理想狀況的。好比:第3章給出了一個理想的取指過程,在後續章節,當分析系統調用指令l.sys的時候,就會介紹l.sys對這個取指過程的影響;分析轉移指令l.bf的時候,就會介紹l.bf對這個取指過程的影響;分析特殊寄存器讀指令l.mfspr的時候,就會介紹l.mfspr對這個取指過程的影響。經過這樣一步一步的探索,由簡到繁,由不求甚解到全面瞭解,最後揭示得出結論,而不是直接給出結論,再分析得出這個結論的理由。筆者認爲前者更符合咱們認識事物的規律。

     依據不一樣的分析對象使用合適的分析方法

在內容安排中能夠發現,本書針對不一樣的模塊,依據具體狀況,採用了不一樣的分析方法,主要有:流水線驅動的分析方法、場景分析法和直接分析源代碼的方法。

     適量重複

在分析過程當中,爲了直觀,本書大量採用了表格化的顯示方法,表格中列出了當前階段的主要變化信號,包括信號的做用說明,其中有不少信號可能在以前的表格中出現過,但筆者仍然在新的表格中重複給出這個信號的做用說明。這樣適量的重複,加強了各章之間的獨立性,尤爲是第59章,便於讀者選擇性閱讀。

     感性與理性結合

除了對代碼進行分析,本書還使用ModelSim進行仿真,經過ModelSim仿真結果能夠直觀地觀察到任意時刻處理器內部任一信號的狀態,既驗證了代碼分析的正確性,也使讀者加深了印象。

 

本書特點

1)國內第一本採用指令驅動分析法、流水線驅動分析法和情景分析法對一款成熟的32位軟核處理器進行分析的圖書,經過對流水線、MMUCache等處理器內部重要功能單元的分析,有效消除了處理器的神祕感。

2)國內第一本採用實驗的方法對處理器設計中的一些重要思想進行闡釋的書,如:經過實驗,給出了存儲操做在Cache存在、Cache不存在時的區別,從而使讀者能夠更加深入地體會到Cache的做用。

3)國內第一本對OR1200處理器進行全面、詳細介紹的圖書。

閱讀方法

針對不一樣的閱讀須要,能夠有粗讀、精讀兩種閱讀方法。

     粗讀

該方法適合但願快速理解處理器內部工做原理的讀者使用,這些讀者可能更關心處理器在流水線每一個階段的主要工做,而不關心這個工做是如何實現的。所以,本書在流水線每個階段分析結束的時候,都會給出一個表格,列出本階段變化信號,其中重要的變化信號都使用「加粗斜體」來強調,這些重要變化信號的做用就反映了處理器在本階段的主要工做,讀者只需關注每一個階段分析結束時的表格便可,從而達到快速理解處理器內部工做原理之目的。

     精讀

該方法適合不只但願知道處理器在流水線每一個階段的主要工做是什麼,並且但願知道這個工做是如何實現的讀者使用。這種方法固然比較辛苦,也比較耗時,然而讀書無捷徑,任何知識的獲取都是要下一番苦功夫的。

引用餘秋雨先生的話與讀者共勉:

閱讀的最大理由是想擺脫平庸

早一天就多一份人生的精彩

遲一天就多一天平庸的困擾

 

致謝

OR1200的諸位做者Damjan LampretJulius Baxter等致敬,正是因爲大家的辛苦工做和無私奉獻,爲咱們打開了一扇窗,有機會進入另外一個世界。

筆者第一次與博文視點合做,博文視點幹練、敏捷的工做做風給筆者留下了深入的印象,在此特別感謝孫學瑛老師,正是因爲孫老師的出謀劃策、辛苦工做才使得本書可以及時發行。

感謝酒泉衛星發射中心通訊總站的各位領導、同事,雖然咱們處在戈壁灘上,天然條件惡劣,可是咱們共同從事的是一項偉大的事業,這一事業將咱們牢牢聯繫在一塊兒。若干年後,當我老得哪兒也去不了的時候,這一定將成爲一段珍貴的回憶。

感謝個人好友張世偉老師在百忙之中閱讀了本書,並提出許多寶貴的修改意見。

最後,感謝個人爸爸、媽媽、姐姐、姐夫,以及可愛的外甥女,任何成績的取得都離不開家人的付出,謝謝大家!

筆者學識有限,儘管已通讀數次,但仍不能保證書中無一紕漏,歡迎各位讀者朋友對本書提出批評、建議,能夠經過郵箱leishangwen@163.com與筆者交流。

相關文章
相關標籤/搜索