图书简介:
目 录
第1章 新型敏捷硬件开发语言——Chisel和Scala 1
1.1 最好的宿主——什么是Scala 1
1.2 敏捷开发——什么是Chisel 1
1.3 Scala入门——让你的代码跑起来 3
1.3.1 Scala的安装方法 3
1.3.2 使用Scala解释器 4
1.3.3 运行Scala脚本 4
1.3.4 编译非脚本文件 5
1.3.5 使用IDEA开发Scala项目 5
1.3.6 总结 7
1.4 章节安排 7
1.5 芯片自主创新:历史传承、产业实践与技术路径 8
1.5.1 古代工程技术中的系统思维 8
1.5.2 芯片产业技术实践的多维观察 8
1.5.3 Chisel学习与工程实践方法 9
1.6 参考文献 9
1.7 课后练习 9
第2章 Chisel入门与Scala变量函数基础 11
2.1 Scala变量定义与基本类型 11
2.1.1 变量定义的本质与规则 11
2.1.2 Scala的基本类型体系 13
2.1.3 函数及其多种形态 15
2.2 Chisel 7.3开发环境搭建 22
2.2.1 环境要求与软件版本 22
2.2.2 安装步骤 23
2.2.3 项目结构与配置 24
2.2.4 开发环境测试 25
2.3 Chisel 7.3的核心特性与编译流程 26
2.3.1 Chisel 7.3的包结构 26
2.3.2 编译流程详解 26
2.3.3 为什么使用SystemVerilog 27
2.3.4 编译API详解 28
2.3.5 多时钟域处理 28
2.3.6 常见问题与解决方案 29
2.4 CIRCT后端与编译优化 30
2.4.1 CIRCT后端简介 30
2.4.2 firtool工具详解 31
2.4.3 与传统Chisel 3.x流程的对比 31
2.5 总结 32
2.6 课后练习 33
第3章 Chisel数据类型与Scala集合应用 35
3.1 Chisel数据类型概述 35
3.2 Chisel数据类型层次结构 35
3.3 基本数据类型 36
3.3.1 Bits抽象类型 36
3.3.2 UInt与SInt 37
3.3.3 Bool类型 37
3.3.4 Clock和Reset 38
3.4 复合数据类型 39
3.4.1 Bundle 39
3.4.2 Vec 40
3.4.3 MixedVec 41
3.5 类型转换 41
3.5.1 UInt与SInt的相互转换 41
3.5.2 Bool与UInt的相互转换 42
3.5.3 类型转换时的宽度处理 42
3.6 操作符 42
3.7 宽度推断 45
3.7.1 宽度推断规则详解 45
3.7.2 强制指定宽度 46
3.7.3 宽度控制的最佳实践 46
3.7.4 DontCare的使用 46
3.8 Scala集合在Chisel中的应用 46
3.8.1 数组与数组缓冲 47
3.8.2 列表与列表缓冲 48
3.8.3 元组 49
3.8.4 映射与集合 49
3.8.5 Scala集合与Chisel Vec的对比 50
3.9 总结 51
3.10 课后练习 51
第4章 Chisel硬件设计中的操作、控制与分层 53
4.1 基础硬件操作:构建电路的“原子部件” 53
4.1.1 硬件类型体系与核心特性 53
4.1.2 硬件赋值的核心规则 59
4.2 Scala控制结构:组织硬件逻辑的“工具” 59
4.2.1 条件控制结构:硬件的“分支逻辑” 60
4.2.2 循环控制结构:硬件的“重复逻辑” 62
4.2.3 异常与作用域控制:硬件的“安全性保障” 65
4.3 Layers概念:复杂电路的“分层抽象” 67
4.3.1 Layers的核心思想与原则 67
4.3.2 Layers的分层模型与实现步骤 68
4.3.3 Layers的核心优势与最佳实践 71
4.3.4 Layers的实际应用场景 72
4.4 总结 78
4.5 课后练习 78
第5章 Chisel中的面向对象设计与类型系统解析 81
5.1 Scala面向对象编程基础 81
5.1.1 类与对象的定义 81
5.1.2 构造方法:主构造与辅助构造 83
5.1.3 继承与多态 84
5.1.4 单例对象与伴生对象 86
5.2 Scala类型系统核心:参数化与抽象成员 87
5.2.1 类型参数化(泛型) 87
5.2.2 型变注解:协变、逆变与不变 89
5.2.3 抽象成员 91
5.3 从Scala到Chisel:面向对象硬件设计实践 94
5.3.1 Chisel模块的类封装 94
5.3.2 硬件接口的Bundle封装 96
5.3.3 泛型在Chisel中的应用:参数化硬件 98
5.3.4 继承与特质:硬件功能复用 101
5.4 总结 103
5.5 课后练习 103
第6章 Chisel硬件设计原语与高级生成器 106
6.1 多路选择器:组合逻辑的核心 106
6.1.1 基本二选一:Mux 106
6.1.2 多条件与查找表:MuxCase与MuxLookup 106
6.1.3 独热码与优先级:Mux1H与PriorityMux 108
6.2 优先编码器:从多路信号到编码索引 109
6.2.1 PriorityEncoder:输出二进制索引 109
6.2.2 PriorityEncoderOH:输出独热码 109
6.3 仲裁器:多个生产者共享一个通道 110
6.3.1 Decoupled 接口与 ready/valid 握手 110
6.3.2 Arbiter:固定优先级仲裁 111
6.3.3 RRArbiter:轮询公平仲裁 111
6.4 队列 Queue:基于ready/valid的同步FIFO 112
6.4.1 Queue 的构造与接口 112
6.4.2 工厂方法:一行接好FIFO 113
6.5 ROM与RAM:构造可综合存储器 113
6.5.1 VecInit构造组合ROM 113
6.5.2 Mem:组合读、同步写 114
6.5.3 SyncReadMem:同步读、同步写 115
6.6 常用位操作与寄存器小工具 115
6.6.1 PopCount与Reverse:统计与翻转 115
6.6.2 UIntToOH与OHToUInt:编码转换 116
6.6.3 RegEnable与ShiftRegister:条件更新与时序对齐 116
6.7 高级生成器:Counter、LFSR与ChiselEnum 116
6.7.1 Counter:参数化计数器生成器 117
6.7.2 LFSR:线性反馈移位寄存器 117
6.7.3 ChiselEnum:类型安全的状态机枚举 118
6.8 总结 119
6.9 课后练习 119
第7章 Chisel设计的生成、测试与优化 121
7.1 生成Verilog HDL代码 121
7.1.1 核心生成工具:CIRCT Stage 121
7.1.2 基础生成示例:全加器 122
7.1.3 灵活配置生成选项 124
7.1.4 命令行动态传参 124
7.2 参数化设计与生成 125
7.2.1 参数化设计:n位加法器 125
7.2.2 参数化模块的Verilog生成 126
7.3 现代测试框架:ChiselSim 127
7.3.1 环境配置 127
7.3.2 核心API介绍 128
7.3.3 基础测试用例:n位加法器测试 128
7.3.4 运行测试 130
7.3.5 可重用的刺激模式 130
7.4 波形生成与可视化 132
7.4.1 生成VCD波形文件 132
7.4.2 查看波形文件 133
7.4.3 其他波形格式支持 133
7.5 高级测试技术 134
7.5.1 参数化测试 134
7.5.2 自定义命令行选项 135
7.5.3 模拟器后端选择 137
7.6 形式化验证入门 138
7.6.1 形式化验证基础概念 138
7.6.2 Chisel中的断言使用 138
7.6.3 assume和cover的使用 139
7.6.4 形式化验证工具集成 141
7.7 FileCheck:直接检查生成的代码 141
7.7.1 FileCheck基础 141
7.7.2 FileCheck API 141
7.7.3 生成代码用于FileCheck 141
7.7.4 FileCheck测试示例 142
7.8 性能分析与优化 143
7.8.1 RTL代码分析 143
7.8.2 性能瓶颈识别 144
7.8.3 常见优化技术 145
7.8.4 综合工具集成与报告分析 147
7.9 优化生成与测试流程 148
7.9.1 代码生成优化 148
7.9.2 测试效率优化 149
7.9.3 持续集成与自动化 149
7.10 总结 150
7.11 实践建议与最佳实践 150
7.11.1 项目组织建议 151
7.11.2 调试技巧 151
7.11.3 常见陷阱与解决方案 152
7.11.4 性能优化清单 153
7.11.5 工具链配置建议 153
7.11.6 文档化建议 154
7.11.7 学习资源推荐 155
7.12 课后练习 156
第8章 黑盒与多时钟域设计 158
8.1 黑盒 158
8.1.1 例化黑盒 158
8.1.2 导入Verilog文件 160
8.1.3 inout端口处理 162
8.2 多时钟域设计 163
8.2.1 无隐式端口的模块(RawModule) 163
8.2.2 定义时钟域和复位域 163
8.2.3 复位类型 165
8.2.4 时钟负沿与低有效复位 165
8.3 跨时钟域信号同步 166
8.3.1 亚稳态问题 166
8.3.2 双触发器同步器 166
8.3.3 多位数据信号同步 167
8.3.4 握手协议同步器 167
8.3.5 异步FIFO深入分析 168
8.3.6 多时钟域设计最佳实践 169
8.4 综合应用示例 169
8.5 总结 171
8.6 课后练习 171
第9章 Scala隐式机制与Chisel函数抽象 173
9.1 Scala隐式机制基础 173
9.1.1 隐式机制的核心规则 173
9.1.2 隐式转换的三种应用场景 173
9.1.3 隐式类:简化富包装类定义 174
9.1.4 上下文界定:简化隐式参数声明 175
9.2 Chisel中的函数抽象 175
9.2.1 组合逻辑抽象为函数 175
9.2.2 工厂方法简化模块例化 176
9.2.3 Scala高阶函数简化硬件生成 177
9.3 Chisel内置高级函数 178
9.3.1 位操作函数 178
9.3.2 计数与编码函数 179
9.3.3 对数与查找表函数 179
9.3.4 打印函数:调试与验证 180
9.4 隐式机制与函数抽象的高级应用 181
9.4.1 隐式类实现自定义硬件操作 181
9.4.2 递归函数实现参数化延时模块 182
9.5 总结 183
9.6 课后练习 183
第10章 Chisel工程化开发规范与版本迁移 186
10.1 模块与信号命名管理 186
10.1.1 模块重命名(desiredName) 186
10.1.2 编译器插件:信号命名优化 187
10.1.3 信号前缀与自定义命名 188
10.2 参数化Bundle设计 190
10.2.1 基本参数化Bundle 190
10.2.2 多配置Bundle与实例复用 191
10.3 定点数支持策略与Interval/FixedPoint说明 191
10.3.1 基于整数缩放的定点编码 192
10.3.2 FixedPoint/Interval:实验性与外部库说明 193
10.4 断言(assert) 193
10.4.1 断言的用法 193
10.4.2 断言触发机制回顾 195
10.4.3 断言的测试示例 195
10.5 从早期Chisel工程升级至Chisel 7.3完整操作指南 196
10.5.1 升级前的准备工作 196
10.5.2 代码与构建配置的迁移 197
10.5.3 利用Chisel 7.3的工程化特性做“顺手优化” 198
10.5.4 升级完成后的自检 198
10.6 总结 198
10.7 课后练习 199
第11章 riscv-mini 201
11.1 riscv-mini简介 201
11.2 数据通路 201
11.3 riscv-mini的子模块 202
11.3.1 ALU模块 202
11.3.2 BrCond模块 203
11.3.3 Cache模块 204
11.3.4 Control模块 205
11.3.5 CSR模块 206
11.3.6 Imm Gen模块 207
11.3.7 Instructions模块 207
11.3.8 RegFile模块 208
11.3.9 Datapath模块 208
11.3.10 Core模块 209
11.4 riscv-mini参数化机制 209
11.4.1 Field[T]类 209
11.4.2 View类 210
11.4.3 Parameters类及其伴生对象 211
11.4.4 Config类 212
11.5 参数化机制的应用 212
11.6 总结 217
11.7 参考文献 217
11.8 课后练习 218
第12章 Chisel标准库深入与常用设计模式 219
12.1 Ready-Valid协议:流控的基石与语义分层 219
12.2 标准库核心组件:从队列到仲裁器 220
12.3 工程化流水线设计:模板、反压与性能权衡 222
12.3.1 通用流水线阶段模板 222
12.3.2 性能权衡:吞吐率和延迟 223
12.4 验证:让正确性可衡量 223
12.4.1 功能测试与随机反压 223
12.4.2 协议级断言与覆盖率 224
12.5 代码风格与工程实践 224
12.6 进阶主题与延伸阅读 225
12.7 总结 225
12.8 课后练习 225
第13章 Chisel 实践与应用案例 227
13.1 基于Chisel的神经网络加速器设计 227
13.1.1 设计目标与架构选型 227
13.1.2 输入/输出缓存设计 228
13.1.3 MAC阵列与激活函数实现 230
13.1.4 顶层模块集成与状态机控制 232
13.1.5 参数化配置与代码复用 234
13.1.6 性能优化策略 235
13.1.7 Verilog生成与验证 235
13.1.8 进阶拓展方向 236
13.2 基于Verilator的混合语言仿真与验证方法学 238
13.2.1 Chisel内置仿真框架与Verilator集成 238
13.2.2 Verilator直接验证Chisel生成的Verilog 240
13.2.3 混合仿真:Chisel与Verilog模块集成 243
13.2.4 高级验证技术 245
13.3 Constellation:工业级片上网络生成器 246
13.3.1 NoC技术背景与设计挑战 246
13.3.2 Constellation项目定位与特点 247
13.3.3 工程结构与模块组织 247
13.3.4 参数化配置体系 249
13.3.5 仿真与功能验证 250
13.3.6 综合与RISC-V生态集成 251
13.3.7 Constellation项目总结 252
13.4 系统级设计:香山Minjie与Chipyard Diplomacy 252
13.4.1 生成式结构建模 252
13.4.2 可配置架构生成 254
13.4.3 香山Minjie开发平台 256
13.4.4 Chipyard Diplomacy机制 257
13.4.5 系统级设计方法总结 260
13.5 总结与展望 260
13.5.1 本章核心内容回顾 260
13.5.2 全书知识体系总结 261
13.5.3 Chisel学习建议与实践路径 262
13.5.4 Chisel的美好未来 263
参考文献 266
展开
前 言
从本书第1版出版到现在,数字芯片设计领域的技术演进速度远超预期。如今,主流芯片晶体管数量已达千亿量级,异构计算、存算一体等新架构层出不穷,传统硬件描述语言的效率瓶颈日益凸显,推动了以Chisel为代表的敏捷开发方法快速发展。短短几年间,Chisel已从3.x迭代到7.x,CIRCT编译框架走向成熟,RISC-V生态中基于Chisel的设计已覆盖从微控制器到高性能处理器的完整产品线。这些变化让我们下定决心修订本书——只有紧跟前沿,才能提供契合产业需求的知识工具。
与第1版相比,本书主要在三个方面进行了改进。
一是内容全面更新。替换Chisel 3.x旧案例,聚焦7.x核心特性,深入讲解CIRCT后端优化机制,新增多时钟域处理、定点运算优化等工业高频技术点,确保所学内容与主流开发流程一致。
二是知识体系重新组织。摒弃“Chisel+Scala”割裂结构,将Scala的面向对象和函数式编程特性融入硬件设计,新增Layers分层设计、工程化命名规范等方法,帮助建立“用软件语法表达硬件逻辑”的系统认知。
三是实践案例贴近工业。在保留经典案例的基础上,新增神经网络加速器、Constellation片上网络等实战项目,完整展示从模块编码到SoC集成的全过程。
本书配套资源已升级,含电子课件PPT、课后练习参考答案、教学大纲、程序源代码、Chisel 7.x模板、CIRCT配置文件及工业案例源码,正版用户可扫描封底二维码查看相关资源,任课教师可登录华信教育资源网注册后免费下载,也可联系责任编辑(wangxq@phei.com.cn、010-88254113)索取。
本书第1、2、3、13章由梁峰编写,第4~7章由雷冰洁编写,第8~11章由王旭辉编写,第12章由张国和编写。雷冰洁校对全书,梁峰统筹全局,全书由王旭辉统稿。
衷心感谢各方支持:感谢加州大学伯克利分校Chisel团队的文档与社区答疑;感谢国内RISC-V工程师分享一线需求;特别感谢使用第1版的师生,你们的反馈是我们修订的动力;也感谢研究生江浩云、石可欣、张桂铭、刘奥等在CIRCT解析和代码验证中的投入,以及众多同学在调试与习题整理上的付出;同时感谢电子工业出版社编辑团队的专业支持。
当前芯片自主创新是国家战略重点,敏捷开发是人才培养的关键基础。我们希望本书成为连接教学与产业的桥梁,助力更多人掌握Chisel,抓住数字芯片设计机遇。因技术更新快,加上我们水平有限,书中难免有所疏漏,欢迎通过电子邮箱(wangxq@phei.com.cn)指正。
作 者
2025年12月
展开