学习: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 优势
相关推荐
choumou_M1 小时前
算法_1:由浅入深学习快速排序QuickSort
学习·算法·排序算法
蒸蒸yyyyzwd6 小时前
后端学习笔记 day111
笔记·学习
叼烟扛炮6 小时前
[LangChain] 学习笔记(08):工具调用底层闭环与第三方搜索(Tavily)实战
人工智能·笔记·学习·langchain
Century_Dragon7 小时前
让新能源故障诊断实训“触手可及“——仿真教学软件(VR)介绍
学习
楚山之石8 小时前
【Radiology】影像组学的标准化与可重复性:IBSI 卷积滤波器共识及其未能覆盖的环节
人工智能·学习·机器学习·mri
小李不想当小白9 小时前
HAL库之UART(STM32 HAL库学习笔记)
笔记·stm32·单片机·嵌入式硬件·学习·嵌入式
旖旎夜光10 小时前
【C++ 基础入门】C++ 多态(中):虚函数表、多态原理与动静绑定
开发语言·c++·笔记·学习
旖旎夜光11 小时前
【C++ 基础入门】C++多态(下):单/多继承虚表、多态补充与 21 道高频题
开发语言·c++·笔记·学习
叼烟扛炮16 小时前
[LangChain] 学习笔记(07):大模型长出手脚——工具(Tools)定义与调用闭环
笔记·学习·langchain
叼烟扛炮20 小时前
[LangChain] 学习笔记(06):突破大模型限制——结构化输出(Structured Output)
windows·笔记·学习·langchain