本书系统介绍了CPU设计的发展过程、每个开发环节的知识要点、开发过程中需要注意的工程问题等。通过学习这本书,读者可以自己设计一个具有基本功能的CPU。这本书的内容是循序渐进的,从CPU设计的基础知识到简单流水线CPU的设计、多周期流水线中央处理器、缓存,并增加主频、运行Linux内核等高级功能,让读者逐渐掌握CPU设计的方法和要点。本书适用于大学计算机及相关专业计算机、对CPU开发感兴趣的读者也可以阅读计算机体系结构等课程的实用教材。
封面图
目录
- 丛书序言
- 序
- 前言
- 第1章CPU芯片研发过程概述 1
- 1.1处理器和处理器核 1
- 1.2芯片产品的研制过程 2
- 1.3芯片设计的工作阶段 3
- 第2章硬件实验平台及FPGA设计流程 5
- 2.1硬件实验平台 5
- 2.1.1龙芯CPU设计与体系结构教学实验系统 5
- 2.1.2龙芯计算机系统能力培养远程实验平台 7
- 2.2FPGA的设计流程 8
- 2.2.1FPGA的一般设计流程 9
- 2.2.2基于Vivado的FPGA设计流程 10
- 2.2.3Vivado使用小贴士 33
- 2.3任务与实践 35
- 第3章数字逻辑电路设计基础 36
- 3.1数字逻辑电路设计与Verilog代码开发 36
- 3.1.1面向硬件电路的设计思维方式 37
- 3.1.2行为描述的Verilog编程风格 38
- 3.1.3自顶向下的设计划分过程 38
- 3.1.4常用数字逻辑电路的Verilog描述 39
- 3.2数字逻辑电路功能仿真的常见错误及其调试方法 55
- 3.2.1功能仿真波形分析 56
- 3.2.2波形异常类错误的调试 60
- 3.3进一步使用Vivado 66
- 3.3.1定制同步RAM IP核 66
- 3.3.2定制异步RAM IP核 68
- 3.3.3查看时序结果和资源利用率 69
- 3.4任务与实践 69
- 3.4.1实践任务一:寄存器堆仿真 70
- 3.4.2实践任务二:同步RAM和异步RAM仿真、综合与实现 71
- 3.4.3实践任务三:数字逻辑电路的设计与调试 72
- 第4章简单流水线CPU设计 74
- 4.1设计一个简单的单周期CPU 75
- 4.1.1设计单周期CPU的总体思路 75
- 4.1.2单周期CPU的数据通路设计 76
- 4.1.3单周期CPU的控制信号生成 88
- 4.1.4复位的处理 91
- 4.2不考虑相关冲突的流水线CPU设计 92
- 4.2.1添加流水级间缓存 92
- 4.2.2同步RAM的引入 93
- 4.2.3调整更新PC的数据通路 96
- 4.2.4不考虑相关冲突情况下流水线控制信号的设计 96
- 4.3CPU设计开发环境(CPU_CDE) 97
- 4.3.1快速上手CPU设计的开发环境 97
- 4.3.2CPU设计开发环境的组织与结构 99
- 4.3.3CPU设计开发环境使用进阶 113
- 4.4CPU设计的功能仿真调试技术 117
- 4.4.1为什么要用基于Trace比对的调试辅助手段 117
- 4.4.2基于Trace比对调试手段的盲区及其对策 119
- 4.4.3学会阅读汇编程序和反汇编代码 119
- 4.4.4CPU调试中要抓取的信号以及如何看这些信号 124
- 4.5指令相关与流水线冲突 125
- 4.5.1处理寄存器写后读数据相关引发的流水线冲突 126
- 4.5.2转移计算未完成 127
- 4.6流水线数据的前递设计 127
- 4.6.1前递的数据通路设计 128
- 4.6.2前递的流水线控制信号调整 130
- 4.6.3前递引发的主频下降 131
- 4.7任务与实践 131
- 4.7.1实践任务一:简单CPU参考设计调试 132
- 4.7.2实践任务二:用阻塞技术解决相关引发的冲突 132
- 4.7.3实践任务三:用前递技术解决相关引发的冲突 133
- 第5章在流水线中添加运算类指令 134
- 5.1算术逻辑运算类指令的添加 134
- 5.1.1ADD、ADDI和SUB指令的添加 134
- 5.1.2SLTI和SLTIU指令的添加 135
- 5.1.3ANDI、ORI和XORI指令的添加 135
- 5.1.4SLLV、SRLV和SRAV指令的添加 135
- 5.2乘除法运算类指令的添加 136
- 5.2.1调用Xilinx IP实现乘除法运算部件 136
- 5.2.2电路级实现乘法器 140
- 5.2.3电路级实现除法器 147
- 5.3乘除法配套数据搬运指令的添加 154
- 5.3.1乘法运算实现为单周期的情况 155
- 5.3.2乘法运算实现为多周期流水的情况 155
- 5.4任务与实践 156
- 第6章在流水线中添加转移指令和访存指令 157
- 6.1转移指令的添加 157
- 6.1.1BGEZ、BGTZ、BLEZ和BLTZ指令 158
- 6.1.2J指令 158
- 6.1.3BLTZAL和BGEZAL指令 158
- 6.1.4JALR指令 158
- 6.2访存指令的添加 158
- 6.2.1LB、LBU、LH和LHU指令的添加 158
- 6.2.2SB和SH指令的添加 159
- 6.2.3非对齐访存指令的说明 160
- 6.2.4LWL和LWR指令的添加 162
- 6.2.5SWL和SWR指令的添加 164
- 6.3任务与实践 164
- 第7章例外和中断的支持 166
- 7.1例外和中断的基本概念 166
- 7.1.1例外是一套软硬件协同处理的机制 166
- 7.1.2精确例外 167
- 7.2MIPS指令系统中与例外相关的功能定义 168
- 7.2.1CP0寄存器 168
- 7.2.2例外产生条件的判定 168
- 7.2.3例外入口 170
- 7.2.4MFC0和MTC0指令 170
- 7.2.5ERET指令 170
- 7.3流水线CPU实现例外和中断的设计要点 170
- 7.3.1例外检测逻辑 170
- 7.3.2精确例外的实现 172
- 7.3.3CP0寄存器 173
- 7.3.4CP0冲突 179
- 7.4任务与实践 180
- 7.4.1实践任务一:添加syscall例外支持 181
- 7.4.2实践任务二:添加其他例外支持 181
- 第8章AXI总线接口设计 184
- 8.1类SRAM总线 184
- 8.1.1主方和从方 185
- 8.1.2类SRAM总线接口信号的定义 185
- 8.1.3类SRAM总线的读写时序 186
- 8.1.4类SRAM总线的约束 189
- 8.2类SRAM总线的设计 189
- 8.2.1取指设计的考虑 190
- 8.2.2访存设计的考虑 195
- 8.3AXI总线协议 195
- 8.3.1AXI总线信号一览 195
- 8.3.2理解AXI总线协议 197
- 8.3.3类SRAM总线接口信号与AXI总线接口信号的关系 202
- 8.4类SRAM-AXI的转接桥设计 203
- 8.4.1转接桥的顶层接口 203
- 8.4.2转接桥的设计要求 204
- 8.4.3转接桥的设计建议 204
- 8.5任务与实践 205
- 8.5.1实践任务一:添加类SRAM总线支持 205
- 8.5.2实践任务二:添加AXI总线支持 208
- 8.5.3实践任务三:完成AXI随机延迟验证 210
- 第9章TLB MMU设计 211
- 9.1TLB模块的基础知识 212
- 9.1.1TLB的虚实地址转换 212
- 9.1.2TLB的软件访问 214
- 9.1.3TLB的软硬件交互机制 215
- 9.2TLB模块设计的分析 217
- 9.3TLB相关的CP0寄存器与指令的实现 219
- 9.4利用TLB进行虚实地址转换及TLB例外 221
- 9.5任务与实践 222
- 9.5.1实践任务一:TLB模块设计 222
- 9.5.2实践任务二:添加TLB相关指令和CP0寄存器 224
- 9.5.3实践任务三:添加TLB相关例外支持 225
- 第10章高速缓存设计 226
- 10.1Cache模块的设计 227
- 10.1.1Cache的设计规格 227
- 10.1.2Cache模块的数据通路设计 228
- 10.1.3Cache模块内部的控制逻辑设计 237
- 10.1.4Cache的硬件初始化问题 241
- 10.2将Cache模块集成至CPU中 242
- 10.2.1Cache命中情况下的CPU流水线适配 242
- 10.2.2Cache缺失情况下的CPU流水线适配 243
- 10.2.3Uncache访问的处理 243
- 10.3CACHE指令 245
- 10.3.1CACHE指令的定义 245
- 10.3.2CACHE指令的实现 247
- 10.4性能测试程序 247
- 10.4.1Dhrystone 247
- 10.4.2Coremark 250
- 10.5Cache的性能 251
- 10.6任务与实践 252
- 10.6.1实践任务一:Cache模块设计 252
- 10.6.2实践任务二:在CPU中集成ICache 254
- 10.6.3实践任务三:在CPU中集成DCache 255
- 10.6.4实践任务四:在CPU中添加CACHE指令 256
- 第11章进阶设计 258
- 11.1运行Linux内核 258
- 11.1.1复杂SoC搭建 259
- 11.1.2CPU的进一步完善 259
- 11.1.3调试建议 260
- 11.2提升主频的常用方法 261
- 11.2.1平衡各级流水线的延迟 261
- 11.2.2优化大概率事件的处理逻辑 261
- 11.2.3用面积和功耗换时序 262
- 11.2.4进一步切分流水线 262
- 11.3静态双发射流水线的实现 262
- 11.4动态调度机制的实现 263
- 11.4.1一个双发射动态调度流水线的设计实例 263
- 11.4.2动态调度中常见电路结构的RTL实现 266
- 11.5硬件转移预测技术 266
- 11.5.1硬件转移预测的流水线设计框架 267
- 11.5.2一个轻量级转移预测器的设计规格 268
- 11.6访存优化技术 269
- 11.6.1store buffer 269
- 11.6.2Non-blocking Cache 270
- 11.6.3访存乱序执行 271
- 11.6.4多级Cache 271
- 11.6.5Cache预取 272
- 11.7多核处理器的实现 272
- 11.7.1多核互联结构 273
- 11.7.2多核编号 273
- 11.7.3核间中断 273
- 11.7.4多核情况下的存储一致性 274
- 11.7.5LL-SC指令对的访存原子性 282
- 附录A龙芯CPU设计与体系结构教学实验系统 285
- 附录BVivado的安装 288
- 附录C简单MIPS指令系统规范 301
- 附录DVivado使用进阶 345