一直以来CPU内部是绝大多数IT工程师难以触及的领域。纵使学习过计算机架构相关课程,自己动手实现CPU也始终遥不可及,因为这涉及计算机系统的最底层——芯片设计。
而近年来FPGA芯片产品的发展与普及打破了这一阻碍,利用内部电路可重编程的FPGA,几乎可以实现任何逻辑电路,自然也包括CPU,自然也会有相关的电子书籍。
1、自己动手写CPU
本书使用Verilog HDL 设计实现了一款兼容MIPS32指令集架构的处理器——OpenMIPS。OpenMIPS 处理器具有两个版本,分别是教学版和实践版。教学版的主要设计思想是尽量简单,处理器的运行情况比较理想化。实践版的设计目标是能完成特定功能,发挥实际作用。
本书分为三篇,第一篇是理论篇,介绍了指令集架构、Verilog HDL的相关知识。
第二篇是基础篇,采用增量模型,实现了教学版OpenMIPS处理器。首先实现了仅能执行一条指令的处理器,从这个最简单的情况出发,通过依次添加,实现逻辑操作指令、移位操作指令、空指令、移动操作指令、算术操作指令、转移指令、加载存储指令、协处理器访问指令、异常相关指令,最终实现了教学版OpenMIPS处理器。
第三篇是进阶篇,通过为教学版OpenMIPS添加Wishbone总线接口,从而实现了实践版OpenMIPS处理器,并与SDRAM控制器、GPIO模块、Flash控制器、UART控制器、Wishbone总线互联矩阵等模块组成一个小型SOPC,然后下载到FPGA芯片以验证实现效果,最后为实践版OpenMIPS处理器移植了嵌入式实时操作系统μC/OS-II。
本书目录如下:
第一篇 理论篇
第1章 处理器与MIPS 2
1.1 计算机的简单模型 2
1.1.1 计算机的简单组成模型 2
1.1.2 计算机的简单使用模型 3
1.2 架构与指令集 4
1.2.1 CISC与RISC 4
1.2.2 主要的几种ISA 5
1.3 MIPS指令集架构的演变 6
1.4 MIPS32指令集架构简介 9
1.4.1 数据类型 9
1.4.2 寄存器 9
1.4.3 字节次序 10
1.4.4 指令格式 11
1.4.5 指令集 11
1.4.6 寻址方式 13
1.4.7 协处理器CP0 13
1.4.8 异常 14
1.5 本书的目标与组织方式 14
第2章 可编程逻辑器件与Verilog HDL 16
2.1 可编程逻辑器件概述 16
2.2 基于PLD的数字系统设计流程 18
2.2.1 设计输入 19
2.2.2 综合 20
2.2.3 布局布线 20
2.2.4 下载 20
2.2.5 仿真 20
2.2.6 工具介绍 21
2.3 Verilog HDL简介 21
2.4 Verilog HDL中模块的结构 22
2.5 Verilog HDL基本要素 24
2.5.1 常量 24
2.5.2 变量声明与数据类型 24
2.5.3 向量 26
2.5.4 运算符 26
2.6 Verilog HDL行为语句 29
2.6.1 过程语句 29
2.6.2 赋值语句 31
2.6.3 条件语句 32
2.6.4 循环语句 34
2.6.5 编译指示语句 35
2.6.6 行为语句的可综合性 37
2.7 电路设计举例 38
2.8 仿真 41
2.8.1 系统函数 42
2.8.2 Test Bench 43
2.8.3 ModelSim仿真 45
2.9 本章小结 48
第二篇 基础篇
第3章 教学版OpenMIPS处理器蓝图 50
3.1 系统设计目标 50
3.1.1 设计目标 50
3.1.2 五级流水线 50
3.1.3 指令执行周期 52
3.2 教学版OpenMIPS处理器接口 53
3.3 文件说明 54
3.4 实现方法 55
第4章 第一条指令ori的实现 58
4.1 ori指令说明 58
4.2 流水线结构的建立 59
4.2.1 流水线的简单模型 59
4.2.2 原始的OpenMIPS五级流水线结构 60
4.2.3 一些宏定义 62
4.2.4 取指阶段的实现 63
4.2.5 译码阶段的实现 65
4.2.6 执行阶段的实现 74
4.2.7 访存阶段的实现 78
4.2.8 回写阶段的实现 81
4.2.9 顶层模块OpenMIPS的实现 81
4.3 验证OpenMIPS实现效果 85
4.3.1 指令存储器ROM的实现 85
4.3.2 最小SOPC的实现 87
4.3.3 编写测试程序 88
4.3.4 建立Test Bench文件 89
4.3.5 使用ModelSim检验OpenMIPS实现效果 90
4.4 MIPS编译环境的建立 92
4.4.1 VisualBox的安装与设置 93
4.4.2 GNU工具链的安装 96
4.4.3 使用GNU工具进行编译 97
4.4.4 使用GNU工具进行链接 99
4.4.5 得到ROM初始化文件 102
4.4.6 编写Makefile文件 103
4.5 第一条指令实现小结 105
第5章 逻辑、移位操作与空指令的实现 107
5.1 流水线数据相关问题 107
5.2 OpenMIPS对数据相关问题的解决措施 111
5.3 测试数据相关问题的解决效果 115
5.4 逻辑、移位操作与空指令说明 115
5.5 修改OpenMIPS以实现逻辑、移位操作与空指令 119
5.5.1 修改译码阶段的ID模块 120
5.5.2 修改执行阶段的EX模块 127
5.6 测试程序1——测试逻辑操作实现效果 129
5.7 测试程序2——测试移位操作与空指令实现效果 130
5.8 小结 131
第6章 移动操作指令的实现 132
6.1 移动操作指令说明 132
6.2 移动操作指令实现思路 133
6.2.1 新的数据相关情况的解决 135
6.2.2 系统结构的修改 136
6.3 修改OpenMIPS以实现移动操作指令 137
6.3.1 HI、LO寄存器的实现 137
6.3.2 修改译码阶段的ID模块 138
6.3.3 修改执行阶段 141
6.3.4 修改访存阶段 146
6.3.5 修改回写阶段 149
6.3.6 修改OpenMIPS顶层模块 149
6.4 测试程序 150
第7章 算术操作指令的实现 152
7.1 简单算术操作指令说明 153
7.2 简单算术操作指令实现思路 156
7.3 修改OpenMIPS以实现简单算术操作指令 157
7.3.1 修改译码阶段的ID模块 157
7.3.2 修改执行阶段的EX模块 164
7.4 测试简单算术操作指令实现效果 171
7.5 流水线暂停机制的设计与实现 174
7.5.1 流水线暂停机制的设计 174
7.5.2 流水线暂停机制的实现 175
7.6 乘累加、乘累减指令说明 180
7.7 乘累加、乘累减指令实现思路 181
7.8 修改OpenMIPS以实现乘累加、乘累减指令 182
7.8.1 修改译码阶段的ID模块 182
7.8.2 修改执行阶段的EX模块 184
7.8.3 修改EX/MEM模块 189
7.8.4 修改OpenMIPS模块 190
7.9 测试乘累加、乘累减指令实现效果 190
7.10 除法指令说明 191
7.11 除法指令实现思路 192
7.11.1 试商法 192
7.11.2 实现思路 193
7.11.3 系统结构的修改 193
7.12 修改OpenMIPS以实现除法指令 194
7.12.1 增加DIV模块 194
7.12.2 修改译码阶段的ID模块 199
7.12.3 修改执行阶段的EX模块 200
7.12.4 修改OpenMIPS模块 204
7.13 测试除法指令实现效果 204
7.14 数据流图的修改 205
第8章 转移指令的实现 206
8.1 延迟槽 206
8.2 转移指令说明 207
8.3 转移指令实现思路 210
8.3.1 实现思路 210
8.3.2 数据流图的修改 210
8.3.3 系统结构的修改 211
8.4 修改OpenMIPS以实现转移指令 212
8.4.1 修改取指阶段的PC模块 212
8.4.2 修改译码阶段 213
8.4.3 修改执行阶段的EX模块 223
8.4.4 修改OpenMIPS模块 225
8.5 测试转移指令的实现效果 225
8.5.1 测试跳转指令 225
8.5.2 测试分支指令 227
第9章 加载存储指令的实现 230
9.1 加载存储指令说明 230
9.1.1 加载指令lb、lbu、lh、lhu、lw说明 230
9.1.2 存储指令sb、sh、sw说明 231
9.1.3 加载存储指令用法示例 232
9.1.4 加载指令lwl、lwr说明 233
9.1.5 存储指令swl、swr说明 235
9.2 加载存储指令实现思路 238
9.2.1 数据流图的修改 239
9.2.2 系统结构的修改 240
9.3 修改OpenMIPS以实现加载存储指令 240
9.3.1 修改译码阶段 240
9.3.2 修改执行阶段 247
9.3.3 修改访存阶段 249
9.3.4 修改OpenMIPS顶层模块 260
9.4 修改最小SOPC 261
9.4.1 添加数据存储器RAM 262
9.4.2 修改最小SOPC 264
9.5 测试程序 265
9.6 链接加载指令ll、条件存储指令sc说明 267
9.7 ll、sc指令实现思路 269
9.7.1 ll、sc指令实现思路 269
9.7.2 数据流图的修改 270
9.7.3 系统结构的修改 271
9.8 修改OpenMIPS以实现ll、sc指令 271
9.8.1 LLbit寄存器的实现 271
9.8.2 修改译码阶段的ID模块 273
9.8.3 修改访存阶段 275
9.8.4 修改OpenMIPS模块 279
9.9 测试ll、sc指令实现效果 279
9.10 load相关问题 281
9.10.1 load相关问题介绍 281
9.10.2 解决方法 281
9.11 修改OpenMIPS以解决load相关问题 283
9.11.1 修改译码阶段的ID模块 283
9.11.2 修改OpenMIPS模块 284
9.12 测试load相关问题解决效果 285
9.13 小结 286
第10章 协处理器访问指令的实现 287
10.1 协处理器介绍 287
10.2 协处理器CP0中的寄存器 288
10.3 协处理器CP0的实现 295
10.4 协处理器访问指令说明 300
10.5 协处理器访问指令实现思路 300
10.5.1 实现思路 300
10.5.2 数据流图的修改 301
10.5.3 系统结构的修改 301
10.6 修改OpenMIPS以实现协处理器访问指令 303
10.6.1 修改译码阶段 303
10.6.2 修改执行阶段 305
10.6.3 修改访存阶段 311
10.6.4 修改OpenMIPS模块 314
10.7 测试程序 314
第11章 异常相关指令的实现 316
11.1 MIPS32架构中定义的异常类型 316
11.2 精确异常 318
11.3 异常处理过程 319
11.4 异常相关指令介绍 321
11.4.1 自陷指令 321
11.4.2 系统调用指令syscall 324
11.4.3 异常返回指令eret 325
11.5 异常处理实现思路 325
11.5.1 实现思路 325
11.5.2 修改数据流图 326
11.5.3 修改系统结构 326
11.6 修改OpenMIPS以实现异常处理 328
11.6.1 修改取指阶段 328
11.6.2 修改译码阶段 330
11.6.3 修改执行阶段 339
11.6.4 修改访存阶段 346
11.6.5 修改协处理器CP0 352
11.6.6 修改控制模块CTRL 355
11.6.7 修改OpenMIPS 357
11.7 再次修改最小SOPC 358
11.8 测试程序 359
11.8.1 测试程序1——测试系统调用异常 359
11.8.2 测试程序2——测试自陷异常 361
11.8.3 测试程序3——测试时钟中断 364
11.9 教学版OpenMIPS处理器实现小结 366
第三篇 进阶篇
第12章 实践版OpenMIPS处理器设计与实现 368
12.1 实践版OpenMIPS处理器的设计目标 368
12.2 Wishbone总线介绍 370
12.2.1 Wishbone总线接口说明 370
12.2.2 Wishbone总线单次读操作的过程 372
12.2.3 Wishbone总线单次写操作的过程 373
12.2.4 SEL_O/SEL_I信号说明 374
12.3 实践版OpenMIPS处理器接口 375
12.4 实践版OpenMIPS处理器的实现思路 376
12.5 从教学版OpenMIPS到实践版OpenMIPS 378
12.5.1 Wishbone总线接口模块的实现 378
12.5.2 修改CTRL模块 384
12.5.3 修改OpenMIPS顶层模块 386
12.6 实践版OpenMIPS处理器实现小结 386
第13章 基于实践版OpenMIPS的小型SOPC 387
13.1 小型SOPC的结构 387
13.2 Wishbone总线互联矩阵WB_CONMAX 388
13.3 GPIO 390
13.4 UART控制器 392
13.4.1 UART简介 392
13.4.2 UART16550 IP核介绍 394
13.5 Flash控制器 398
13.5.1 Flash简介 398
13.5.2 Flash控制器的设计 399
13.5.3 Flash控制器的实现 400
13.6 SDRAM控制器 403
13.6.1 SDRAM简介 403
13.6.2 SDRAM CONTROLLER IP核 409
13.7 实现基于实践版OpenMIPS的小型SOPC 412
13.8 本章小结 423
第14章 验证实践版OpenMIPS处理器 424
14.1 DE2平台简介 424
14.2 测试需要的硬件连接 425
14.3 QuartusII工程建立 426
14.4 测试步骤说明 430
14.5 测试一——GPIO实验 431
14.5.1 测试内容 431
14.5.2 测试程序 431
14.5.3 编译测试程序 432
14.5.4 将测试程序写入Flash芯片 433
14.5.5 下载小型SOPC到DE2 435
14.5.6 测试效果 435
14.6 测试二——UART实验 435
14.6.1 测试内容 435
14.6.2 测试程序 436
14.6.3 测试效果 438
14.7 测试三——模拟操作系统的加载过程 439
14.7.1 测试内容 439
14.7.2 测试程序BootLoader 439
14.7.3 测试程序SimpleOS 443
14.7.4 将测试程序写入Flash 446
14.7.5 测试效果 448
14.8 本章小结 449
第15章 为OpenMIPS处理器移植μC/OS-II 450
15.1 为什么需要操作系统 450
15.2 嵌入式实时操作系统介绍 451
15.3 μC/OS-II简介 452
15.4 μC/OS-II特点 452
15.5 μC/OS-II的几个概念 454
15.5.1 任务 454
15.5.2 任务调度 456
15.5.3 任务切换 456
15.5.4 μC/OS-II的中断处理 457
15.5.5 时钟节拍 457
15.5.6 μC/OS-II的初始化 458
15.5.7 μC/OS-II的启动 458
15.6 μC/OS-II的基本功能 458
15.6.1 任务间的通信与同步 459
15.6.2 任务管理 459
15.6.3 时间管理 459
15.6.4 内存管理 460
15.7 μC/OS-II的文件体系 460
15.8 μC/OS-II的移植条件 461
15.9 C语言中使用汇编代码 463
15.10 MIPS函数调用规范 465
15.10.1 寄存器使用规范 465
15.10.2 参数传递 466
15.10.3 函数返回值 466
15.10.4 堆栈布局 467
15.10.5 示例 468
15.11 μC/OS-II在OpenMIPS处理器上的移植 470
15.11.1 文件目录的建立 470
15.11.2 修改os_cpu.h文件 473
15.11.3 修改os_cpu_a.S文件 474
15.11.4 修改os_cpu_c.c文件 496
15.12 测试程序 500
15.12.1 创建openmips.h文件 500
15.12.2 创建openmips.c文件 502
15.13 编译指示文件的建立 508
15.14 OpenMIPS处理器运行移植后的μC/OS-II 515
15.15 本章小结 516
附录A 教学版OpenMIPS各个模块的接口说明 517
只需要在微信公众号回复“自己动手写CPU”即可获取PDF电子书。
2、手把手教你设计 CPU:RISC-V处理器篇
本书是一本介绍通用CPU设计的入门书,以通俗的语言系统介绍了CPU和RISC-V架构,力求为读者揭开CPU设计的神秘面纱,打开计算机体系结构的大门。
本书共分为四部分,第一部分是CPU与RISC-V的综述,帮助初学者对CPU和RISC-V快速地建立起认识。第二部分讲解如何使用Verilog设计CPU,使读者掌握处理器核的设计精髓。第三部分主要介绍蜂鸟E203配套的SoC和软件平台,使读者实现蜂鸟E203 RISC-V处理器在FPGA原型平台上的运行。第四部分是附录,介绍了RISC-V指令集架构,辅以作者加入的背景知识解读和注解,以便于读者理解。
本书目录如下:
第1章一文读懂CPU之三生三世2
1.1眼看他起高楼,眼看他宴宾客,眼看他楼塌了——CPU众生相3
1.1.1ISA——CPU的灵魂4
1.1.2CISC与RISC5
1.1.332位与64位架构6
1.1.4ISA众生相6
1.1.5CPU的领域之分10
1.2ISA请扛起这口锅——为什么国产CPU尚未足够成功12
1.2.1MIPS系——龙芯和君正12
1.2.2x86系——北大众志、兆芯和海光13
1.2.3Power系——中晟宏芯13
1.2.4Alpha系——申威14
1.2.5ARM系——飞腾、华为海思、展讯和华芯通14
1.2.6背锅侠ISA15
1.3人生已是如此艰难,你又何必拆穿——CPU从业者的无奈17
1.4无敌是多么寂寞——ARM统治着的世界18
1.4.1独乐乐与众乐乐——ARM公司的盈利模式18
1.4.2小个子有大力量——无处不在的Cortex-M系列21
1.4.3移动王者——Cortex-A系列在手持设备领域的巨大成功23
1.4.4进击的巨人——ARM进军PC与服务器领域的雄心25
1.5东边日出西边雨,道是无晴却有晴——RISC-V登场25
1.6原来你是这样的“薯片”——ARM的免费计划28
1.7旧时王谢堂前燕,飞入寻常百姓家——你也可以设计自己的处理器28
第2章大道至简——RISC-V架构之魂29
2.1简单就是美——RISC-V架构的设计哲学30
2.1.1无病一身轻——架构的篇幅30
2.1.2能屈能伸——模块化的指令集32
2.1.3浓缩的都是精华——指令的数量32
2.2RISC-V指令集架构简介33
2.2.1模块化的指令子集33
2.2.2可配置的通用寄存器组34
2.2.3规整的指令编码34
2.2.4简洁的存储器访问指令34
2.2.5高效的分支跳转指令35
2.2.6简洁的子程序调用36
2.2.7无条件码执行37
2.2.8无分支延迟槽37
2.2.9零开销硬件循环38
2.2.10简洁的运算指令38
2.2.11优雅的压缩指令子集39
2.2.12特权模式40
2.2.13CSR寄存器40
2.2.14中断和异常40
2.2.15矢量指令子集40
2.2.16自定制指令扩展41
2.2.17总结与比较41
2.3RISC-V软件工具链42
2.4RISC-V和其他开放架构有何不同44
2.4.1平民英雄——OpenRISC44
2.4.2豪门显贵——SPARC44
2.4.3名校优生——RISC-V45
第3章乱花渐欲迷人眼——盘点RISC-V商业版本与开源版本46
3.1各商业版本与开源版本综述47
3.1.1RocketCore(开源)47
3.1.2BOOMCore(开源)49
3.1.3FreedomSoC(开源)50
3.1.4LowRISCSoC(开源)50
3.1.5PULPinoCoreandSoC(开源)50
3.1.6PicoRV32Core(开源)51
3.1.7SCR1Core(开源)51
3.1.8ORCACore(开源)51
3.1.9AndesCore(商业IP)52
3.1.10MicrosemiCore(商业IP)52
3.1.11CodasipCore(商业IP)53
3.1.12蜂鸟E200Core与SoC(开源)53
3.2总结53
第4章开源RISC-V——蜂鸟E200系列超低功耗Core与SoC54
4.1与众不同的蜂鸟E200处理器55
4.2蜂鸟E200简介——蜂鸟虽小,五脏俱全56
4.3蜂鸟E200型号系列57
4.4蜂鸟E200性能指标58
4.5蜂鸟E200配套SoC59
4.6蜂鸟E200配置选项60
第二部分手把手教你使用Verilog设计CPU
第5章先见森林,后观树木——蜂鸟E200设计总览和顶层介绍65
5.1处理器硬件设计概述66
5.1.1架构和微架构66
5.1.2CPU、处理器、Core和处理器核66
5.1.3处理器设计和验证的特点66
5.2蜂鸟E200处理器核设计哲学67
5.3蜂鸟E200处理器核RTL代码风格介绍68
5.3.1使用标准DFF模块例化生成寄存器68
5.3.2推荐使用assign语法替代if-else和case语法70
5.3.3其他若干注意事项71
5.3.4小结72
5.4蜂鸟E200模块层次划分72
5.5蜂鸟E200处理器核源代码73
5.6蜂鸟E200处理器核配置选项73
5.7蜂鸟E200处理器核支持的RISC-V指令子集74
5.8蜂鸟E200处理器流水线结构74
5.9蜂鸟E200处理器核顶层接口介绍74
5.10总结77
第6章流水线不是流水账——蜂鸟E200流水线介绍78
6.1处理器流水线概述79
6.1.1从经典的五级流水线说起79
6.1.2可否不要流水线——流水线和状态机的关系81
6.1.3深处种菱浅种稻,不深不浅种荷花——流水线的深度81
6.1.4向上生长——越来越深的流水线82
6.1.5向下生长——越来越浅的流水线83
6.1.6总结83
6.2处理器流水线中的乱序83
6.3处理器流水线中的反压84
6.4处理器流水线中的冲突84
6.4.1流水线中的资源冲突84
6.4.2流水线中的数据冲突85
6.5蜂鸟E200处理器的流水线86
6.5.1流水线总体结构86
6.5.2流水线中的冲突87
6.6总结87
第7章万事开头难——一切从取指令开始88
7.1取指概述89
7.1.1取指特点89
7.1.2如何快速取指90
7.1.3如何处理非对齐指令91
7.1.4如何处理分支指令92
7.2RISC-V架构特点对于取指的简化97
7.2.1规整的指令编码格式97
7.2.2指令长度指示码放于低位97
7.2.3简单的分支跳转指令98
7.2.4没有分支延迟槽指令100
7.2.5提供明确的静态分支预测依据100
7.2.6提供明确的RAS依据101
7.3蜂鸟E200处理器的取指实现101
7.3.1IFU总体设计思路102
7.3.2Mini-Decode103
7.3.3Simple-BPU分支预测105
7.3.4PC生成109
7.3.5访问ITCM和BIU111
7.3.6ITCM115
7.3.7BIU116
7.4总结116
第8章一鼓作气,执行力是关键——执行117
8.1执行概述118
8.1.1指令译码118
8.1.2指令执行118
8.1.3流水线的冲突119
8.1.4指令的交付119
8.1.5指令发射、派遣、执行、写回的顺序119
8.1.6分支解析121
8.1.7小结121
8.2RISC-V架构特点对于执行的简化121
8.2.1规整的指令编码格式122
8.2.2优雅的16位指令122
8.2.3精简的指令个数122
8.2.4整数指令都是两操作数122
8.3蜂鸟E200处理器的执行实现123
8.3.1执行指令列表123
8.3.2EXU总体设计思路123
8.3.3译码124
8.3.4整数通用寄存器组130
8.3.5CSR寄存器133
8.3.6指令发射派遣134
8.3.7流水线冲突、长指令和OITF139
8.3.8ALU145
8.3.9高性能乘除法157
8.3.10浮点单元158
8.3.11交付159
8.3.12写回159
8.3.13协处理器扩展160
8.3.14小结160
第9章善始者实繁,克终者盖寡——交付161
9.1处理器交付、取消、冲刷162
9.1.1处理器交付、取消、冲刷简介162
9.1.2处理器交付常见实现策略163
9.2RISC-V架构特点对于交付的简化164
9.3蜂鸟E200处理器交付硬件实现164
9.3.1分支预测指令的处理165
9.3.2中断和异常的处理168
9.3.3多周期执行指令的交付169
9.3.4小结169
0章让子弹飞一会儿——写回170
10.1处理器的写回171
10.1.1处理器写回功能简介171
10.1.2处理器写回常见策略171
10.2蜂鸟E200处理器的写回硬件实现171
10.2.1终写回仲裁172
10.2.2OITF和长指令写回仲裁174
10.2.3小结177
1章哈弗还是比亚迪——存储器架构178
11.1存储器架构概述179
11.1.1谁说处理器要有缓存179
11.1.2处理器要有存储器180
11.1.3ITCM和DTCM182
11.2RISC-V架构特点对于存储器访问指令的简化183
11.2.1仅支持小端格式183
11.2.2无地址自增自减模式183
11.2.3无“一次读多个数据”和“一次写多个数据”指令183
11.3RISC-V架构的存储器相关指令184
11.3.1Load和Store指令184
11.3.2Fence指令184
11.3.3“A”扩展指令184
11.4蜂鸟E200处理器存储器子系统硬件实现185
11.4.1存储器子系统总体设计思路185
11.4.2AGU186
11.4.3LSU190
11.4.4ITCM和DTCM192
11.4.5“A”扩展指令处理195
11.4.6Fence与Fence.I指令处理200
11.4.7BIU202
11.4.8ECC202
11.4.9小结202
2章黑盒子的窗口——总线接口单元BIU203
12.1片上总线协议概述204
12.1.1AXI204
12.1.2AHB204
12.1.3APB205
12.1.4TileLink205
12.1.5总结比较205
12.2自定义总线协议ICB206
12.2.1ICB总线协议简介206
12.2.2ICB总线协议信号207
12.2.3ICB总线协议时序207
12.3ICB总线的硬件实现210
12.3.1一主多从210
12.3.2多主一从211
12.3.3多主多从212
12.4蜂鸟E200处理器核BIU212
12.4.1BIU简介212
12.4.2BIU微架构213
12.4.3BIU源码分析214
12.5蜂鸟E200处理器SoC总线214
12.5.1SoC总线简介215
12.5.2SoC总线微架构215
12.5.3SoC总线源码分析216
12.6总结216
3章不得不说的故事——中断和异常217
13.1中断和异常概述218
13.1.1中断概述218
13.1.2异常概述219
13.1.3广义上的异常219
13.2RISC-V架构异常处理机制221
13.2.1进入异常221
13.2.2退出异常224
13.2.3异常服务程序225
13.3RISC-V架构中断定义226
13.3.1中断类型226
13.3.2中断屏蔽228
13.3.3中断等待229
13.3.4中断优先级与仲裁230
13.3.5中断嵌套230
13.3.6总结比较231
13.4RISC-V架构异常相关CSR寄存器232
13.5蜂鸟E200异常处理的硬件实现232
13.5.1蜂鸟E200处理器的异常和中断实现要点232
13.5.2蜂鸟E200处理器的异常类型233
13.5.3蜂鸟E200处理器对于mepc的处理234
13.5.4蜂鸟E200处理器的中断接口234
13.5.5蜂鸟E200处理器CLINT微架构及源码分析235
13.5.6蜂鸟E200处理器PLIC微架构及源码分析238
13.5.7蜂鸟E200处理器交付模块对中断和异常的处理242
13.5.8小结245
4章不起眼的,其实是难的——调试机制246
14.1调试机制概述247
14.1.1交互调试概述247
14.1.2跟踪调试概述249
14.2RISC-V架构的调试机制249
14.2.1调试器软件的实现250
14.2.2调试模式250
14.2.3调试指令251
14.2.4调试机制CSR251
14.2.5调试中断251
14.3蜂鸟E200调试机制的硬件实现251
14.3.1蜂鸟E200交互式调试概述251
14.3.2DTM模块253
14.3.3硬件调试模块253
14.3.4调试中断处理257
14.3.5调试机制CSR寄存器的实现258
14.3.6调试机制指令的实现258
14.3.7小结259
5章动如脱兔,静若处子——低功耗的诀窍260
15.1处理器低功耗技术概述261
15.1.1软件层面低功耗261
15.1.2系统层面低功耗261
15.1.3处理器层面低功耗262
15.1.4单元层面低功耗262
15.1.5寄存器层面低功耗263
15.1.6锁存器层面低功耗264
15.1.7SRAM层面低功耗264
15.1.8组合逻辑层面低功耗264
15.1.9工艺层面低功耗265
15.2RISC-V架构的低功耗机制265
15.3蜂鸟E200低功耗机制的硬件实现265
15.3.1蜂鸟E200系统层面低功耗265
15.3.2蜂鸟E200处理器层面低功耗267
15.3.3蜂鸟E200单元层面低功耗269
15.3.4蜂鸟E200寄存器层面低功耗269
15.3.5蜂鸟E200锁存器层面低功耗272
15.3.6蜂鸟E200SRAM层面低功耗273
15.3.7蜂鸟E200组合逻辑层面低功耗274
15.3.8蜂鸟E200工艺层面低功耗275
15.4总结275
6章工欲善其事,必先利其器——RISC-V可扩展协处理器276
16.1专用领域架构DSA277
16.2RISC-V架构的可扩展性278
16.2.1RISC-V的预留指令编码空间278
16.2.2RISC-V的预定义的Custom指令279
16.3蜂鸟E200的协处理器接口EAI279
16.3.1EAI指令的编码279
16.3.2EAI接口信号280
16.3.3EAI流水线接口281
16.3.4EAI存储器接口282
16.3.5EAI接口时序283
16.4蜂鸟E200的协处理器参考示例286
16.4.1示例协处理器需求286
16.4.2示例协处理器指令287
16.4.3示例协处理器实现288
16.4.4示例协处理器性能289
16.4.5示例协处理器代码290
第三部分使用Verilog进行仿真和在FPGASoC原型上运行软件
7章冒个烟先——运行Verilog仿真测试292
17.1E200开源项目的代码层次结构293
17.2E200开源项目的测试用例294
17.2.1riscv-tests自测试用例294
17.2.2编译ISA自测试用例295
17.3E200开源项目的测试平台(TestBench)298
17.4在VerilogTestBench中运行测试用例299
8章套上壳子上路——实现SoC和FPGA原型302
18.1FreedomE310SoC简介303
18.2HBird-E200-SoC简介304
18.2.1HBird-E200-SoC组成结构304
18.2.2HBird-E200-SoC代码结构309
18.3HBird-E200-SoCFPGA原型平台311
18.3.1FPGA开发板311
18.3.2生成mcs文件烧写FPGA314
18.3.3JTAG调试器317
18.3.4FPGA原型平台DIY总结320
18.4蜂鸟E200专用FPGA开发板320
9章画龙点睛——运行和调试软件示例321
19.1Freedom-E-SDK平台简介322
19.2SIRV-E-SDK平台简介323
19.2.1SIRV-E-SDK简介323
19.2.2SIRV-E-SDK代码结构324
19.3使用SIRV-E-SDK运行示例程序325
19.4使用GDB和OpenOCD调试示例程序328
19.5Windows图形化IDE开发工具331
第20章是骡子是马?拉出来遛遛——运行跑分程序332
20.1跑分程序简介333
20.2Dhrystone简介333
20.3运行DhrystoneBenchmark335
20.4CoreMark简介337
20.5运行CoreMarkBenchmark338
20.6总结与比较340
附录部分RISC-V架构详述
只需要在微信公众号回复“手把手教你设计 CPU”即可获取PDF电子书。
3、Computer Principles and Design in Verilog HDL (Yamin Li)
本书介绍计算机原理、计算机设计以及如何使用 Verilog HDL(硬件描述语言)实现设计。
提供设计处理器/算术/CPU 芯片的技能,包括 Verilog HDL 材料在 CPU(中央处理器)实现中的独特应用。
本书将计算机体系结构和微处理器设计的详细逻辑与Verilog HDL的大量示例相结合。其综合内容包括HDL电路设计,计算机算术算法,设计挑战,内存管理,多核CPU设计,以及高性能计算机和复杂网络。
书籍目录如下:
1 Computer Fundamentals and Performance Evaluation 1
1.1 Overview of Computer Systems 1
1.2 Basic Structure of Computers 8
1.3 Improving Computer Performance 13
1.4 Hardware Description Languages 16
Exercises 18
2 A Brief Introduction to Logic Circuits and Verilog HDL 19
2.1 Logic Gates 19
2.2 Logic Circuit Design in Verilog HDL 22
2.3 CMOS Logic Gates 25
2.4 Four Levels/Styles of Verilog HDL 28
2.5 Combinational Circuit Design 34
2.6 Sequential Circuit Design 42
Exercises 59
3 Computer Arithmetic Algorithms and Implementations 63
3.1 Binary Integers 63
3.2 Binary Addition and Subtraction 65
3.3 Binary Multiplication Algorithms 74
3.4 Binary Division Algorithms 84
3.5 Binary Square Root Algorithms 95
Exercises 110
4 Instruction Set Architecture and ALU Design 111
4.1 Instruction Set Architecture 111
4.2 MIPS Instruction Format and Registers 117
4.3 MIPS Instructions and AsmSim Tool 118
4.4 ALU Design 136
Exercises 140
5 Single-Cycle CPU Design in Verilog HDL 143
5.1 The Circuits Required for Executing an Instruction 143
5.2 Register File Design 148
5.3 Single-Cycle CPU Datapath Design 154
5.4 Single-Cycle CPU Control Unit Design 160
5.5 Test Program and Simulation Waveform 164
Exercises 166
6 Exceptions and Interrupts Handling and Design in Verilog HDL 170
6.1 Exceptions and Interrupts 170
6.2 Design of CPU with Exception and Interrupt Mechanism 176
6.3 The CPU Exception and Interrupt Tests 187
Exercises 191
7 Multiple-Cycle CPU Design in Verilog HDL 192
7.1 Dividing Instruction Execution into Several Clock Cycles 192
7.2 Multiple-Cycle CPU Schematic and Verilog HDL Codes 198
7.3 Multiple-Cycle CPU Control Unit Design 201
7.4 Memory and Test Program 208
Exercises 211
8 Design of Pipelined CPU with Precise Interrupt in Verilog HDL 212
8.1 Pipelining 213
8.2 Pipeline Hazards and Solutions 219
8.3 The Circuit of the Pipelined CPU and Verilog HDL Codes 225
8.4 Precise Interrupts/Exceptions in Pipelined CPU 240
8.5 Design of Pipelined CPU with Precise Interrupt/Exception 248
Exercises 265
9 Floating-Point Algorithms and FPU Design in Verilog HDL 266
9.1 IEEE 754 Floating-Point Data Formats 266
9.2 Converting between Floating-Point Number and Integer 268
9.3 Floating-Point Adder (FADD) Design 273
9.4 Floating-Point Multiplier (FMUL) Design 290
9.5 Floating-Point Divider (FDIV) Design 302
9.6 Floating-Point Square Root (FSQRT) Design 312
Exercises 321
10 Design of Pipelined CPU with FPU in Verilog HDL 323
10.1 CPU/FPU Pipeline Model 323
10.2 Design of Register File with Two Write Ports 326
10.3 Data Dependency and Pipeline Stalls 328
10.4 Pipelined CPU/FPU Design in Verilog HDL 335
10.5 Memory Modules and Pipelined CPU/FPU Test 345
Exercises 351
11 Memory Hierarchy and Virtual Memory Management 353
11.1 Memory 353
11.2 Cache Memory 359
11.3 Virtual Memory Management and TLB Design 367
11.4 Mechanism of TLB-Based MIPS Memory Management 377
Exercises 384
12 Design of Pipelined CPU with Caches and TLBs in Verilog HDL 386
12.1 Overall Structure of Caches and TLBs 386
12.2 Design of Circuits Related to Caches 387
12.3 Design of Circuits Related to TLB 392
12.4 Design of CPU with Caches and TLBs 400
12.5 Simulation Waveforms of CPU with Caches and TLBs 416
Exercises 424
13 Multithreading CPU and Multicore CPU Design in Verilog HDL 425
13.1 Overview of Multithreading CPUs 425
13.2 Multithreading CPU Design 428
13.3 Overview of Multicore CPUs 434
13.4 Multicore CPU Design 436
Exercises 442
14 Input/Output Interface Controller Design in Verilog HDL 443
14.1 Overview of Input/Output Interface Controllers 443
14.2 Error Detection and Correction 445
14.3 Universal Asynchronous Receiver Transmitter 452
14.4 PS/2 Keyboard/Mouse Interface Design 461
14.5 Video Graphics Array (VGA) Interface Design 466
14.6 Input/Output Buses 483
Exercises 507
15 High-Performance Computers and Interconnection Networks 509
15.1 Category of High-Performance Computers 509
15.2 Shared-Memory Parallel Multiprocessor Systems 510
15.3 Inside of Interconnection Networks 514
15.4 Topological Properties of Interconnection Networks 516
15.5 Some Popular Topologies of Interconnection Networks 518
15.6 Collective Communications 521
15.7 Low-Node-Degree Short-Diameter Interconnection Networks 524
Exercises 535
只需要在微信公众号回复“Computer Principles and Design in Verilog HDL”即可获取PDF电子书。