600 likes | 692 Views
La conception de circuit synchrones en Esterel v7. Gérard Berry Chaire Algorithmes, machines et langages. Collège de France Cours 5, 14 mai 2013. Architecture. Micro-architecture. Design logique RTL. Circuits. DFT (testabilité). Placement Routage. $ 1,000,000. Masks. Chips.
E N D
La conception de circuit synchronesen Esterel v7 Gérard Berry Chaire Algorithmes, machines et langages Collège de France Cours 5, 14 mai 2013
Architecture Micro-architecture Design logique RTL Circuits DFT (testabilité) PlacementRoutage $ 1,000,000 Masks Chips Vérification Design Synthèse Vérification Fab Vérification G. Berry, Collège de France
Architecture $$ Micro-architecture $$ Design logique RTL Circuits $$ DFT (testabilité) $$ PlacementRoutage $ 1,000,000 Masks $$ Chips G. Berry, Collège de France
Architecture Micro-architecture Circuits DFT (testabilité) PlacementRoutage $ 1,000,000 Masks Chips ESTEREL V7 Design logique RTL G. Berry, Collège de France
Objectifs • Définir un langage de naut niveau • pour écrire des circuits de façon comportementale(?) • en traitant chemins de données + chemins de contrôle • Ecrire des compilateurs / simulateurs efficaces • pour que les architectes fassent tourner les designs • très tôt dans le cycle de développement • avec des outils perfectionnés de visualisation et débogage • pour générer des circuits aussi bon qu’à la main • en garantissant une parfaite identité exécution / simulation • Se connecter aux meilleurs moteurs de vérification • Pour vérifier le maximum de propriétés avant l’exécution • Et donc trouver les bugs très tôt dans le développement G. Berry, Collège de France
Esterel v7 : la genèse • 1990 : Esterel v5 circuits (cf cours 4, 23/04/2013) • ~1995 : Joe Buck de Synopsysintègre Esterel v5 dans Cocentric System Studio, pour le design haut niveau de systèmes électroniques • ~1996 : Luciano Lavagno et Ellen Sentovich de Cadence intègrent Esterel dans Polis, HW/SW Codesign, puis développent ECL = Esterel C Language • ~1998 : Michael Kisninevsky (Intel Strategic CAD Lab, Portland, Oregon) expérimente Esterel pour le design de circuits de contrôle • ~1998 : Yves Leduc / Gaël Clavé expérimentent Esterel v5 chez Texas Instruments • ~2000 : design préliminaire d’Esterel v7 avec M. Kishinevsky G. Berry, Collège de France
Esterel v7 : le démarrage • 2000-2001 : Création d’Esterel Technologies • Objectif : développer Esterel v7 / Esterel Studio pour les applications logicielles et matérielles • Clients Dassault Aviation, Thomson, Texas Instruments, etc. • Intel Capital + Caisse des dépôts + VCs • 2001-2004 : développement du langage, du compilateur et du vérifieur, intégrés dans Esterel Studio; expérimentations clients (TI, ST Micro, Xilinx, Philips NXP, Intel) • 2003: Esterel Technologies rachète SCADE et décide la partition Esterel circuits / SCADE logiciels embarqués • 2004-2009 : améliorations techniques, utilisation sur produits complexes en production • 2007 : travail de standardisation IEEE G. Berry, Collège de France
Esterel v7 : la maturité • 2007 : filiale séparée Esterel EDA Technologies Coopération avec Synfora (Pico),Coware(SystemC) • 2008 : développement de SCADE 6 chez E. T. • 2008 : crise financière, TI licencie massivement • 2009 : Esterel EDA ferme Esterel v7 Synfora ? • 2011 : Synopsysrachète Synfora • 2009 : Esterel v7 Synopsys • 2012 : Ansys rachète Esterel Technologies • 2009 : SCADE 6 en pleine forme ! G. Berry, Collège de France
Esterel v7 : les nouveautés linguistiques • Définitions de données • en v5, données purement abstraites (APIs) • en v7, données paramétriques, précises et optimisées • pour la synthèse et la vérification, tableaux, bitvecteurs • Enrichissement des signaux • mémorisés ou temporaires, avec ou sans valeurs initiales • immédiats ou retardés (registres) • tableaux de signaux et signaux à valeurs tableaux • Meilleure modularité • définitions d’ensembles de données • définitions d’interfaces (avec miroirs) et de modules • généricité (dimensions, fonctions, etc.) G. Berry, Collège de France
Esterel v7 : les nouveautés linguistiques • Nouvelles instructions • équations simplifiant et standardisant le codage • boucles statiques de manipulation de tableaux • meilleur branchements des signaux meilleurs modules • Manipulation d’horloges • masquage de cycles (clock gating) • vrai multi-horloge modulaire La sémantique d’Esterel v5 est globalement préservée et facilement étendue au clock-gating / multi-horloge G. Berry, Collège de France
Design Specification Capture Design FunctionalSpec Architecture Verification Requirements Editor Project Structure Debugging & Simulation Editor ArchitectureDiagram DesignVerification ProjectManagement Simulator IDE DesignVerifier Formal Verification ModelReporter Automatic Documentation IDE SequentialEquivalenceChecker Player DUT Sequential Equivalence check Executable Specification Exporter Code & TestbenchGenerators Optimized for synthesis DFT-ready SystemC & RTL flow integration .sc RTL Synthesis SystemC .vhd G. Berry, Collège de France
Entiers unsigned (2-adiques bien tronqués) • unsigned<N> : entiers positifs i tels que 0 i N1(Nélts.) • unsigned<[N]> unsigned<2**N> (2Nélts, N bits binaire) • Pourquoi cette précision ? • pour optimiser l’allocation des bus de données • 4 : unsigned<5> demande 3 fils • 5 : unsigned<6> demande 3 fils • mais 4*5 : unsigned<21> demande 5 fils,pas 6 ! • pour vérifier statiquement l’indexation des tableaux Regarder toutes les opérations dans le blanc des yeux, avec parfois de mauvaises surprises ! G. Berry, Collège de France
Opérations unsigned : unsigned<M>, unsigned<N> unsigned<MN1> car valeur max (M1)(N1) (MN1)1 : unsigned<M>, unsigned<N> unsigned<M> avec erreur si ji car valeur max (M1)0 M1(erreur pour i j si ij) *: unsigned<M>, unsigned<N> unsigned<(M1)(N1)1> car valeur max (M 1)(N 1) /: unsigned<M>, unsigned<N> unsigned<M> car valeur max (M1)/1(erreur si second argument nul) mod: unsigned<M>, unsigned<N> unsigned<min(M,N1)> car valeur max M1 si M1 N2etN2sinon (erreur si second argument nul) **: unsigned<M>, unsigned<N> unsigned<(M1)**(N1)1> car valeur max (M1)N1 G. Berry, Collège de France
Opérations unsigned sat<M>(uexpr) avec uexpr : unsigned<M> : saturation à M1 soit v la valeur de uexpr. Alors sat<M>(uexpr) min(v,M1) <,<=,> ,>=,=,<>: unsigned<M>, unsigned<N> bool, classiques binsize(uexpr) : nombre de bits pour écrire uexpr en binaire si la valeur de uexpr est v, le n tel que 2n-1 v 2n assert<M>(uexpr) : avec uexpr unsigned, déclare que la valeur v de uexpr vérifiera vM1 vérifié à la compilation, à la simulation ou formellement G. Berry, Collège de France
Entiers relatifs • signed<N> : entiers i tels que N i N1(2N éléments) • signed<[N]> signed<2**(N1)> (2Néléments, N bits en binaire) : signed<M> signed<M> (unaire) identité • : signed<M> signed<M1> car valeur max (M) abs: signed<M> unsigned<M1> car valeur max abs(M) M G. Berry, Collège de France
Opérations signed : signed<M>, signed<N> signed<MN> car valeur min MN • : signed<M>, signed<N> signed<MN > car valeur max M1(N) (MN)1 *: signed<M>, signed<N> signed<MN1 > car valeur max (M)(N) /: signed<M>, signed<N> signed<M1> car valeur max M / 1 si (erreur si second argument nul) **: non introduit mod: pas clair ! Pas de meilleure définition mathématique, on trouve toutes les définitions possibles selon les restes et signes ... G. Berry, Collège de France
Opérations signed sat<M>(sexpr) avec sexpr : signed<M> : saturation dans le sens du signe soit v la valeur de sexpr. Alors sat<M>(sexpr) v si M vMouMsi vMouM1si vM <,<=,> ,>=,=,<>: signed<M>, signed<N> bool, classiques assert<M>(sexpr) : avec sexpr signed, déclare que la valeur v de sexpr vérifiera M v M vérifié à la compilation, à la simulation ou formellement Conversion automatique de signed en unsigned dans toutes les opérations mixtes : unsigned<M> signed<M> (unaire) car valeur max M1 : unsigned<M> signed<M1> (unaire) car valeur min (M1) G. Berry, Collège de France
Tableaux type Bytebool[8]; // bitvector 0..7 input Opcode : Byte; type Pixel unsigned<256>; // ou unsigned<[8]>, nombre constant Size 100 : unsigned<> ; // implicit unsigned<101> output ImageStack : Pixel[Size,Size][5]; • indexation partielle : X[i,j] : Pixel[5] • extraction de sous-tableaux : X[1,3..7] [2..5] : Pixel[5,4] • dimension évaluable statiquement, assertion de taille implicite Y : X[i,j][k1] assert<Size>[i] & assert<Size>[j] & assert<5>[k1] vérifié à la compilation, à la simulation ou formellement G. Berry, Collège de France
Bitvecteurs vecteurs de bits type Bytebool[8]; // bitvector 0..7 input Opcode : Byte; type Wordbool[32]; // bitvector 0..31 var Memory :Word[MemSize]in ... end • constantes ’b010011 • égalité, différence <> • B << k : shift gauche non signé • B >> k : shift droit non signé • B <<< k: shift gauche signé • B >>> k : shift droit signé • concaténation : lcat(B0,B1,..., Bn) et mcat(B0,B1,...,Bn) • extension à k bits : extend(B,k) etsextend(B,k) • resize, reverse, etc. G. Berry, Collège de France
Cartes (maps) de bitvecteurs Objectif : donner des synonymes intuitifs aux champs mapWord { // map non nommée LowByte[0..7] , LowHalf[0..15] , HighHalf[16..31] }; nom utile au débogage // définition séquentielle mapInstruction : Wordseq { Opcode[8] , Immediate, // bool Register[7] , Address[16] }; mapInstruction : Word { Opcode[0..7] , Immediate[8] , // bool RegisterNum[9..15] , Address[16..31] }; G. Berry, Collège de France
Conversion unsigned bitvecteur expr : unsigned<M> u2bin(expr) : bool[binsize(M1)] // écriture binaire minimale u2bin(expr,N) : bool[N] // avec N binsize(M1) u2gray(expr) : bool[binsize(M1)] // écriture en code Gray u2gray(expr,N) : bool[N] // avec N binsize(M1) u2onehot(expr) : bool[M] // écriture un seul bit à 1 u2onehot(expr, N) : bool[N] // avec N M bin2u(6) ’b110 u2gray(6) ’b101 u2onehot(6) ’b0000001 // 7 bits car 6 : unsigned<7> u2onehot(6, 10) ’b0000001000 // 10 bits, bit 6 à 1 u2code : possibilité pour l’utilisateur de définir son propre code G. Berry, Collège de France
Conversion bitvecteur unsigned expr : bool[M] bin2u(expr) : unsigned<[M]>// décodage binaire bin2u(expr,N) : unsigned<N>// avec N 2M gray2u(expr) : unsigned<[M]> // décodage Gray gray2u(expr,N) : unsigned<N> // avec N 2M onehot2u(expr) : unsigned<M>// décodage onehot onehot2u(expr, N) : unsigned<N> // avec N M G. Berry, Collège de France
Conversions signed bitvecteur expr : signed<M> s2bin(expr) : bool[binsize(M1)1] // écriture binaire minimale s2bin(expr,N) : bool[N] // avec N binsize(M1)1 s2bin(6) ’b0101 s2bin(6) ’b1011 expr : bool[M] bin2s(expr) : signed<[M]> bin2s(expr,N) : signed<N> // avec N 2M-1 G. Berry, Collège de France
Signaux purs et valués S : <statut, valeur>uniques dans l’instant (idem Esterel v5) Nouveau : reg (de Moore), temp (non mémorisé), initialisation signal S1, // signal pur : statut mais pas de valeur S2 : T, // signal valué : statut, valeur de type T mémorisée, S3 : // un émetteur au maximum à chaque instant S3 : T combine F, // statut, valeur de type T mémorisée // émissions simultanées combinées par F S4 : T initexp, // statut, valeur de type T mémorisée, S3 : // initialisée à la valeur de exp S5 : T combine F initexp, G. Berry, Collège de France
Valeurs simples, signaux temporaires S6 :value T, // pas de statut, valeur mémorisée, S3 : // un émetteur maximum à chaque instant S7 : value T combine F, // pas de statut, valeur mémorisée // émetteurs multiples combinés par F S8 :tempT, // statut, valeur non mémorisée, S3 : // un émetteur max. S9 : temp value T combine F initexp, // pas de statut, valeur combinée non mémorisée, // réinitialisation à chaque instant à la valeur de exp G. Berry, Collège de France
Signaux retardés R10 : reg,// statut retardé R11 :regT,// statut retardé, valeur de type T R12 : reg value T combine Finitexp, ... ?R10 :valeur émise à l’instant précédent pre (?R10) non autorisé G. Berry, Collège de France
Nouvelle instruction emit emit { S1, ?S2 <= 2, ?S3 <= 3 if X>0, next R10 if S4 and ?S4 > 0, next ?R11 <= pre(?S4)+?S5+2 if S6 } sustain { StartStopCommand<= LR, LapCommand<= UR } every LR do emit StartStopCommand || every UR do emit LapCommand G. Berry, Collège de France
Boucles sur tableaux O[1] O[0] O[2] I[1] I[2] I[0] emit { O[0] <= I[0], for i < M 1do O[i+1] <= O[i] or I[i+1] end for } OK pour la génération de circuits G. Berry, Collège de France
Boucles sur tableaux O[1] O[0] O[2] I[1] I[2] I[0] emitseq { O[0] <= I[0], for i < M -1 doup O[i+1] <= O[i] or I[i+1] end } Mieux pour la simulation logicielle Alternative: tableaux fonctionnels de SCADE 6 G. Berry, Collège de France
Exemple : un mini-filtre d’images TV Etant donné un flot de pixels d’entrée xi, calculer un flot de pixels de sortie yi tels que yi(xi-24xi-16xi4xi+1xi+2)/16 • les pixels sont contenus dans des mots 32 bits • il faut laisser passer 2 pixels au démarrage • et les récupérer à la fin en complétant avec des 0 G. Berry, Collège de France
InWordFeederInPixelBasicFilterOutPixel Feeder BasicFilter InPixel : temp unsigned<[8]> InEndOfLine *1 *4 *6 *4 *1 p3 p2 p1 p0 + / 16 OutPixel : unsigned<[8]> InWord : bool[32] OutEndOfLine G. Berry, Collège de France
InWordFeederInPixelBasicFilterOutPixel Feeder BasicFilter InPixel : temp unsigned<[8]> 0 0 0 0 0 InEndOfLine *1 *4 *6 *4 *1 p3 p2 p1 p0 + / 16 OutPixel : unsigned<[8]> InWord : bool[32] OutEndOfLine Initialisation à 0 G. Berry, Collège de France
InWordFeederInPixelBasicFilterOutPixel Feeder BasicFilter InPixel : temp unsigned<[8]> 0 0 0 0 InEndOfLine *1 *4 *6 *4 *1 p3 p2 p1 p0 + / 16 OutPixel : unsigned<[8]> InWord : bool[32] OutEndOfLine Entrée d’un mot, délai initial 2 cycles G. Berry, Collège de France
InWordFeederInPixelBasicFilterOutPixel Feeder BasicFilter InPixel : temp unsigned<[8]> 0 0 0 InEndOfLine *1 *4 *6 *4 *1 p3 p2 p1 p0 + / 16 OutPixel : unsigned<[8]> InWord : bool[32] OutEndOfLine Délai initial 2 cycles G. Berry, Collège de France
InWordFeederInPixelBasicFilterOutPixel Feeder BasicFilter InPixel : temp unsigned<[8]> 0 0 InEndOfLine *1 *4 *6 *4 *1 p3 p2 p1 p0 + / 16 OutPixel : unsigned<[8]> InWord : bool[32] OutEndOfLine Sortie du premier OutPixel G. Berry, Collège de France
InWordFeederInPixelBasicFilterOutPixel Feeder BasicFilter InPixel : temp unsigned<[8]> 0 InEndOfLine *1 *4 *6 *4 *1 p3 p2 p1 p0 + / 16 OutPixel : unsigned<[8]> InWord : bool[32] OutEndOfLine Sortie d’un OutPixel G. Berry, Collège de France
InWordFeederInPixelBasicFilterOutPixel Feeder BasicFilter InPixel : temp unsigned<[8]> InEndOfLine *1 *4 *6 *4 *1 p3 p2 p1 p0 + / 16 OutPixel : unsigned<[8]> InWord : bool[32] OutEndOfLine Entrée d’un mot, sortie d’un OutPixel G. Berry, Collège de France
InWordFeederInPixelBasicFilterOutPixel Feeder BasicFilter InPixel : temp unsigned<[8]> InEndOfLine *1 *4 *6 *4 *1 p3 p2 p1 p0 + / 16 OutPixel : unsigned<[8]> InWord : bool[32] OutEndOfLine Sortie d’un OutPixel G. Berry, Collège de France
InWordFeederInPixelBasicFilterOutPixel Feeder BasicFilter InPixel : temp unsigned<[8]> InEndOfLine *1 *4 *6 *4 *1 p3 p2 p1 p0 + / 16 OutPixel : unsigned<[8]> InWord : bool[32] OutEndOfLine Sortie d’un OutPixel G. Berry, Collège de France
InWordFeederInPixelBasicFilterOutPixel Feeder BasicFilter InPixel : temp unsigned<[8]> InEndOfLine *1 *4 *6 *4 *1 p3 p2 p1 p0 + / 16 OutPixel : unsigned<[8]> InWord : bool[32] OutEndOfLine Fin de ligne d’entrée, sortie d’un OutPixel G. Berry, Collège de France
InWordFeederInPixelBasicFilterOutPixel Feeder BasicFilter InPixel : temp unsigned<[8]> 0 InEndOfLine *1 *4 *6 *4 *1 p3 p2 p1 p0 + / 16 OutPixel : unsigned<[8]> InWord : bool[32] OutEndOfLine Entrée de 0, sortie d’un OutPixel G. Berry, Collège de France
InWordFeederInPixelBasicFilterOutPixel Feeder BasicFilter InPixel : temp unsigned<[8]> 0 0 InEndOfLine *1 *4 *6 *4 *1 p3 p2 p1 p0 + / 16 OutPixel : unsigned<[8]> InWord : bool[32] OutEndOfLine Entrée de 0, sortie OutPixel, fin de ligne de sortie G. Berry, Collège de France
Groupes de données data PixelData: constant PIXEL_WIDTH : unsigned<>= 8 ; // unsigned<9> type Pixel = unsigned <[PIXEL_WIDTH]> ; // un nombre! end data data ImageData: constant LINE_LENGTH : unsigned<>= 8 ; constant NUMBER_OF_LINES : unsigned <> = 2 ; end data G. Berry, Collège de France
data WordData: constant WORD_WIDTH : unsigned<> = 32 ; type Word = bool [WORD_WIDTH] ; // un mot se décompose en 4 octets map Word { b0[0..7], // bitvecteurs, pas nombres b1[8..15], b2[16..23], b3[24..31] }; end data G. Berry, Collège de France
data InputLineData: extendsImageData; extendsWordData; extendsPixelData; constant PIXELS_PER_WORD : unsigned<> = WORD_WIDTH / PIXEL_WIDTH ; constant WORDS_PER_LINE : unsigned<> = LINE_LENGTH / PIXELS_PER_WORD; end data G. Berry, Collège de France
data FilterData: constant Coef: unsigned<> [5]= {1, 4, 6, 4, 1} ; // unsigned <7> constant CoefSum: unsigned<> = 16 ; constant INIT_DELAY : unsigned<> = 3 ; end data G. Berry, Collège de France
interface WordIntf: extendsWordData; output Ready; input InWord: Word ; end interface interface InPixelIntf: extendsPixelData; input InPixel: tempPixel ; input InEndOfLine; end interface interface OutPixelIntf: extendsPixelData; output OutPixel: tempPixel ; output OutEndOfLine; end interface G. Berry, Collège de France
//========== // Main module //========== module Filter: extendsWordIntf; extendsOutPixelIntf; signal extendsInPixelIntfin // déclare tous les signaux de // InPixelIntf comme locaux runFeeder || runPixelFilter end signal end module G. Berry, Collège de France
module Feeder: // Interface declarations extendsInputLineData; extendsFilterData; extendsWordIntf; extendsmirrorInPixelIntf; G. Berry, Collège de France
signal EndOfWord WORDS_PER_LINE EndOfWord InWord/ InPixel(?InWord.p0) … / Ready /InPixel(?InWord.p3) / EndOfWord InPixel(?InWord.p2) / InPixel(0) 2 InPixel/ InEndOfLine G. Berry, Collège de France