Chisel (Constructing Hardware In a Scala Embedded Language) è un linguaggio di costruzione hardware che facilita la progettazione e la verifica dell'hardware. È costruito sopra il linguaggio di programmazione Scala, sfruttando la sua espressività e le capacità di programmazione funzionale per consentire ai progettisti di creare design hardware sofisticati e testbench con facilità. Chisel è principalmente utilizzato nello sviluppo di circuiti digitali, in particolare nel campo della progettazione FPGA e ASIC.
Chisel è stato sviluppato come progetto di ricerca presso l'Università della California, Berkeley, sotto l'egida del gruppo di ricerca sull'architettura di Berkeley. La motivazione dietro la sua creazione era fornire un mezzo più produttivo ed efficiente per progettare hardware rispetto ai tradizionali Linguaggi di Descrizione Hardware (HDL) come Verilog o VHDL. Integrando la progettazione hardware all'interno di un linguaggio di programmazione di alto livello, Chisel mirava a offrire una migliore astrazione, costrutti di livello superiore e riutilizzo del codice.
Dalla sua nascita, Chisel ha guadagnato popolarità sia in ambito accademico che industriale. Il linguaggio si è evoluto grazie ai contributi di numerosi sviluppatori, portando a miglioramenti nelle sue funzionalità, librerie e usabilità. La sua integrazione con Scala ha permesso ai progettisti di sfruttare potenti funzionalità come la programmazione funzionale, la sicurezza dei tipi e librerie avanzate di collezioni. Chisel è ora ampiamente utilizzato in progetti di sviluppo hardware moderni, che spaziano dalla ricerca accademica a prodotti commerciali.
Chisel trae ispirazione da HDL come Verilog e VHDL, prendendo in prestito i loro concetti fondamentali mentre li migliora con paradigmi di programmazione provenienti da Scala. Si relaziona anche strettamente ad altri framework di costruzione hardware come SpinalHDL, che si concentrano anch'essi su produttività ed espressività. I design Chisel possono essere convertiti in Verilog, consentendo l'uso di strumenti di sintesi e flussi di lavoro esistenti.
Chisel fornisce un Linguaggio Specifico per Dominio (DSL) incorporato all'interno di Scala, consentendo ai progettisti hardware di utilizzare la sintassi di Scala per la descrizione hardware. Ad esempio, definire un semplice multiplexer a 2 ingressi può essere espresso come:
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 supporta una varietà di tipi e consente ai progettisti di specificare esplicitamente le larghezze di bit, fornendo un migliore controllo sull'utilizzo delle risorse hardware. Ad esempio:
val myWire = Wire(UInt(8.W)) // intero senza segno a 8 bit
Il linguaggio offre astrazioni per i componenti hardware comuni. Ad esempio, per creare un semplice registro:
val reg = RegInit(0.U(8.W)) // registro a 8 bit inizializzato a 0
Chisel consente la creazione di moduli parametrizzati, abilitando design riutilizzabili con diverse configurazioni:
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 supporta espressioni condizionali per facilitare logiche hardware complesse:
val result = Mux(condition, trueValue, falseValue) // Multiplexer
Costruisci componenti hardware modulari utilizzando funzioni di ordine superiore per generare configurazioni 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
}
Chisel consente l'uso delle utilità di collezione di Scala per manipolare efficacemente gli elementi hardware:
val wires = VecInit(Seq.fill(4)(Wire(UInt(8.W)))) // Crea un vettore di 4 fili
La logica sequenziale è espressa facilmente utilizzando i costrutti dedicati di Chisel, come i registri:
when(condition) {
reg := newValue
} .otherwise {
reg := oldValue
}
Chisel si integra con ScalaTest, consentendo agli sviluppatori di scrivere test per i loro design hardware in modo naturale:
class MyModuleTester extends PeekPokeTester(new MyModule) {
poke(dut.a, 1)
poke(dut.b, 0)
expect(dut.out, 1)
}
Chisel supporta il chaining dei metodi, consentendo definizioni concise e leggibili di circuiti hardware complessi:
val result = (a + b).asUInt + c
Chisel può essere sviluppato utilizzando qualsiasi IDE che supporti Scala, come IntelliJ IDEA con il plugin Scala. Inoltre, sbt (Scala Build Tool) è comunemente utilizzato per gestire progetti e dipendenze, oltre a compilare progetti Chisel in codice Verilog.
Per creare un progetto Chisel, puoi impostare una struttura di progetto sbt standard. Un semplice file build.sbt
potrebbe apparire così:
name := "MyChiselProject"
version := "0.1"
scalaVersion := "2.12.10"
libraryDependencies += "edu.berkeley.cs" %% "chisel3" % "3.4.4"
Per costruire, dovresti eseguire sbt run
dalla riga di comando e i file Verilog di output verranno generati nella directory di destinazione.
Chisel è prevalentemente utilizzato nella progettazione e verifica dell'hardware digitale. Trova applicazioni in aree come:
Chisel si distingue dai tradizionali HDL come Verilog e VHDL offrendo funzionalità tipiche dei linguaggi di programmazione di alto livello, come la programmazione funzionale, la sicurezza dei tipi e astrazioni di livello superiore.
Rispetto ad altri linguaggi:
Per tradurre Chisel in altri linguaggi di descrizione hardware, strumenti come il compilatore Chisel possono generare Verilog direttamente dal codice sorgente Chisel. Non ci sono strumenti di traduzione da codice a codice ampiamente conosciuti che convertano Chisel direttamente in un altro HDL, ma il Verilog generato può essere adattato manualmente se necessario.
Attualmente, lo strumento più riconosciuto è la toolchain Chisel stessa, che consente agli utenti di compilare design Chisel in codice Verilog sintetizzabile. Ci sono anche sforzi per integrare Chisel con altri framework hardware attraverso varie librerie e strumenti, promuovendo la collaborazione e l'interoperabilità tra diverse metodologie di progettazione hardware.