CPU设计实战:LoongArch版 / 计算机类专业系统能力培养系列教材
定价:¥99.00
作者: 汪文祥,邢金璋
出版时间:2024-07
最新印次日期:2025-9
出版社:机械工业出版社
试读
- 机械工业出版社
- 9787111751915
- 1-2
- 535334
- 49260119-0
- 平装
- 16开
- 2024-07
- 485
- 工学
- 计算机类
- 计算机类
- 本科
内容简介
本书深入浅出地介绍了如何从零开始一步步设计出一个入门级的CPU,以及在这个过程中应该掌握哪些知识、遵守哪些设计原则、规避哪些设计风险、可以使用哪些开发技巧。全书从逻辑上分为三个部分,第一部分(第1~3章)介绍产业界进行CPU研发的过程以及本地与远程 FPGA实验平台、FPGA上板实现、Verilog应用实例等CPU设计中必要的基础知识。第二部分(第4~10章)从一个仅实现5条指令的单周期CPU设计开始,逐步引入流水线设计,添加指令,增加异常和中断的支持,并完成AXI总线接口、TLB MMU 和高速缓存的设计与实现,最终完成一个入门级的CPU的设计。第三部分(第11~12章)为准备进阶设计的读者给出一些指导和建议,包括进阶实验开发环境与常用的设计优化方案。本书适合作为高校计算机及相关专业计算机组成、计算机体系结构等课程的实践教材,也可供对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 龙芯普及型系统能力培养
远程实验平台 8
2.2 FPGA的设计流程 9
2.2.1 FPGA的一般设计流程 9
2.2.2 基于Vivado的FPGA
实现流程 11
2.2.3 Vivado使用小贴士 12
2.3 任务与实践 13
2.3.1 本书配套实验环境 13
2.3.2 实践任务1:跑马灯 14
第3章 数字逻辑电路设计基础 15
3.1 数字逻辑电路设计与Verilog
代码开发 15
3.1.1 面向硬件电路的设计思维
方式 16
3.1.2 自顶向下的设计划分
过程 17
3.1.3 行为描述的Verilog编程
风格 18
3.1.4 常用数字逻辑电路的
Verilog描述 19
3.2 数字逻辑电路功能仿真的常见
错误及调试方法 36
3.2.1 功能仿真波形分析 37
3.2.2 波形异常类错误的调试 43
3.3 任务与实践 49
3.3.1 实践任务2:寄存器堆
仿真 49
3.3.2 实践任务3:同步RAM
和异步RAM仿真、综合
与实现 50
3.3.3 实践任务4:数字逻辑
电路的设计与调试 52
第4章 单周期CPU设计 54
4.1 设计一个5条指令的单周期
CPU 55
4.1.1 设计CPU的总体思路 55
4.1.2 5条指令单周期CPU数据
通路设计 57
4.1.3 5条指令单周期CPU控制
信号生成 69
4.2 验证5条指令的单周期CPU 71
4.2.1 5条指令单周期CPU实验
开发环境快速上手 71
4.2.2 minicpu_env实验开发
环境组织结构介绍 73
4.2.3 功能仿真验证 73
4.3 设计一个20条指令的单周期
CPU 75
4.3.1 新增ALU类指令的数据
通路设计 76
4.3.2 新增Branch类指令的
数据通路设计 80
4.3.3 新增指令后控制信号的
调整 83
4.4 验证20条指令的单周期
CPU 87
4.4.1 mycpu_env实验开发
环境组织结构介绍 88
4.4.2 基于trace比对的调试
框架 89
4.4.3 func功能测试程序 93
4.4.4 基于mycpu_env实验
开发环境的实验流程 102
4.4.5 mycpu_env实验开发
环境使用进阶 104
4.5 CPU设计实验功能仿真调试
技术 106
4.5.1 为什么要用基于trace
比对的调试辅助手段 106
4.5.2 基于trace比对调试手段
的“盲区”及对策 107
4.5.3 学会阅读汇编程序和
反汇编代码 108
4.6 任务与实践 113
4.6.1 实践任务5:5条指令
单周期CPU 114
4.6.2 实践任务6:20条指令
单周期CPU 114
第5章 简单流水线CPU设计 116
5.1 不考虑相关冲突的流水线CPU
设计 117
5.1.1 添加流水级间缓存 117
5.1.2 同步读RAM的引入 118
5.1.3 调整更新PC的数据
通路 121
5.1.4 不考虑相关冲突
情况下流水线控制
信号的设计 121
5.1.5 复位的处理 122
5.2 指令相关与流水线冲突 123
5.2.1 处理寄存器写后读数据
相关引发的流水线冲突 124
5.2.2 处理控制相关 125
5.3 流水线数据前递设计 128
5.3.1 前递的数据通路设计 128
5.3.2 前递的流水线控制信号
调整 131
5.3.3 前递引发的主频下降 132
5.4 CPU设计实验功能仿真调试
技术进阶 133
5.4.1 valid和PC信号
不能少 133
5.4.2 各流水线信号分组有序
摆放 133
5.4.3 先遍历指令再遍历
流水线 134
5.5 任务与实践 134
5.5.1 实践任务7:不考虑相关
引发的冲突的简单流水线CPU 135
5.5.2 实践任务8:阻塞技术
解决相关引发的冲突 136
5.5.3 实践任务9:前递技术
解决相关引发的冲突 137
第6章 在流水线中添加普通
用户态指令 139
6.1 算术逻辑运算类指令的添加 139
6.1.1 slti和sltui指令的添加 140
6.1.2 andi、ori和xori指令的
添加 140
6.1.3 sll.w、srl.w和sra.w
指令的添加 141
6.1.4 pcaddu12i指令的添加 141
6.2 乘除法运算类指令的添加 141
6.2.1 调用Xilinx IP实现乘除法
运算部件 142
6.2.2 电路级实现乘法器 146
6.2.3 电路级实现除法器 154
6.3 转移指令的添加 161
6.4 访存指令的添加 162
6.4.1 ld.b、ld.h、ld.bu、ld.hu
指令的添加 162
6.4.2 st.b、st.h指令的添加 164
6.5 任务与实践 165
6.5.1 实践任务10:算术逻辑
运算指令和乘除法运算
指令添加 165
6.5.2 实践任务11:转移指令
和访存指令添加 166
第7章 异常和中断的支持 168
7.1 异常和中断的基本概念 168
7.1.1 异常是一套软硬件协同
处理的机制 169
7.1.2 精确异常 169
7.2 LoongArch指令系统中与异常
相关的功能定义 170
7.2.1 控制状态寄存器 170
7.2.2 异常产生条件的判定 171
7.2.3 响应异常后硬件的一般
处理过程 174
7.2.4 异常处理返回指令 174
7.2.5 CSR读写指令 175
7.3 流水线CPU实现异常和中断的
设计要点 175
7.3.1 异常检测逻辑的实现 175
7.3.2 精确异常的实现 177
7.3.3 控制状态寄存器的实现 178
7.3.4 处理控制状态寄存器
相关引发的冲突 186
7.4 其他指令的实现 188
7.5 任务与实践 188
7.5.1 实践任务12:添加系统
调用异常支持 188
7.5.2 实践任务13:添加其他
异常与中断支持 189
第8章 AXI总线接口设计 191
8.1 类SRAM总线 192
8.1.1 主方和从方 192
8.1.2 类SRAM总线接口
信号的定义 192
8.1.3 类SRAM总线的读写
时序 194
8.1.4 类SRAM总线的约束 197
8.2 类SRAM总线的设计 198
8.2.1 取指设计的考虑 198
8.2.2 访存设计的考虑 203
8.3 AXI总线协议 204
8.3.1 AXI总线信号一览 204
8.3.2 AXI总线协议的初步
解读 206
8.3.3 类SRAM总线接口信号
与AXI总线接口信号的
关系 212
8.4 类SRAM-AXI的转接桥设计 212
8.4.1 转接桥的顶层接口 212
8.4.2 转接桥的设计要求 213
8.4.3 转接桥的设计建议 214
8.5 任务与实践 215
8.5.1 实践任务14:添加类
SRAM总线支持 215
8.5.2 实践任务15:添加AXI
总线支持 219
8.5.3 实践任务16:完成AXI
随机延迟验证 220
第9章 存储管理单元设计 222
9.1 存储管理单元相关规范定义
梳理 223
9.2 TLB模块设计分析 224
9.3 MMU相关CSR与指令的
实现 229
9.3.1 MMU的CSR相关引发
的冲突处理 229
9.3.2 TLB相关指令的实现 230
9.4 利用MMU进行虚实地址转换
及MMU相关异常的实现 231
9.5 任务与实践 233
9.5.1 实践任务17:设计TLB
模块 233
9.5.2 实践任务18:添加TLB
相关指令和CSR 235
9.5.3 实践任务19:添加TLB
相关异常支持 236
第10章 Cache设计 238
10.1 Cache模块的设计 239
10.1.1 Cache的设计规格 239
10.1.2 Cache模块的数据通路
设计 241
10.1.3 Cache模块内部的控制
逻辑设计 250
10.1.4 Cache的硬件初始化
问题 255
10.2 将Cache集成至CPU中 256
10.2.1 Cache命中情况下的
CPU流水线适配 256
10.2.2 Cache缺失情况下的
CPU流水线适配 257
10.2.3 非缓存访问的处理 257
10.3 Cache维护指令 259
10.4 任务与实践 259
10.4.1 实践任务20:Cache
模块设计 260
10.4.2 实践任务21:在CPU
中集成ICache 262
10.4.3 实践任务22:在CPU
中集成DCache 263
10.4.4 实践任务23:在CPU
中添加CACOP指令 264
第11章 进阶实验开发环境 265
11.1 chiplab开发环境组织与
构成 266
11.2 chiplab开发环境的推荐
使用方式 267
11.3 软件仿真功能验证 269
11.3.1 固定测试程序验证 269
11.3.2 随机指令测试程序
验证 274
11.3.3 基于差分测试的调试
辅助机制 277
11.4 FPGA上板功能验证 280
11.4.1 FPGA综合实现 280
11.4.2 在FPGA上运行Linux
操作系统 281
第12章 进阶设计 290
12.1 提升主频的常用方法 291
12.1.1 平衡各级流水线的
延迟 291
12.1.2 针对大概率事件优化
逻辑 291
12.1.3 用面积和功耗换时延 292
12.1.4 进一步切分流水线 293
12.1.5 主频提升技术实现
示例 293
12.2 超标量流水线的实现 294
12.2.1 超标量流水线前端
设计要点 295
12.2.2 静态调度超标量流水线
后端设计要点 296
12.3 动态调度机制的实现 296
12.3.1 动态调度机制设计要点
提示 298
12.3.2 动态调度中常见电路
结构的RTL实现 301
12.4 硬件转移预测技术 302
12.4.1 硬件转移预测的流水线
设计框架 302
12.4.2 一个轻量级转移预测器
设计规格 304
12.5 访存优化技术 305
12.5.1 写缓存 305
12.5.2 非阻塞式高速缓存 306
12.5.3 访存乱序执行 307
12.5.4 多级Cache 308
12.5.5 Cache预取 308
12.6 多核处理器的实现 309
12.6.1 多核互联结构 309
12.6.2 多核编号 310
12.6.3 核间中断 310
12.6.4 多核情况下的存储
一致性 311
12.6.5 缓存一致性协议 312
12.6.6 ll.w-sc.w指令对的访存
原子性 320
附录 323
附录A 龙芯CPU设计与体系结构
教学实验系统 323
附录B Vivado的安装 327
附录C Vivado使用入门 337
附录D Vivado使用进阶 361
序
前言
第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 龙芯普及型系统能力培养
远程实验平台 8
2.2 FPGA的设计流程 9
2.2.1 FPGA的一般设计流程 9
2.2.2 基于Vivado的FPGA
实现流程 11
2.2.3 Vivado使用小贴士 12
2.3 任务与实践 13
2.3.1 本书配套实验环境 13
2.3.2 实践任务1:跑马灯 14
第3章 数字逻辑电路设计基础 15
3.1 数字逻辑电路设计与Verilog
代码开发 15
3.1.1 面向硬件电路的设计思维
方式 16
3.1.2 自顶向下的设计划分
过程 17
3.1.3 行为描述的Verilog编程
风格 18
3.1.4 常用数字逻辑电路的
Verilog描述 19
3.2 数字逻辑电路功能仿真的常见
错误及调试方法 36
3.2.1 功能仿真波形分析 37
3.2.2 波形异常类错误的调试 43
3.3 任务与实践 49
3.3.1 实践任务2:寄存器堆
仿真 49
3.3.2 实践任务3:同步RAM
和异步RAM仿真、综合
与实现 50
3.3.3 实践任务4:数字逻辑
电路的设计与调试 52
第4章 单周期CPU设计 54
4.1 设计一个5条指令的单周期
CPU 55
4.1.1 设计CPU的总体思路 55
4.1.2 5条指令单周期CPU数据
通路设计 57
4.1.3 5条指令单周期CPU控制
信号生成 69
4.2 验证5条指令的单周期CPU 71
4.2.1 5条指令单周期CPU实验
开发环境快速上手 71
4.2.2 minicpu_env实验开发
环境组织结构介绍 73
4.2.3 功能仿真验证 73
4.3 设计一个20条指令的单周期
CPU 75
4.3.1 新增ALU类指令的数据
通路设计 76
4.3.2 新增Branch类指令的
数据通路设计 80
4.3.3 新增指令后控制信号的
调整 83
4.4 验证20条指令的单周期
CPU 87
4.4.1 mycpu_env实验开发
环境组织结构介绍 88
4.4.2 基于trace比对的调试
框架 89
4.4.3 func功能测试程序 93
4.4.4 基于mycpu_env实验
开发环境的实验流程 102
4.4.5 mycpu_env实验开发
环境使用进阶 104
4.5 CPU设计实验功能仿真调试
技术 106
4.5.1 为什么要用基于trace
比对的调试辅助手段 106
4.5.2 基于trace比对调试手段
的“盲区”及对策 107
4.5.3 学会阅读汇编程序和
反汇编代码 108
4.6 任务与实践 113
4.6.1 实践任务5:5条指令
单周期CPU 114
4.6.2 实践任务6:20条指令
单周期CPU 114
第5章 简单流水线CPU设计 116
5.1 不考虑相关冲突的流水线CPU
设计 117
5.1.1 添加流水级间缓存 117
5.1.2 同步读RAM的引入 118
5.1.3 调整更新PC的数据
通路 121
5.1.4 不考虑相关冲突
情况下流水线控制
信号的设计 121
5.1.5 复位的处理 122
5.2 指令相关与流水线冲突 123
5.2.1 处理寄存器写后读数据
相关引发的流水线冲突 124
5.2.2 处理控制相关 125
5.3 流水线数据前递设计 128
5.3.1 前递的数据通路设计 128
5.3.2 前递的流水线控制信号
调整 131
5.3.3 前递引发的主频下降 132
5.4 CPU设计实验功能仿真调试
技术进阶 133
5.4.1 valid和PC信号
不能少 133
5.4.2 各流水线信号分组有序
摆放 133
5.4.3 先遍历指令再遍历
流水线 134
5.5 任务与实践 134
5.5.1 实践任务7:不考虑相关
引发的冲突的简单流水线CPU 135
5.5.2 实践任务8:阻塞技术
解决相关引发的冲突 136
5.5.3 实践任务9:前递技术
解决相关引发的冲突 137
第6章 在流水线中添加普通
用户态指令 139
6.1 算术逻辑运算类指令的添加 139
6.1.1 slti和sltui指令的添加 140
6.1.2 andi、ori和xori指令的
添加 140
6.1.3 sll.w、srl.w和sra.w
指令的添加 141
6.1.4 pcaddu12i指令的添加 141
6.2 乘除法运算类指令的添加 141
6.2.1 调用Xilinx IP实现乘除法
运算部件 142
6.2.2 电路级实现乘法器 146
6.2.3 电路级实现除法器 154
6.3 转移指令的添加 161
6.4 访存指令的添加 162
6.4.1 ld.b、ld.h、ld.bu、ld.hu
指令的添加 162
6.4.2 st.b、st.h指令的添加 164
6.5 任务与实践 165
6.5.1 实践任务10:算术逻辑
运算指令和乘除法运算
指令添加 165
6.5.2 实践任务11:转移指令
和访存指令添加 166
第7章 异常和中断的支持 168
7.1 异常和中断的基本概念 168
7.1.1 异常是一套软硬件协同
处理的机制 169
7.1.2 精确异常 169
7.2 LoongArch指令系统中与异常
相关的功能定义 170
7.2.1 控制状态寄存器 170
7.2.2 异常产生条件的判定 171
7.2.3 响应异常后硬件的一般
处理过程 174
7.2.4 异常处理返回指令 174
7.2.5 CSR读写指令 175
7.3 流水线CPU实现异常和中断的
设计要点 175
7.3.1 异常检测逻辑的实现 175
7.3.2 精确异常的实现 177
7.3.3 控制状态寄存器的实现 178
7.3.4 处理控制状态寄存器
相关引发的冲突 186
7.4 其他指令的实现 188
7.5 任务与实践 188
7.5.1 实践任务12:添加系统
调用异常支持 188
7.5.2 实践任务13:添加其他
异常与中断支持 189
第8章 AXI总线接口设计 191
8.1 类SRAM总线 192
8.1.1 主方和从方 192
8.1.2 类SRAM总线接口
信号的定义 192
8.1.3 类SRAM总线的读写
时序 194
8.1.4 类SRAM总线的约束 197
8.2 类SRAM总线的设计 198
8.2.1 取指设计的考虑 198
8.2.2 访存设计的考虑 203
8.3 AXI总线协议 204
8.3.1 AXI总线信号一览 204
8.3.2 AXI总线协议的初步
解读 206
8.3.3 类SRAM总线接口信号
与AXI总线接口信号的
关系 212
8.4 类SRAM-AXI的转接桥设计 212
8.4.1 转接桥的顶层接口 212
8.4.2 转接桥的设计要求 213
8.4.3 转接桥的设计建议 214
8.5 任务与实践 215
8.5.1 实践任务14:添加类
SRAM总线支持 215
8.5.2 实践任务15:添加AXI
总线支持 219
8.5.3 实践任务16:完成AXI
随机延迟验证 220
第9章 存储管理单元设计 222
9.1 存储管理单元相关规范定义
梳理 223
9.2 TLB模块设计分析 224
9.3 MMU相关CSR与指令的
实现 229
9.3.1 MMU的CSR相关引发
的冲突处理 229
9.3.2 TLB相关指令的实现 230
9.4 利用MMU进行虚实地址转换
及MMU相关异常的实现 231
9.5 任务与实践 233
9.5.1 实践任务17:设计TLB
模块 233
9.5.2 实践任务18:添加TLB
相关指令和CSR 235
9.5.3 实践任务19:添加TLB
相关异常支持 236
第10章 Cache设计 238
10.1 Cache模块的设计 239
10.1.1 Cache的设计规格 239
10.1.2 Cache模块的数据通路
设计 241
10.1.3 Cache模块内部的控制
逻辑设计 250
10.1.4 Cache的硬件初始化
问题 255
10.2 将Cache集成至CPU中 256
10.2.1 Cache命中情况下的
CPU流水线适配 256
10.2.2 Cache缺失情况下的
CPU流水线适配 257
10.2.3 非缓存访问的处理 257
10.3 Cache维护指令 259
10.4 任务与实践 259
10.4.1 实践任务20:Cache
模块设计 260
10.4.2 实践任务21:在CPU
中集成ICache 262
10.4.3 实践任务22:在CPU
中集成DCache 263
10.4.4 实践任务23:在CPU
中添加CACOP指令 264
第11章 进阶实验开发环境 265
11.1 chiplab开发环境组织与
构成 266
11.2 chiplab开发环境的推荐
使用方式 267
11.3 软件仿真功能验证 269
11.3.1 固定测试程序验证 269
11.3.2 随机指令测试程序
验证 274
11.3.3 基于差分测试的调试
辅助机制 277
11.4 FPGA上板功能验证 280
11.4.1 FPGA综合实现 280
11.4.2 在FPGA上运行Linux
操作系统 281
第12章 进阶设计 290
12.1 提升主频的常用方法 291
12.1.1 平衡各级流水线的
延迟 291
12.1.2 针对大概率事件优化
逻辑 291
12.1.3 用面积和功耗换时延 292
12.1.4 进一步切分流水线 293
12.1.5 主频提升技术实现
示例 293
12.2 超标量流水线的实现 294
12.2.1 超标量流水线前端
设计要点 295
12.2.2 静态调度超标量流水线
后端设计要点 296
12.3 动态调度机制的实现 296
12.3.1 动态调度机制设计要点
提示 298
12.3.2 动态调度中常见电路
结构的RTL实现 301
12.4 硬件转移预测技术 302
12.4.1 硬件转移预测的流水线
设计框架 302
12.4.2 一个轻量级转移预测器
设计规格 304
12.5 访存优化技术 305
12.5.1 写缓存 305
12.5.2 非阻塞式高速缓存 306
12.5.3 访存乱序执行 307
12.5.4 多级Cache 308
12.5.5 Cache预取 308
12.6 多核处理器的实现 309
12.6.1 多核互联结构 309
12.6.2 多核编号 310
12.6.3 核间中断 310
12.6.4 多核情况下的存储
一致性 311
12.6.5 缓存一致性协议 312
12.6.6 ll.w-sc.w指令对的访存
原子性 320
附录 323
附录A 龙芯CPU设计与体系结构
教学实验系统 323
附录B Vivado的安装 327
附录C Vivado使用入门 337
附录D Vivado使用进阶 361












