Programmeringssprog Chisel

Chisel Sprog

Oversigt over Chisel

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.

Historiske Aspekter

Oprettelse og Tidlig Udvikling

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.

Evolution og Nuværende Tilstand

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.

Forhold til Andre Sprog og Platforme

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.

Syntaksfunktioner

Indlejret DSL

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

Typer og Bitbredder

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

Abstraktion af Hardwarekomponenter

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

Parametriserede Moduler

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
}

Betingede Udsagn

Chisel understøtter betingede udsagn for at lette kompleks hardwarelogik:

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

Hardwaregeneratorer

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
}

Samlingsværktøjer

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

Sekventiel logik udtrykkes let ved hjælp af Chisels dedikerede konstruktioner, som registre:

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

Indbygget Testframework

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

Kædning af Metoder

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

Udviklerens Værktøjer og Kørselstider

IDE'er og Kompilator

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.

Oprettelse af et Projekt

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.

Anvendelser

Chisel bruges primært i digital hardwaredesign og verifikation. Det finder anvendelse inden for områder som:

Sammenligning med Andre Sprog

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:

Tips til Kilde-til-Kilde Oversættelse

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.

Eksisterende Kilde-til-Kilde Værktøjer

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.