Linguagem de programação Chisel

Linguagem Chisel

Visão Geral do Chisel

Chisel (Construindo Hardware em uma Linguagem Scala Embutida) é uma linguagem de construção de hardware que facilita o design e a verificação de hardware. Ela é construída sobre a linguagem de programação Scala, aproveitando sua expressividade e capacidades de programação funcional para permitir que os designers criem projetos de hardware sofisticados e testbenches com facilidade. O Chisel é utilizado principalmente no desenvolvimento de circuitos digitais, particularmente no âmbito do design de FPGA e ASIC.

Aspectos Históricos

Criação e Desenvolvimento Inicial

O Chisel foi desenvolvido como um projeto de pesquisa na Universidade da Califórnia, Berkeley, sob os auspícios do grupo de Pesquisa em Arquitetura de Berkeley. A motivação por trás de sua criação foi fornecer um meio mais produtivo e eficiente de projetar hardware em comparação com as Linguagens de Descrição de Hardware (HDLs) tradicionais, como Verilog ou VHDL. Ao incorporar o design de hardware dentro de uma linguagem de programação de alto nível, o Chisel visava oferecer melhor abstração, construções de nível superior e reutilização de código.

Evolução e Estado Atual

Desde sua criação, o Chisel ganhou popularidade em ambientes acadêmicos e industriais. A linguagem evoluiu com contribuições de numerosos desenvolvedores, levando a melhorias em suas características, bibliotecas e usabilidade. Sua integração com o Scala permitiu que os designers aproveitassem recursos poderosos, como programação funcional, segurança de tipos e bibliotecas de coleções avançadas. O Chisel é agora amplamente utilizado em projetos modernos de desenvolvimento de hardware, que vão desde pesquisas acadêmicas até produtos comerciais.

Relação com Outras Linguagens e Plataformas

O Chisel se inspira em HDLs como Verilog e VHDL, emprestando seus conceitos centrais enquanto os aprimora com paradigmas de programação do Scala. Ele também se relaciona de perto com outras estruturas de construção de hardware, como SpinalHDL, que também se concentram em produtividade e expressividade. Os designs em Chisel podem ser convertidos em Verilog, permitindo o uso de ferramentas e fluxos de síntese existentes.

Recursos de Sintaxe

DSL Embutida

O Chisel fornece uma Linguagem Específica de Domínio (DSL) embutida dentro do Scala, permitindo que os designers de hardware utilizem a sintaxe do Scala para descrição de hardware. Por exemplo, definir um multiplexador simples de 2 entradas pode ser expresso como:

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)
}

Tipos e Larguras de Bits

O Chisel suporta uma variedade de tipos e permite que os designers especifiquem larguras de bits explicitamente, proporcionando melhor controle sobre a utilização de recursos de hardware. Por exemplo:

val myWire = Wire(UInt(8.W)) // inteiro sem sinal de 8 bits

Abstração de Componentes de Hardware

A linguagem oferece abstrações para componentes de hardware comuns. Por exemplo, para criar um registro simples:

val reg = RegInit(0.U(8.W)) // registro de 8 bits inicializado em 0

Módulos Parametrizados

O Chisel permite a criação de módulos parametrizados, possibilitando designs reutilizáveis com diferentes configurações:

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
}

Expressões Condicionais

O Chisel suporta expressões condicionais para facilitar a lógica de hardware complexa:

val result = Mux(condition, trueValue, falseValue) // Multiplexador

Geradores de Hardware

Construa componentes de hardware modulares usando funções de ordem superior para gerar configurações de hardware:

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
}

Utilitários de Coleção

O Chisel permite o uso de utilitários de coleção do Scala para manipular elementos de hardware de forma eficaz:

val wires = VecInit(Seq.fill(4)(Wire(UInt(8.W)))) // Cria um vetor de 4 fios

Lógica Sequencial

A lógica sequencial é expressa facilmente usando os construtos dedicados do Chisel, como registros:

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

Framework de Testes Integrado

O Chisel se integra ao ScalaTest, permitindo que os desenvolvedores escrevam testes para seus designs de hardware de forma natural:

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

Encadeamento de Métodos

O Chisel suporta encadeamento de métodos, permitindo definições concisas e legíveis de circuitos de hardware complexos:

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

Ferramentas e Ambientes de Desenvolvimento

IDEs e Compilador

O Chisel pode ser desenvolvido usando qualquer IDE que suporte Scala, como IntelliJ IDEA com o plugin Scala. Além disso, o sbt (Scala Build Tool) é comumente usado para gerenciar projetos e dependências, bem como para compilar projetos Chisel em código Verilog.

Construindo um Projeto

Para criar um projeto Chisel, você pode configurar uma estrutura de projeto padrão do sbt. Um simples arquivo build.sbt pode parecer assim:

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

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

Para construir, você executaria sbt run a partir da linha de comando e os arquivos Verilog de saída serão gerados no diretório de destino.

Aplicações

O Chisel é predominantemente utilizado no design e verificação de hardware digital. Ele encontra aplicações em áreas como:

Comparação com Outras Linguagens

O Chisel se destaca em relação às HDLs tradicionais como Verilog e VHDL ao oferecer recursos encontrados em linguagens de programação de alto nível, como programação funcional, segurança de tipos e abstrações de nível superior.

Comparado a outras linguagens:

Dicas para Tradução de Fonte para Fonte

Para traduzir Chisel para outras linguagens de descrição de hardware, ferramentas como o compilador Chisel podem gerar Verilog diretamente a partir do código-fonte Chisel. Não existem ferramentas amplamente conhecidas de tradução de fonte para fonte que convertam Chisel diretamente para outra HDL, mas o Verilog gerado pode ser adaptado manualmente, se necessário.

Ferramentas Existentes de Tradução de Fonte para Fonte

Atualmente, a ferramenta mais reconhecida é a própria cadeia de ferramentas Chisel, que permite aos usuários compilar designs Chisel em código Verilog sintetizável. Também há esforços para integrar o Chisel com outras estruturas de hardware através de várias bibliotecas e ferramentas, promovendo colaboração e interoperabilidade entre diferentes metodologias de design de hardware.