搜索
高级检索
高级搜索
书       名 :
著       者 :
出  版  社 :
I  S  B  N:
文献来源:
出版时间 :
CPU制作入门:基于RISC-V和Chisel
0.00     定价 ¥ 98.00
图书来源: 浙江图书馆(由JD配书)
此书还可采购25本,持证读者免费借回家
  • 配送范围:
    浙江省内
  • ISBN:
    9787030769657
  • 作      者:
    [日]西山悠太朗,[日]井田健太
  • 译      者:
    蒋萌
  • 出 版 社 :
    科学出版社
  • 出版日期:
    2024-01-01
收藏
精彩书摘
第Ⅰ部分CPU制作的基础知识
  第1章什么是CPU
  本书的主题是“CPU制作”。也许大家听说过CPU,但并不清楚它的具体结构和处理流程。既然本书是为初学者准备的,我们就从“什么是CPU”说起。CPU是“central processing unit”的缩写,指的是中央处理器。它被视为计算机的大脑,根据程序进行运算处理。
  例如,1+1=2对于学过数学的人非常简单,但要让CPU进行运算,原理就不那么简单了。
  为了方便读者理解CPU的运算处理原理,本章将依次介绍电路是怎样描述逻辑的,以及怎样通过组合逻辑实现灵活的运算装置——CPU。读完本章后,你会理解以下3点*基本的CPU制作知识。
   CPU是通过电路描述的逻辑组合产物
   CPU是在组合逻辑的基础上,利用时钟同步时序逻辑电路的有限状态机 CPU内的记忆装置寄存器由多个D触发器(DFFa)并联组成,在时钟的上升沿或下降沿更新数值
  在制作CPU时,无须深入了解电路图的细节,大致理解即可。
  1.1电路能够描述逻辑的理由
  物理电路可以通过图1.1所示的抽象化步骤来描述逻辑。
  图1.1电路的抽象化步骤
  CPU听上去像是复杂的机器,而它实际上不过是一系列电路。那么,单纯的电路是怎样进行加减乘除和分支处理的呢?
  1.1.1转换为数字信号
  在图1.1中,将①“一系列电路”抽象化为②“0和1的二值信息集合”,利用的是“高电位状态为1,低电位状态为0”的概念。
  电位是带电粒子(电荷)的势能,正电荷具有从高电位向低电位移动的特性。日常使用的电池有提高电位的能力,用导体连接电池的正负极后,正电荷从正极向负极移动(形成电流)。
  开头提到的概念,是指以特定值为阈值,将数值连续变化的电位(模拟信号)转换为0和1两个离散值(数字信号),如图1.2所示。
  图1.2模拟信号转换为数字信号
  处理模拟信号这种精细值(连续值)时,即使是微小变化,也会产生直接影响。而处理数字信号这种概略值(离散值)时,微小信号偏差会在数字化过程中被吸收。对精度要求很高的CPU,处理电信号应尽可能容许偏差。
  总之,CPU是利用0和1这两个数字信号实现各种运算的。
  此外,等电位连续线路中信息量的单位用位(bit)表示。1位取0或1,2位可以表示4个值(00、01、10、11)。如图1.3所示,电池的负极电位为0V,正极电位为1.5V,分别解释为0和1。
  图1.3电路和位
  1.1.2描述逻辑运算的电路
  图1.1所示“电路的抽象化步骤”中的②“0和1的二值信息集合”抽象化为③“AND、OR、NOT运算的集合”,利用的是布尔代数。
  布尔代数是仅处理0和1两个值的逻辑体系,定义了AND、OR、NOT,3种基本逻辑运算。每种逻辑运算针对输入模式输出一个固定值。
  AND逻辑在输入值均为1时输出1,其他情况下输出0,见表1.1。
  表1.1AND逻辑
  OR逻辑在一个输入值为1时输出1,其他情况下输出0,见表1.2。
  NOT逻辑在输入值为1时输出0,输入值为0时输出1,见表1.3。
  表1.2OR逻辑
  表1.3NOT逻辑
  输入输出
  这种输入和输出相对应的表被称为真值表a,输入决定输出的逻辑被称为组合逻辑。
  重点是,这3种逻辑运算可以用表示0和1的电路来描述。在观察各种电路之前,我们先来了解一个关键元件——晶体管。
  晶体管是半导体元件,结合了导体和绝缘体两种特性。具体来说,如果输
  入(基极)的电位为1(高于特定电位),集电极和发射极就会导通;如果电位是0,则集电极和发射极绝缘,如图1.4所示。一般来说,集电极接正极,发射极接负极,电流从集电极流向发射极。可以说,晶体管是通过基极电位操作的开关电路。
  图1.4晶体管的电路符号及动作
  利用晶体管,AND、OR、NOT电路可被分别描述为图1.5~图1.7:左侧为电路图,右侧为各种输入对应的动作。
  在图1.1所示的4个抽象化级别中,从②过渡到③利用的就是这些电路。
  图1.5用晶体管描述的AND电路
  图1.6用晶体管描述的OR电路
展开
目录
目录
第Ⅰ部分 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
CPU制作入门:基于RISC-V和Chisel
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
4.4 第Ⅱ部分要实现的指令和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
xvi
CPU制作入门:基于RISC-V和Chisel
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
展开
加入书架成功!
收藏图书成功!
我知道了(3)
发表书评
读者登录

请选择您读者所在的图书馆

选择图书馆
浙江图书馆
点击获取验证码
登录
没有读者证?在线办证