编程语言 Chisel

Chisel 语言

Chisel 概述

Chisel(在 Scala 嵌入式语言中构建硬件)是一种硬件构建语言,旨在促进硬件设计和验证。它建立在 Scala 编程语言之上,利用其表达能力和函数式编程特性,使设计师能够轻松创建复杂的硬件设计和测试平台。Chisel 主要用于数字电路的开发,特别是在 FPGA 和 ASIC 设计领域。

历史方面

创建与早期发展

Chisel 是在加利福尼亚大学伯克利分校的伯克利架构研究小组的支持下作为一个研究项目开发的。创建 Chisel 的动机是提供一种比传统硬件描述语言(HDL)如 Verilog 或 VHDL 更高效和更具生产力的硬件设计方式。通过将硬件设计嵌入到高级编程语言中,Chisel 旨在提供更好的抽象、更高层次的构造和代码重用。

演变与现状

自创立以来,Chisel 在学术界和工业界获得了广泛的认可。该语言在众多开发者的贡献下不断演变,导致其特性、库和可用性的改进。与 Scala 的集成使设计师能够利用功能编程、类型安全和高级集合库等强大特性。Chisel 现在广泛应用于现代硬件开发项目,从学术研究到商业产品。

与其他语言和平台的关系

Chisel 从 Verilog 和 VHDL 等硬件描述语言中汲取灵感,借鉴其核心概念,同时结合 Scala 的编程范式进行增强。它还与其他硬件构建框架如 SpinalHDL 密切相关,后者同样关注生产力和表达能力。Chisel 设计可以转换为 Verilog,从而能够使用现有的综合工具和工作流程。

语法特性

嵌入式 DSL

Chisel 在 Scala 中提供了一个嵌入式领域特定语言(DSL),允许硬件设计师利用 Scala 的语法进行硬件描述。例如,定义一个简单的 2 输入多路复用器可以表示为:

class SimpleMux extends Module {
    val io = IO(new Bundle {
        val a = Input(Bool())
        val b = Input(Bool())
        val sel = Input(Bool())
        val out = Output(Bool())
    })
    
    io.out := Mux(io.sel, io.b, io.a)
}

类型和位宽

Chisel 支持多种类型,并允许设计师显式指定位宽,从而更好地控制硬件资源的利用。例如:

val myWire = Wire(UInt(8.W)) // 8 位无符号整数

硬件组件抽象

该语言为常见硬件组件提供了抽象。例如,要创建一个简单的寄存器:

val reg = RegInit(0.U(8.W)) // 8 位寄存器初始化为 0

参数化模块

Chisel 允许创建参数化模块,使得可重用设计具有不同的配置:

class ParamModule(val size: Int) extends Module {
    val io = IO(new Bundle {
        val input = Input(UInt(size.W))
        val output = Output(UInt(size.W))
    })
    
    io.output := io.input + 1.U
}

条件表达式

Chisel 支持条件表达式,以便于复杂硬件逻辑的实现:

val result = Mux(condition, trueValue, falseValue) // 多路复用器

硬件生成器

使用高阶函数构建模块化硬件组件,以生成硬件配置:

def makeAdder(n: Int) = new Module {
    val io = IO(new Bundle {
        val a = Input(UInt(n.W))
        val b = Input(UInt(n.W))
        val sum = Output(UInt(n.W))
    })
    io.sum := io.a + io.b
}

集合工具

Chisel 允许使用 Scala 集合工具有效地操作硬件元素:

val wires = VecInit(Seq.fill(4)(Wire(UInt(8.W)))) // 创建一个包含 4 根线的向量

顺序逻辑

使用 Chisel 的专用构造轻松表达顺序逻辑,例如寄存器:

when(condition) {
    reg := newValue
} .otherwise {
    reg := oldValue
}

内置测试框架

Chisel 与 ScalaTest 集成,使开发者能够自然地为其硬件设计编写测试:

class MyModuleTester extends PeekPokeTester(new MyModule) {
    poke(dut.a, 1)
    poke(dut.b, 0)
    expect(dut.out, 1)
}

方法链

Chisel 支持方法链,允许简洁且可读的复杂硬件电路定义:

val result = (a + b).asUInt + c

开发者工具和运行时

IDE 和编译器

Chisel 可以使用任何支持 Scala 的 IDE 开发,例如带有 Scala 插件的 IntelliJ IDEA。此外,sbt(Scala 构建工具)通常用于管理项目和依赖关系,以及将 Chisel 项目编译为 Verilog 代码。

构建项目

要创建一个 Chisel 项目,可以设置一个标准的 sbt 项目结构。一个简单的 build.sbt 文件可能如下所示:

name := "MyChiselProject"
version := "0.1"
scalaVersion := "2.12.10"

libraryDependencies += "edu.berkeley.cs" %% "chisel3" % "3.4.4"

要构建项目,可以从命令行运行 sbt run,输出的 Verilog 文件将生成在目标目录中。

应用

Chisel 主要用于数字硬件设计和验证。它在以下领域找到应用:

与其他语言的比较

Chisel 与传统的硬件描述语言如 Verilog 和 VHDL 的不同之处在于,它提供了高层次编程语言中的特性,如函数式编程、类型安全和更高层次的抽象。

与其他语言相比:

源到源翻译提示

要将 Chisel 转换为其他硬件描述语言,可以使用 Chisel 编译器直接从 Chisel 源代码生成 Verilog。目前没有广为人知的源到源翻译工具可以将 Chisel 直接转换为其他 HDL,但生成的 Verilog 可以根据需要手动调整。

现有的源到源工具

目前,最知名的工具是 Chisel 工具链本身,它允许用户将 Chisel 设计编译为可综合的 Verilog 代码。此外,还有通过各种库和工具将 Chisel 与其他硬件框架集成的努力,促进不同硬件设计方法之间的协作和互操作性。