第1章OpenRISC介绍 1
1.1 开源软核处理器 1
1.2 OpenRISC 1000架构 4
1.3 OR1200——OpenRISC
1000架构的一个实现 4
1.3.1 寻址模式 5
1.3.2 位和字节次序 6
1.3.3 寄存器集 6
1.3.4 指令集
7
1.3.5 异常模型 8
1.4 OR1200代码组织 8
1.5 本书的分析方法 11
第2章 实验环境的搭建 13
2.1 GNU开发工具链的安装
13
2.2 GNU开发工具链的使用
18
2.2.1 一个简单的汇编程序
18
2.2.2 编译及ELF文件介绍
19
2.2.3 链接 21
2.2.4 Makefile文件 23
2.2.5 使用OR1KSim模拟器运行程序
24
2.3 创建OR1200运行的最小系统 25
2.3.1 最小系统的创建
26
2.3.2 运行仿真 29
2.3.3 修改Makefile
30
2.3.4 观察流水线
32
2.3.5 流水线介绍
33
2.4 本书的一些说明及定义
34
2.4.1 一些说明 34
2.4.2 一些定义 35
第3章
QMEM剖析 37
3.1 QMEM的作用
37
3.2 Wishbone总线快速了解
40
3.3 QMEM的Wishbone总线接口 43
3.3.1 QMEM与CPU、IMMU的连接
44
3.3.2 QMEM与ICache的连接 45
3.3.3 QMEM与CPU、DMMU的连接
46
3.3.4 QMEM与DCache的连接
47
3.4 QMEM的内部RAM
49
3.5 复位后取第一条指令的过程分析
51
3.5.1 复位信号有效阶段 51
3.5.2 复位信号无效后的第一个时钟周期上升沿 56
3.5.3 复位信号无效后的第一个时钟周期的组合逻辑阶段 57
3.6 第二条及后续指令的读取过程分析 58
3.6.1 复位信号无效后的第二个时钟周期的上升沿
58
3.6.2 复位信号无效后的第二个时钟周期的组合逻辑阶段 59
第4章 数据处理类指令剖析 61
4.1 数据处理类指令说明 61
4.2 分析用例
65
4.3 流水线的简单模型
67
4.4 l.add指令分析
69
4.4.1 l.add取指阶段的组合逻辑输出
70
4.4.2 l.add取指阶段的时序逻辑输出
73
4.4.3 l.add译码阶段的组合逻辑输出
75
4.4.4 l.add译码阶段的时序逻辑输出
80
4.4.5 l.add执行阶段的组合逻辑输出
91
4.4.6 l.add执行阶段的时序逻辑输出
97
4.4.7 第一条指令分析小结
98
4.5 l.sfeqi指令分析 99
4.5.1 l.sfeqi取指阶段的组合逻辑输出 99
4.5.2 l.sfeqi取指阶段的时序逻辑输出 100
4.5.3 l.sfeqi译码阶段的组合逻辑输出 100
4.5.4 l.sfeqi译码阶段的时序逻辑输出 101
4.5.5 l.sfeqi执行阶段的组合逻辑输出 102
4.5.6 l.sfeqi执行阶段的时序逻辑输出 105
4.5.7 第二条指令分析小结
106
4.6 ALU分析
106
4.7 流水线数据相关的解决方法
112
4.8 定制属于自己的指令 117
4.9 不完整流水线数据通路图 121
第5章 特殊寄存器访问类指令剖析
123
5.1 OR1200中的特殊寄存器 123
5.2 第0组特殊寄存器
125
5.3 特殊寄存器访问类指令说明
127
5.4 分析用例
128
5.5 l.mfspr指令分析 130
5.5.1 l.mfspr取指阶段的组合逻辑输出 131
5.5.2 l.mfspr取指阶段的时序逻辑输出 132
5.5.3 l.mfspr译码阶段的组合逻辑输出 132
5.5.4 l.mfspr译码阶段的时序逻辑输出 133
5.5.5 l.mfspr执行阶段第1个时钟周期的组合逻辑输出
135
5.5.6 l.mfspr执行阶段第1个时钟周期的时序逻辑输出
138
5.5.7 l.mfspr执行阶段第2个时钟周期的组合逻辑输出
141
5.5.8 l.mfspr执行阶段第2个时钟周期的时序逻辑输出
144
5.5.9 l.mfspr指令分析小结
144
5.6 l.mtspr指令分析 145
5.6.1 l.mtspr执行阶段的组合逻辑输出 147
5.6.2 l.mtspr执行阶段的时序逻辑输出 148
5.7 SPRS分析
148
5.8 完善流水线数据通路图
155
第6章 转移类指令剖析 157
6.1 延迟槽 157
6.2 转移类指令说明 158
6.3 分析用例
159
6.4 l.bf指令分析 161
6.4.1 l.bf取指阶段的组合逻辑输出 162
6.4.2 l.bf取指阶段的时序逻辑输出 163
6.4.3 l.bf译码阶段的组合逻辑输出 164
6.4.4 l.bf译码阶段的时序逻辑输出 166
6.4.5 l.bf执行阶段第1个时钟周期的组合逻辑输出
169
6.4.6 l.bf执行阶段第2个时钟周期的组合逻辑输出
173
6.4.7 l.bf执行阶段第2个时钟周期的时序逻辑输出
174
6.4.8 l.bf指令分析小结
175
6.5 l.jalr指令分析
176
6.5.1 l.jalr取指阶段的组合逻辑输出
177
6.5.2 l.jalr取指阶段的时序逻辑输出
177
6.5.3 l.jalr译码阶段的组合逻辑输出
177
6.5.4 l.jalr译码阶段的时序逻辑输出
179
6.5.5 l.jalr执行阶段第1个时钟周期的组合逻辑输出 180
6.5.6 l.jalr执行阶段第2个时钟周期的组合逻辑输出 181
6.5.7 l.jalr执行阶段第2个时钟周期的时序逻辑输出 182
6.6 转移类指令对处理器效率的影响
182
6.7 继续完善流水线数据通路图
183
第7章 异常处理类指令剖析 185
7.1 OR1200中的异常分类 185
7.2 OR1200中的异常处理过程 185
7.3 异常处理类指令说明 187
7.4 分析用例
187
7.5 EXCEPTION模块的作用
190
7.6 l.sys指令分析
195
7.6.1 l.sys取指阶段的组合逻辑输出
196
7.6.2 l.sys取指阶段的时序逻辑输出
196
7.6.3 l.sys译码阶段的组合逻辑输出
197
7.6.4 l.sys译码阶段的时序逻辑输出
198
7.6.5 l.sys执行阶段的组合逻辑输出
199
7.6.6 l.sys执行阶段的时序逻辑输出
201
7.6.7 异常处理过程——FLU1状态 207
7.6.8 异常处理过程——FLU2状态 211
7.6.9 异常处理过程——FLU3状态 212
7.6.10 异常处理过程——FLU4状态
212
7.6.11 异常处理过程——FLU5状态
213
7.6.12 l.sys分析小结 214
7.7 l.trap指令分析 215
7.7.1 l.trap译码阶段的时序逻辑输出
216
7.7.2 l.trap执行阶段的组合逻辑输出
216
7.7.3 l.trap执行阶段的时序逻辑输出
216
7.7.4 异常处理过程——FLU1状态 217
7.7.5 异常处理过程——FLU2状态 217
7.7.6 l.trap分析小结 218
7.8 l.rfe指令分析
218
7.8.1 l.rfe取指阶段的组合逻辑输出
219
7.8.2 l.rfe取指阶段的时序逻辑输出
219
7.8.3 l.rfe译码阶段的组合逻辑输出
220
7.8.4 l.rfe译码阶段的时序逻辑输出
221
7.8.5 l.rfe执行阶段第1个时钟周期的组合逻辑输出 223
7.8.6 l.rfe执行阶段第2个时钟周期的组合逻辑输出 224
7.8.7 l.rfe执行阶段第2个时钟周期的时序逻辑输出 225
7.9 继续完善流水线数据通路图
226
第8章 乘法、除法类指令剖析
228
8.1 串行乘法与并行乘法 228
8.1.1 串行乘法 228
8.1.2 并行乘法 229
8.2 串行除法与并行除法 230
8.2.1 串行除法 230
8.2.2 并行除法 231
8.3 乘法、除法类指令说明
232
8.4 OR1200中关于乘法、除法的一些配置 234
8.5 分析用例
234
8.6 l.mul指令分析(串行乘法)
238
8.6.1 l.mul取指阶段的组合逻辑输出
239
8.6.2 l.mul取指阶段的时序逻辑输出
240
8.6.3 l.mul译码阶段的组合逻辑输出
240
8.6.4 l.mul译码阶段的时序逻辑输出
241
8.6.5 l.mul执行阶段第1个时钟周期的组合逻辑输出 243
8.6.6 l.mul执行阶段第1个时钟周期的时序逻辑输出 245
8.6.7 l.mul执行阶段第2个时钟周期的组合逻辑输出 247
8.6.8 l.mul执行阶段第2个时钟周期的时序逻辑输出 249
8.6.9 l.mul执行阶段第33个时钟周期的时序逻辑输出
250
8.6.10 l.mul执行阶段第34个时钟周期的组合逻辑输出
250
8.6.11 l.mul执行阶段第34个时钟周期的时序逻辑输出
252
8.6.12 l.mul执行阶段第35个时钟周期的时序逻辑输出
252
8.6.13 l.mul分析小结 252
8.7 l.mul指令分析(并行乘法)
253
8.7.1 l.mul执行阶段第1个时钟周期的组合逻辑输出(并行乘法) 253
8.7.2 l.mul执行阶段第1个时钟周期的时序逻辑输出(并行乘法) 254
8.7.3 l.mul执行阶段第2个时钟周期的组合逻辑输出(并行乘法) 255
8.7.4 l.mul执行阶段第2个时钟周期的时序逻辑输出(并行乘法) 256
8.7.5 l.mul执行阶段第3个时钟周期的时序逻辑输出(并行乘法) 256
8.7.6 l.mul执行阶段第4个时钟周期的组合逻辑输出(并行乘法) 256
8.7.7 l.mul执行阶段第4个时钟周期的时序逻辑输出(并行乘法) 257
8.7.8 l.mul执行阶段第5个时钟周期的时序逻辑输出(并行乘法) 257
8.7.9 l.mul分析小结(并行乘法) 257
8.8 l.mac指令分析 257
8.8.1 l.mac执行阶段第1个时钟周期的组合逻辑输出 259
8.8.2 l.mac执行阶段第1个时钟周期的时序逻辑输出 260
8.8.3 l.mac执行阶段第2个时钟周期的组合逻辑输出 261
8.8.4 l.mac执行阶段第2个时钟周期的时序逻辑输出 261
8.8.5 后l.mac执行阶段第1个时钟周期的时序逻辑输出 262
8.8.6 后l.mac执行阶段第2个时钟周期的时序逻辑输出 262
8.8.7 l.mac指令分析小结 263
8.9 l.div指令分析(串行除法)
263
8.10 继续完善流水线数据通路图 266
第9章 加载存储类指令剖析 268
9.1 加载存储类指令说明 268
9.2 分析用例
270
9.3 l.sb指令分析
274
9.3.1 l.sb取指阶段的组合逻辑输出 276
9.3.2 l.sb取指阶段的时序逻辑输出 276
9.3.3 l.sb译码阶段的组合逻辑输出 276
9.3.4 l.sb译码阶段的时序逻辑输出 278
9.3.5 l.sb执行阶段第1个时钟周期的组合逻辑输出 280
9.3.6 l.sb执行阶段第2个时钟周期的组合逻辑输出 286
9.3.7 l.sb执行阶段第2个时钟周期的时序逻辑输出 287
9.3.8 l.sb指令分析小结 287
9.4 l.lbs指令分析
288
9.4.1 l.lbs执行阶段第1个时钟周期的组合逻辑输出 290
9.4.2 l.lbs执行阶段第2个时钟周期的组合逻辑输出 291
9.4.3 l.lbs执行阶段第2个时钟周期的时序逻辑输出 294
9.4.4 l.lbs指令分析小结 294
9.5 对齐异常处理流程
295
9.6 三级流水线还是五级流水线
297
9.7 完整的流水线数据通路图 298
第10章
MMU剖析 301
10.1 MMU的作用及工作过程 301
10.2 TLB的作用及工作过程
303
10.3 IMMU分析
305
10.3.1 IMMU结构
305
10.3.2 IMMU中的特殊寄存器 307
10.3.3 OR1200中关于IMMU的一些配置
308
10.3.4 ITLB代码分析 309
10.3.5 IMMU使用情景
313
10.3.6 分析用例 313
10.3.7 IMMU使用情景之一——指令取指阶段ITLB命中且无页错误情况下IMMU工作分析
324
10.3.8 IMMU使用情景之二——指令取指阶段ITLB未命中情况下IMMU工作分析
329
10.3.9 IMMU使用情景之三——指令取指阶段ITLB命中但有页错误情况下IMMU工作分析
333
10.3.10 IMMU使用情景之四——l.mtspr执行阶段IMMU工作分析 333
10.3.11 IMMU使用情景之五——l.mfspr执行阶段IMMU工作分析 335
10.3.12 IMMU分析小结 336
10.4 DMMU分析
336
10.4.1 DTLB结构图 337
10.4.2 DMMU中的特殊寄存器 337
10.4.3 DMMU使用情景 338
第11章 基于OR1200的一个简单SOPC 340
11.1 简单SOPC的结构
340
11.2 Wishbone总线互联矩阵WB_CONMAX
341
11.3 挂接在互联矩阵WB_CONMAX下的RAM模块
342
11.4 SOPC顶层文件 344
11.5 ModelSim新建工程min_or1200_sopc
346
11.6 示例程序 348
第12章
ICache剖析 350
12.1 Cache基本知识 350
12.1.1 Cache的作用 350
12.1.2 Cache的结构与工作过程
351
12.2 OR1200中Cache简介
352
12.3 ICache结构 353
12.3.1 ICache模块与其余模块的连接关系
353
12.3.2 ICache中数据部分 354
12.3.3 ICache中控制部分 356