Programmeringsspråk Chisel

Chisel-språk

Översikt av Chisel

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.

Historiska Aspekter

Skapande och Tidig Utveckling

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.

Utveckling och Nuvarande Tillstånd

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.

Relation till Andra Språk och Plattformar

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.

Syntaxfunktioner

Inbäddad DSL

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

Typer och Bitbredder

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

Abstraktion av Hårdvarukomponenter

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

Parametriserade Moduler

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
}

Villkorsuttryck

Chisel stöder villkorsuttryck för att underlätta komplex hårdvarulogik:

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

Hårdvarugeneratorer

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
}

Samlingsverktyg

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

Sekventiell logik uttrycks enkelt med Chisels dedikerade konstruktioner, som register:

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

Inbyggt Testningsramverk

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

Kedjning av Metoder

Chisel stöder metodkedjning, vilket möjliggör kortfattade och läsbara definitioner av komplexa hårdvarukretsar:

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

Utvecklarverktyg och Körtider

IDE:er och Kompilator

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.

Bygga ett Projekt

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.

Tillämpningar

Chisel används främst inom digital hårdvarudesign och verifiering. Det finner tillämpningar inom områden som:

Jämförelse med Andra Språk

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:

Tips för Källkod-till-Källkod Översättning

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.

Befintliga Källkod-till-Källkod Verktyg

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.