Chisel (Constructing Hardware In a Scala Embedded Language) er et hardwarekonstruktionssprog, der letterer hardwaredesign og verifikation. Det er bygget oven på programmeringssproget Scala, som udnytter dets udtryksfuldhed og funktionelle programmeringsevner til at gøre det muligt for designere at skabe sofistikerede hardwaredesign og testbænke med lethed. Chisel bruges primært i udviklingen af digitale kredsløb, især inden for FPGA- og ASIC-design.
Chisel blev udviklet som et forskningsprojekt ved University of California, Berkeley, under ledelse af Berkeley Architecture Research-gruppen. Motivationen bag oprettelsen var at give en mere produktiv og effektiv måde at designe hardware på sammenlignet med traditionelle Hardware Description Languages (HDL'er) som Verilog eller VHDL. Ved at indlejre hardwaredesign i et højniveau programmeringssprog sigtede Chisel mod at tilbyde bedre abstraktion, højere niveau konstruktioner og kodegenbrug.
Siden sin oprettelse har Chisel vundet popularitet inden for akademiske og industrielle miljøer. Sproget har udviklet sig med bidrag fra mange udviklere, hvilket har ført til forbedringer i dets funktioner, biblioteker og brugervenlighed. Dets integration med Scala har gjort det muligt for designere at udnytte kraftfulde funktioner som funktionel programmering, typesikkerhed og avancerede samlingsbiblioteker. Chisel bruges nu bredt i moderne hardwareudviklingsprojekter, der spænder fra akademisk forskning til kommercielle produkter.
Chisel henter inspiration fra HDL'er som Verilog og VHDL, idet det låner deres kernekoncepter, mens det forbedrer dem med programmeringsparadigmer fra Scala. Det relaterer sig også tæt til andre hardwarekonstruktionsrammer som SpinalHDL, som ligesom Chisel fokuserer på produktivitet og udtryksfuldhed. Chisel-design kan konverteres til Verilog, hvilket muliggør brugen af eksisterende synteseworkflows og værktøjer.
Chisel tilbyder et indlejret domænespecifikt sprog (DSL) inden for Scala, hvilket gør det muligt for hardwaredesignere at udnytte Scalas syntaks til hardwarebeskrivelse. For eksempel kan definitionen af en simpel 2-indgangs multiplexer udtrykkes som:
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 understøtter en række forskellige typer og giver designere mulighed for at specificere bitbredder eksplicit, hvilket giver bedre kontrol over hardwareressourceudnyttelse. For eksempel:
val myWire = Wire(UInt(8.W)) // 8-bit unsigned integer
Sproget tilbyder abstraktioner for almindelige hardwarekomponenter. For eksempel, for at oprette et simpelt register:
val reg = RegInit(0.U(8.W)) // 8-bit register initialiseret til 0
Chisel tillader oprettelse af parametriserede moduler, hvilket muliggør genanvendelige designs med forskellige konfigurationer:
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 understøtter betingede udsagn for at lette kompleks hardwarelogik:
val result = Mux(condition, trueValue, falseValue) // Multiplexer
Konstruer modulære hardwarekomponenter ved hjælp af højere ordens funktioner til at generere hardwarekonfigurationer:
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 tillader brugen af Scala-samlingsværktøjer til effektivt at manipulere hardwareelementer:
val wires = VecInit(Seq.fill(4)(Wire(UInt(8.W)))) // Opret en vektor af 4 ledninger
Sekventiel logik udtrykkes let ved hjælp af Chisels dedikerede konstruktioner, som registre:
when(condition) {
reg := newValue
} .otherwise {
reg := oldValue
}
Chisel integreres med ScalaTest, hvilket gør det muligt for udviklere at skrive tests for deres hardwaredesign naturligt:
class MyModuleTester extends PeekPokeTester(new MyModule) {
poke(dut.a, 1)
poke(dut.b, 0)
expect(dut.out, 1)
}
Chisel understøtter kædning af metoder, hvilket muliggør korte og læsbare definitioner af komplekse hardwarekredsløb:
val result = (a + b).asUInt + c
Chisel kan udvikles ved hjælp af enhver IDE, der understøtter Scala, såsom IntelliJ IDEA med Scala-plugin. Derudover bruges sbt (Scala Build Tool) ofte til at administrere projekter og afhængigheder samt til at kompilere Chisel-projekter til Verilog-kode.
For at oprette et Chisel-projekt kan du opsætte en standard sbt-projektstruktur. En simpel build.sbt
-fil kunne se sådan ud:
name := "MyChiselProject"
version := "0.1"
scalaVersion := "2.12.10"
libraryDependencies += "edu.berkeley.cs" %% "chisel3" % "3.4.4"
For at bygge ville du køre sbt run
fra kommandolinjen, og de genererede Verilog-filer vil blive oprettet i målmappen.
Chisel bruges primært i digital hardwaredesign og verifikation. Det finder anvendelse inden for områder som:
Chisel adskiller sig fra traditionelle HDL'er som Verilog og VHDL ved at tilbyde funktioner, der findes i højniveau programmeringssprog, såsom funktionel programmering, typesikkerhed og højere niveau abstraktioner.
Sammenlignet med andre sprog:
For at oversætte Chisel til andre hardwarebeskrivelsessprog kan værktøjer som Chisel-kompilatoren generere Verilog direkte fra Chisel-kildekode. Der er ingen bredt kendte kilde-til-kilde oversættelsesværktøjer, der konverterer Chisel direkte til en anden HDL, men den genererede Verilog kan manuelt tilpasses, hvis det er nødvendigt.
I øjeblikket er det mest anerkendte værktøj Chisel-værktøjslinjen selv, som gør det muligt for brugere at kompilere Chisel-design til syntetiserbar Verilog-kode. Der er også bestræbelser på at integrere Chisel med andre hardware-rammer gennem forskellige biblioteker og værktøjer, hvilket fremmer samarbejde og interoperabilitet blandt forskellige hardwaredesignmetoder.