
ChiselConstructing Hardware in a Scala Embedded Language它是跑在 Scala 上的硬件构造语言不是传统 HDL而是“用 Scala 写程序来生成 Verilog/SystemVerilog 电路”。一、Chisel 和 Scala 的关系Scala通用编程语言面向对象 函数式ChiselScala 里的一套库/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 rInt是生成程序里的数UInt是被生成硬件里的信号。二、先学 Scala 的哪一部分不用学全学 Chisel 不需要先变成 Scala 专家先掌握这些就够基础val/varChisel 里基本只用valdef定义函数类型标注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 赋值:是硬件连接四、推荐学习路线数字电路基础组合逻辑、时序逻辑、状态机、计数器、ALUScala 基础上面那部分Chisel 基础Module / IO / Wire / Reg / when / Mux小项目全加器计数器移位寄存器简单 ALU流水灯小 FSM测试chiseltest跑波形 / Verilator导出 VerilogChiselStage.emitSystemVerilog(...)进阶参数化生成器Decoupled/Queue/ArbiterFIRRTL / CIRCTRocketChip / Chipyard / 香山五、环境和资料环境JDK 8sbt 或 millchisel3circt/firtoolIDEIntelliJ Scala 插件或 VS Code Metals资料官方https://www.chisel-lang.orgChisel Bootcamp在线跑先学 Scala 再学 Chiselfreechipsproject/chisel-bootcampchisel-template直接起项目书《Digital Design with Chisel》中文场景一生一芯、YSYX、中大/南大 Chisel 实验六、新手最容易踩的坑把 Scala 的if当成硬件选择 → 硬件用Mux/when把Int和UInt混用用var写硬件状态 → 时序要用Reg以为 Chisel 直接综合 → 它先生成 Verilog写“单个电路实例”而不写“参数化生成器”没发挥出 Chisel 优势