Langage de programmation Chisel

Langage Chisel

Aperçu de Chisel

Chisel (Constructing Hardware In a Scala Embedded Language) est un langage de construction de matériel qui facilite la conception et la vérification du matériel. Il est construit sur le langage de programmation Scala, tirant parti de son expressivité et de ses capacités de programmation fonctionnelle pour permettre aux concepteurs de créer facilement des conceptions matérielles sophistiquées et des bancs d'essai. Chisel est principalement utilisé dans le développement de circuits numériques, en particulier dans le domaine de la conception FPGA et ASIC.

Aspects Historiques

Création et Développement Précoce

Chisel a été développé comme un projet de recherche à l'Université de Californie, Berkeley, sous l'égide du groupe de recherche en architecture de Berkeley. La motivation derrière sa création était de fournir un moyen plus productif et efficace de concevoir du matériel par rapport aux langages de description de matériel traditionnels (HDL) comme Verilog ou VHDL. En intégrant la conception matérielle dans un langage de programmation de haut niveau, Chisel visait à offrir une meilleure abstraction, des constructions de niveau supérieur et une réutilisation du code.

Évolution et État Actuel

Depuis sa création, Chisel a gagné en popularité dans les milieux académiques et industriels. Le langage a évolué grâce aux contributions de nombreux développeurs, entraînant des améliorations de ses fonctionnalités, bibliothèques et convivialité. Son intégration avec Scala a permis aux concepteurs de tirer parti de fonctionnalités puissantes telles que la programmation fonctionnelle, la sécurité des types et des bibliothèques de collections avancées. Chisel est désormais largement utilisé dans des projets modernes de développement matériel, allant de la recherche académique à des produits commerciaux.

Relation avec d'Autres Langages et Plateformes

Chisel s'inspire des HDL tels que Verilog et VHDL, empruntant leurs concepts fondamentaux tout en les améliorant avec des paradigmes de programmation issus de Scala. Il est également étroitement lié à d'autres frameworks de construction de matériel comme SpinalHDL, qui se concentrent également sur la productivité et l'expressivité. Les conceptions Chisel peuvent être converties en Verilog, permettant l'utilisation d'outils et de flux de travail de synthèse existants.

Caractéristiques de la Syntaxe

DSL Intégré

Chisel fournit un langage spécifique au domaine (DSL) intégré dans Scala, permettant aux concepteurs matériels d'utiliser la syntaxe de Scala pour la description matérielle. Par exemple, définir un simple multiplexeur à 2 entrées peut être exprimé comme suit :

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

Types et Largeurs de Bits

Chisel prend en charge une variété de types et permet aux concepteurs de spécifier explicitement les largeurs de bits, offrant un meilleur contrôle sur l'utilisation des ressources matérielles. Par exemple :

val myWire = Wire(UInt(8.W)) // entier non signé de 8 bits

Abstraction des Composants Matériels

Le langage offre des abstractions pour les composants matériels courants. Par exemple, pour créer un simple registre :

val reg = RegInit(0.U(8.W)) // registre de 8 bits initialisé à 0

Modules Paramétrés

Chisel permet la création de modules paramétrés, permettant des conceptions réutilisables avec différentes configurations :

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
}

Expressions Conditionnelles

Chisel prend en charge les expressions conditionnelles pour faciliter la logique matérielle complexe :

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

Générateurs de Matériel

Construisez des composants matériels modulaires en utilisant des fonctions d'ordre supérieur pour générer des configurations matérielles :

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
}

Utilitaires de Collection

Chisel permet l'utilisation des utilitaires de collection de Scala pour manipuler efficacement les éléments matériels :

val wires = VecInit(Seq.fill(4)(Wire(UInt(8.W)))) // Créer un vecteur de 4 fils

Logique Séquentielle

La logique séquentielle est facilement exprimée à l'aide des constructions dédiées de Chisel, comme les registres :

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

Cadre de Test Intégré

Chisel s'intègre avec ScalaTest, permettant aux développeurs d'écrire des tests pour leurs conceptions matérielles de manière naturelle :

class MyModuleTester extends PeekPokeTester(new MyModule) {
    poke(dut.a, 1)
    poke(dut.b, 0)
    expect(dut.out, 1)
}

Chaînage de Méthodes

Chisel prend en charge le chaînage de méthodes, permettant des définitions concises et lisibles de circuits matériels complexes :

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

Outils et Environnements de Développement

IDE et Compilateur

Chisel peut être développé en utilisant n'importe quel IDE qui prend en charge Scala, comme IntelliJ IDEA avec le plugin Scala. De plus, sbt (Scala Build Tool) est couramment utilisé pour gérer les projets et les dépendances, ainsi que pour compiler les projets Chisel en code Verilog.

Création d'un Projet

Pour créer un projet Chisel, vous pouvez configurer une structure de projet sbt standard. Un simple fichier build.sbt pourrait ressembler à ceci :

name := "MyChiselProject"
version := "0.1"
scalaVersion := "2.12.10"

libraryDependencies += "edu.berkeley.cs" %% "chisel3" % "3.4.4"

Pour construire, vous exécuteriez sbt run depuis la ligne de commande et les fichiers Verilog de sortie seront générés dans le répertoire cible.

Applications

Chisel est principalement utilisé dans la conception et la vérification de matériel numérique. Il trouve des applications dans des domaines tels que :

Comparaison avec d'Autres Langages

Chisel se distingue des HDL traditionnels comme Verilog et VHDL en offrant des fonctionnalités que l'on trouve dans les langages de programmation de haut niveau, tels que la programmation fonctionnelle, la sécurité des types et des abstractions de niveau supérieur.

Comparé à d'autres langages :

Conseils pour la Traduction Source-à-Source

Pour traduire Chisel vers d'autres langages de description de matériel, des outils comme le compilateur Chisel peuvent générer du Verilog directement à partir du code source Chisel. Il n'existe pas d'outils de traduction source-à-source largement connus qui convertissent Chisel directement en un autre HDL, mais le Verilog généré peut être adapté manuellement si nécessaire.

Outils de Traduction Source-à-Source Existants

Actuellement, l'outil le plus reconnu est la chaîne d'outils Chisel elle-même, qui permet aux utilisateurs de compiler des conceptions Chisel en code Verilog synthétisable. Il existe également des efforts pour intégrer Chisel avec d'autres frameworks matériels à travers diverses bibliothèques et outils, favorisant la collaboration et l'interopérabilité entre différentes méthodologies de conception matérielle.