Chisel (Constructing Hardware In a Scala Embedded Language) — это язык проектирования аппаратного обеспечения, который облегчает проектирование и верификацию аппаратных средств. Он построен на основе языка программирования Scala, используя его выразительность и возможности функционального программирования, чтобы позволить дизайнерам легко создавать сложные аппаратные конструкции и тестовые стенды. Chisel в основном используется в разработке цифровых схем, особенно в области проектирования FPGA и ASIC.
Chisel был разработан как исследовательский проект в Университете Калифорнии, Беркли, под эгидой группы исследований архитектуры Беркли. Мотивацией для его создания было предоставление более продуктивного и эффективного средства проектирования аппаратного обеспечения по сравнению с традиционными языками описания аппаратного обеспечения (HDL), такими как Verilog или VHDL. Встраивая проектирование аппаратного обеспечения в язык высокого уровня, Chisel стремился предложить лучшую абстракцию, более высокоуровневые конструкции и повторное использование кода.
С момента своего создания Chisel приобрел популярность как в академических, так и в промышленных кругах. Язык развивался благодаря вкладу многочисленных разработчиков, что привело к улучшению его функций, библиотек и удобства использования. Его интеграция с Scala позволила дизайнерам использовать мощные функции, такие как функциональное программирование, безопасность типов и продвинутые библиотеки коллекций. В настоящее время Chisel широко используется в современных проектах разработки аппаратного обеспечения, начиная от академических исследований и заканчивая коммерческими продуктами.
Chisel черпает вдохновение из HDL, таких как Verilog и VHDL, заимствуя их основные концепции, одновременно улучшая их с помощью программных парадигм Scala. Он также тесно связан с другими фреймворками проектирования аппаратного обеспечения, такими как SpinalHDL, которые также сосредоточены на продуктивности и выразительности. Проекты Chisel могут быть преобразованы в Verilog, что позволяет использовать существующие инструменты синтеза и рабочие процессы.
Chisel предоставляет встроенный язык специального назначения (DSL) в Scala, позволяя дизайнерам аппаратного обеспечения использовать синтаксис 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-битный регистр, инициализированный нулем
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
Chisel можно разрабатывать с помощью любой IDE, поддерживающей Scala, такой как IntelliJ IDEA с плагином Scala. Кроме того, sbt (Scala Build Tool) обычно используется для управления проектами и зависимостями, а также для компиляции проектов 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 выделяется на фоне традиционных HDL, таких как Verilog и VHDL, предлагая функции, характерные для языков высокого уровня, такие как функциональное программирование, безопасность типов и более высокоуровневые абстракции.
По сравнению с другими языками:
Для перевода Chisel в другие языки описания аппаратного обеспечения инструменты, такие как компилятор Chisel, могут напрямую генерировать Verilog из исходного кода Chisel. В настоящее время нет широко известных инструментов перевода из исходного кода в исходный код, которые бы напрямую преобразовывали Chisel в другой HDL, но сгенерированный Verilog можно вручную адаптировать при необходимости.
В настоящее время наиболее признанным инструментом является сам инструментальный комплект Chisel, который позволяет пользователям компилировать конструкции Chisel в синтезируемый код Verilog. Также ведутся работы по интеграции Chisel с другими фреймворками аппаратного обеспечения через различные библиотеки и инструменты, способствуя сотрудничеству и совместимости между различными методологиями проектирования аппаратного обеспечения.