Chisel (Constructing Hardware In a Scala Embedded Language) är ett hårdvarukonstruktionsspråk som underlättar hårdvarudesign och verifiering. Det är byggt ovanpå programmeringsspråket Scala, vilket utnyttjar dess uttrycksfullhet och funktionella programmeringsmöjligheter för att möjliggöra för designers att enkelt skapa sofistikerade hårdvarudesign och testbänkar. Chisel används främst inom utvecklingen av digitala kretsar, särskilt inom området FPGA- och ASIC-design.
Chisel utvecklades som ett forskningsprojekt vid University of California, Berkeley, under ledning av Berkeley Architecture Research-gruppen. Motivationen bakom dess skapande var att erbjuda ett mer produktivt och effektivt sätt att designa hårdvara jämfört med traditionella hårdvarubeskrivningsspråk (HDL) som Verilog eller VHDL. Genom att integrera hårdvarudesign inom ett hög-nivå programmeringsspråk syftade Chisel till att erbjuda bättre abstraktion, högre nivåkonstruktioner och kodåteranvändning.
Sedan sin början har Chisel fått popularitet inom akademiska och industriella miljöer. Språket har utvecklats med bidrag från många utvecklare, vilket har lett till förbättringar av dess funktioner, bibliotek och användbarhet. Dess integration med Scala har gjort det möjligt för designers att utnyttja kraftfulla funktioner som funktionell programmering, typ-säkerhet och avancerade samlingsbibliotek. Chisel används nu allmänt i moderna hårdvaruutvecklingsprojekt, från akademisk forskning till kommersiella produkter.
Chisel hämtar inspiration från HDL som Verilog och VHDL, och lånar deras kärnkoncept samtidigt som den förbättrar dem med programmeringsparadigm från Scala. Det relaterar också nära till andra hårdvarukonstruktionsramverk som SpinalHDL, som likaså fokuserar på produktivitet och uttrycksfullhet. Chisel-design kan konverteras till Verilog, vilket möjliggör användning av befintliga syntesverktyg och arbetsflöden.
Chisel tillhandahåller ett inbäddat domänspecifikt språk (DSL) inom Scala, vilket gör det möjligt för hårdvarudesigners att använda Scalas syntax för hårdvarubeskrivning. Till exempel kan definieringen av en enkel 2-ingångs multiplexer uttryckas 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 stöder en mängd olika typer och tillåter designers att specificera bitbredder uttryckligen, vilket ger bättre kontroll över hårdvaruresursanvändning. Till exempel:
val myWire = Wire(UInt(8.W)) // 8-bitars osignerad heltal
Språket erbjuder abstraktioner för vanliga hårdvarukomponenter. Till exempel, för att skapa ett enkelt register:
val reg = RegInit(0.U(8.W)) // 8-bitars register initialiserat till 0
Chisel möjliggör skapandet av parametriserade moduler, vilket möjliggör återanvändbara designer med olika 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 stöder villkorsuttryck för att underlätta komplex hårdvarulogik:
val result = Mux(condition, trueValue, falseValue) // Multiplexer
Konstruera modulära hårdvarukomponenter med hjälp av högre ordningens funktioner för att generera hårdvarukonfigurationer:
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 tillåter användning av Scalas samlingsverktyg för att effektivt manipulera hårdvaruelement:
val wires = VecInit(Seq.fill(4)(Wire(UInt(8.W)))) // Skapa en vektor av 4 ledningar
Sekventiell logik uttrycks enkelt med Chisels dedikerade konstruktioner, som register:
when(condition) {
reg := newValue
} .otherwise {
reg := oldValue
}
Chisel integreras med ScalaTest, vilket gör det möjligt för utvecklare att skriva tester för sina hårdvarudesign på ett naturligt sätt:
class MyModuleTester extends PeekPokeTester(new MyModule) {
poke(dut.a, 1)
poke(dut.b, 0)
expect(dut.out, 1)
}
Chisel stöder metodkedjning, vilket möjliggör kortfattade och läsbara definitioner av komplexa hårdvarukretsar:
val result = (a + b).asUInt + c
Chisel kan utvecklas med hjälp av vilken IDE som helst som stöder Scala, såsom IntelliJ IDEA med Scala-plugin. Dessutom används sbt (Scala Build Tool) vanligtvis för att hantera projekt och beroenden, samt för att kompilera Chisel-projekt till Verilog-kod.
För att skapa ett Chisel-projekt kan du ställa in en standard sbt-projektstruktur. En enkel build.sbt
-fil kan se ut så här:
name := "MyChiselProject"
version := "0.1"
scalaVersion := "2.12.10"
libraryDependencies += "edu.berkeley.cs" %% "chisel3" % "3.4.4"
För att bygga skulle du köra sbt run
från kommandoraden och de genererade Verilog-filerna kommer att skapas i målmappen.
Chisel används främst inom digital hårdvarudesign och verifiering. Det finner tillämpningar inom områden som:
Chisel skiljer sig från traditionella HDL som Verilog och VHDL genom att erbjuda funktioner som finns i hög-nivå programmeringsspråk, såsom funktionell programmering, typ-säkerhet och högre nivåabstraktioner.
Jämfört med andra språk:
För att översätta Chisel till andra hårdvarubeskrivningsspråk kan verktyg som Chisel-kompilatorn generera Verilog direkt från Chisel-källkod. Det finns inga allmänt kända källkod-till-källkod översättningsverktyg som konverterar Chisel direkt till en annan HDL, men den genererade Verilog-koden kan manuellt anpassas om det behövs.
För närvarande är det mest erkända verktyget Chisel-verktygskedjan själv, som gör det möjligt för användare att kompilera Chisel-design till syntetiserbar Verilog-kod. Det finns också insatser för att integrera Chisel med andra hårdvaruramverk genom olika bibliotek och verktyg, vilket främjar samarbete och interoperabilitet mellan olika hårdvarudesignmetoder.