学习:chiesel,scala

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 专家,先掌握这些就够:

  1. 基础
    • val / var(Chisel 里基本只用 val)
    • def 定义函数
    • 类型标注:x: Int、y: UInt
  2. 集合与函数式
    • Seq / List / Map
    • map / foreach / zip / reduce / fold
    • 匿名函数:(i: Int) => i + 1
  3. 面向对象
    • class A extends B
    • object 单例
    • trait(后面做复用/接口很有用)
  4. 控制结构
    • 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 赋值,:= 是硬件连接

四、推荐学习路线

  1. 数字电路基础:组合逻辑、时序逻辑、状态机、计数器、ALU
  2. Scala 基础(上面那部分)
  3. Chisel 基础:Module / IO / Wire / Reg / when / Mux
  4. 小项目:
    • 全加器
    • 计数器
    • 移位寄存器
    • 简单 ALU
    • 流水灯
    • 小 FSM
  5. 测试:
    • chiseltest
    • 跑波形 / Verilator
  6. 导出 Verilog:
    • ChiselStage.emitSystemVerilog(...)
  7. 进阶:
    • 参数化生成器
    • 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 实验

六、新手最容易踩的坑

  1. 把 Scala 的 if 当成硬件选择 → 硬件用 Mux / when
  2. 把 Int 和 UInt 混用
  3. 用 var 写硬件状态 → 时序要用 Reg
  4. 以为 Chisel 直接综合 → 它先生成 Verilog
  5. 写"单个电路实例"而不写"参数化生成器",没发挥出 Chisel 优势
相关推荐
Swilderrr1 小时前
论文精读:《Directory-Aware Query and Maintenance in Vector Databases》
笔记·学习
kkkkkkkkkk_Z1 小时前
新手自学嵌入式 | 学习日记:LCD显示原理、PWM控制、电容触摸屏(GT9147)驱动开发与项目实战
驱动开发·学习
LXT7122 小时前
每日英语一读|为什么夏天的雷雨,总爱在傍晚出现?
深度学习·学习
知识分享小能手2 小时前
C学习教程,从入门到精通,C语言文件 — 完整知识点详解(14)
c语言·网络·学习
羊羊一洋2 小时前
ROM&RAM
c语言·stm32·学习
优化Henry3 小时前
LTE小区光路降质告警排查与处理实录
运维·网络·学习·5g·tdd
暖馒3 小时前
运动控制框架相关知识
学习
stereohomology4 小时前
我对DeepSeek4.1flash能力变化的感觉和第三方评估相当
人工智能·学习·llm
syagain_zsx5 小时前
protobuf 实战:从 .proto 到 C++ 序列化的完整链路
c++·学习·程序人生·谷歌·protobuf
qq_284274055 小时前
电气控制笔记:常用低压电器符号原理与异步电动机点动、自锁、多地控制电路(含考点)
笔记·学习·自动化·制造