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.
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.
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.
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.
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)
}
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
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
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
}
O Chisel suporta expressões condicionais para facilitar a lógica de hardware complexa:
val result = Mux(condition, trueValue, falseValue) // Multiplexador
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
}
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
A lógica sequencial é expressa facilmente usando os construtos dedicados do Chisel, como registros:
when(condition) {
reg := newValue
} .otherwise {
reg := oldValue
}
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)
}
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
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.
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.
O Chisel é predominantemente utilizado no design e verificação de hardware digital. Ele encontra aplicações em áreas como:
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:
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.
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.