编辑推荐
系统介绍RISC-V指令集架构。结合实际RISC-V开源实例进行教学。深入剖析RISC-V处理器的微架构以及代码实现。使读者能够快速掌握并轻松使用RISC-V架构处理器。通过学习实例蜂鸟E200的Verilog代码,您将能成为一名合格的数字IC设计工程师。通过学习本书推荐的完整开源SoC平台,您也可以快速搭建FPGA原型平台,运行完整的软件实例。
内容简介
本书是一本介绍通用CPU设计的入门书,以通俗的语言系统介绍了CPU和RISC-V架构,力求为读者揭开CPU设计的神秘面纱,打开计算机体系结构的大门。本书共分为四部分。靠前部分是CPU与RISC-V的综述,帮助初学者对CPU和RISC-V快速地建立起认识。第二部分讲解如何使用Verilog设计CPU,使读者掌握处理器核的设计精髓。第三部分主要介绍蜂鸟E203配套的SoC和软件平台,使读者实现蜂鸟E203 RISC-V处理器在FPGA原型平台上的运行。第四部分是附录,介绍了RISC-V指令集架构,辅以作者加入的背景知识解读和注解,以便于读者理解。本书不仅适合CPU或芯片设计相关从业者阅读使用,也适合作为大中专院校相关师生学习RISC-V处理器设计(使用Verilog语言)和CPU设计的指导用书。
作者简介
胡振波,上海交通大学电子工程系本科、微电子学院硕士。拥有业界多年ASIC和CPU设计与验证经验,先后在Marvell任职ARM架构CPU设计不错工程师、在Synopsys任职研发经理、在比特大陆任职IC设计总监、在武汉聚芯微电子任职架构师,现致力于推动RISC-V架构在靠前的传播和发展。
目录
- 第一部分CPU与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
- 第10章让子弹飞一会儿——写回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
- 第11章哈弗还是比亚迪——存储器架构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
- 第12章黑盒子的窗口——总线接口单元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
- 第13章不得不说的故事——中断和异常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
- 第14章最不起眼的,其实是最难的——调试机制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
- 第15章动如脱兔,静若处子——低功耗的诀窍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
- 第16章工欲善其事,必先利其器——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原型上运行软件
- 第17章冒个烟先——运行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
- 第18章套上壳子上路——实现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
- 第19章画龙点睛——运行和调试软件示例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架构详述
- 附录ARISC-V架构指令集介绍342
- 附录BRISC-V架构CSR寄存器介绍374
- 附录CRISC-V架构的PLIC介绍384
- 附录D存储器模型背景介绍392
- 附录E存储器原子操作指令背景介绍397
- 附录FRISC-V指令编码列表400
- 附录GRISC-V伪指令列表404