学习: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 优势
相关推荐
爱吃汽的小橘2 小时前
异步FIFO核心揭秘:格雷码与指针同步
fpga开发
艾莉丝努力练剑2 小时前
【AI大模型接入SDK】ChatSDK 集成测试概述
jvm·c++·人工智能·学习·面试·集成测试·sdk
艾莉丝努力练剑2 小时前
【AI大模型接入SDK】ChatSDK:CMake构建静态库完整实现
java·开发语言·网络·c++·人工智能·学习·sdk
Joe_Wang53 小时前
【从0到1学习JVM · 14】堆内存各区域分工与Xms和Xmx设为一样的真相
java·jvm·学习·垃圾回收
東隅已逝,桑榆非晚3 小时前
stack和queue(类函数学习和模拟实现)
c++·笔记·学习
Vcaker3 小时前
Linux学习37-rook-ceph部署
linux·运维·学习
璞致电子3 小时前
基于 P201Pro | 接收端基础知识——Costas环锁定后为何仍会错?DQPSK与前导码相位校正(6)
经验分享·fpga开发·ad9361·软件无线电·sdr·qpsk·pzsdr
阳光九叶草LXGZXJ3 小时前
Linux-学习-12-JDK安装
java·linux·运维·学习
tiankongdeyige11 小时前
游戏战斗系统学习第2篇:有限状态机 (FSM)
学习·游戏·typescript