Chisel(Constructing Hardware in a Scala Embedded Language):
它是跑在 Scala 上的硬件构造语言,不是传统 HDL,而是"用 Scala 写程序来生成 Verilog/SystemVerilog 电路"。
一、Chisel 和 Scala 的关系
- Scala:通用编程语言(面向对象 + 函数式)
- Chisel:Scala 里的一套库/DSL,用来描述硬件
- Chisel 代码 → FIRRTL → Verilog/SystemVerilog → FPGA/ASIC 工具链
- DSL = Domain-Specific Language(领域专用语言)
- FIRRTL = Flexible Intermediate Representation for RTL
核心区别:
// Scala 层:生成阶段执行
val width = 32
val lanes = Seq.fill(4)(0)
// Chisel 层:描述的是硬件
val a = Wire(UInt(32.W))
val r = RegInit(0.U(8.W))
io.out := a + r
Int 是生成程序里的数,UInt 是被生成硬件里的信号。
二、先学 Scala 的哪一部分(不用学全)
学 Chisel 不需要先变成 Scala 专家,先掌握这些就够:
- 基础
val/var(Chisel 里基本只用val)def定义函数- 类型标注:
x: Int、y: UInt
- 集合与函数式
Seq/List/Mapmap/foreach/zip/reduce/fold- 匿名函数:
(i: Int) => i + 1
- 面向对象
class A extends Bobject单例trait(后面做复用/接口很有用)
- 控制结构
if/else是表达式match/case模式匹配for (i <- 0 until n)
三、Chisel 核心概念
import chisel3._
import chisel3.util._
class MyAdder(width: Int) extends Module {
val io = IO(new Bundle {
val a = Input(UInt(width.W))
val b = Input(UInt(width.W))
val cin = Input(Bool())
val sum = Output(UInt(width.W))
val cout = Output(Bool())
})
val aExt = Cat(0.U(1.W), io.a)
val bExt = Cat(0.U(1.W), io.b)
val total = aExt + bExt + io.cin
io.sum := total(width - 1, 0)
io.cout := total(width)
}
要记住的要点:
Module:一个硬件模块IO(new Bundle {...}):端口定义Wire:组合逻辑信号Reg/RegInit:寄存器:=:硬件连接(不是软件赋值)when/elsewhen/otherwise:硬件条件Mux/switch/is:多路选择 / 状态UInt/SInt/Bool/Bundle/Vec:硬件类型===是比较,=是 Scala 赋值,:=是硬件连接
四、推荐学习路线
- 数字电路基础:组合逻辑、时序逻辑、状态机、计数器、ALU
- Scala 基础(上面那部分)
- Chisel 基础:Module / IO / Wire / Reg / when / Mux
- 小项目:
- 全加器
- 计数器
- 移位寄存器
- 简单 ALU
- 流水灯
- 小 FSM
- 测试:
chiseltest- 跑波形 / Verilator
- 导出 Verilog:
ChiselStage.emitSystemVerilog(...)
- 进阶:
- 参数化生成器
Decoupled/Queue/Arbiter- FIRRTL / CIRCT
- RocketChip / Chipyard / 香山
五、环境和资料
环境:
- JDK 8+
- sbt 或 mill
chisel3+circt/firtool- IDE:IntelliJ + Scala 插件,或 VS Code + Metals
资料:
- 官方:https://www.chisel-lang.org
- Chisel Bootcamp(在线跑,先学 Scala 再学 Chisel):freechipsproject/chisel-bootcamp
- chisel-template:直接起项目
- 书:《Digital Design with Chisel》
- 中文场景:一生一芯、YSYX、中大/南大 Chisel 实验
六、新手最容易踩的坑
- 把 Scala 的
if当成硬件选择 → 硬件用Mux/when - 把
Int和UInt混用 - 用
var写硬件状态 → 时序要用Reg - 以为 Chisel 直接综合 → 它先生成 Verilog
- 写"单个电路实例"而不写"参数化生成器",没发挥出 Chisel 优势