Язык программирования Chisel

Язык Chisel

Обзор Chisel

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, что позволяет использовать существующие инструменты синтеза и рабочие процессы.

Особенности синтаксиса

Встроенный DSL

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

Инструменты разработчика и среды выполнения

IDE и компилятор

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 с другими фреймворками аппаратного обеспечения через различные библиотеки и инструменты, способствуя сотрудничеству и совместимости между различными методологиями проектирования аппаратного обеспечения.