预购商品
书目分类
特别推荐
基於RISC-V和Chisel講解自定義CPU的實現。 《CPU製作入門:基於RISC-V和Chisel》分為5個部分,立足於CPU、存儲器、計算機架構等基礎知識,逐步帶領讀者實現簡單的加減法、分支、比較等基礎指令,理解流水線對於CPU高速化的重要意義及實現,最後應用向量擴展語言實現自定義CPU。 要提醒的是,《CPU製作入門:基於RISC-V和Chisel》所指的“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 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 64 4.3.2 Consts.scala 66 第Ⅱ部分要實現的指令和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 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文件的創建 164 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
客服公告
热门活动
订阅电子报