Verilog PDF

Télécharger au format pdf ou txt
Télécharger au format pdf ou txt
Vous êtes sur la page 1sur 26

page 1

INITIATION VERILOG

page 1

INITIATION AU LANGAGE VERILOG

Jean Louis Noullet - 1995-2005 - 5me dition rev.5

1. Introduction- - - - - - - - - - - - - - - - - - - - - -2
1.1 Objectifs 1.2 Les supports de donnes en Verilog 2 3

2. Des exemples, pour commencer - - - - - - - - - - - -3


2.1 Simulation dun latch RS 2.2 Un exemple de conception descendante ("TOP-DOWN") 2.3 Simulation dun circuit synchrone 3 6 8

3. Dclarations - - - - - - - - - - - - - - - - - - - - 10 4. Expressions et Constantes - - - - - - - - - - - - - - 11


4.1 oprations logiques verticales ou bitwise 4.2 oprations logiques horizontales ou unary 4.3 oprations arithmtiques et dcalage 4.4 opration boolennes 4.5 oprations relationnelles 4.6 vecteurs 4.7 constantes numriques 4.8 extension - troncature 11 11 11 12 12 12 12 13

5. Communication reg <--> net - - - - - - - - - - - - - 13 6. Etats et Forces - - - - - - - - - - - - - - - - - - - 14 7. Blocs Procduraux - - - - - - - - - - - - - - - - - 15


7.1 Rgles 7.2 Temporisation procdurale 15 16

8. Constructions Procdurales - - - - - - - - - - - - - 17
8.1 Itrations ou boucles (for, while, repeat, forever) 8.2 Dcisions (if, expr. conditionnelle, case) 17 18

9. Encore quelques exemples - - - - - - - - - - - - - - 19


9.1 bascule D avec clear asynchrone 9.2 Buffer tri-state 9.3 Cellule paramtre 19 20 20

10. Introduction la Synthse Logique - - - - - - - - - 21


10.1 Modules combinatoires 10.2 Modules squentiels synchrones 10.3 Machine tats finis 10.4 Registre avec clear asynchrone 21 23 24 25

11. Ce qui resterait voir - - - - - - - - - - - - - - - 26


J.L.N.2005

page 2

INITIATION VERILOG

page 2

INITIATION AU LANGAGE VERILOG

1. Un langage de description de matriel


1.1 Objectifs
Les langages de description de matriel (HDL = Hardware Description Langage) font partie des outils de base pour la conception de systmes logiques intgrs cbls, que le produit nal soit construit sur des composants lectriquement congurables (FPGA = Field Programmable Logic Array) ou des circuits intgrs spciques (ASIC = Application Specic Integrated Circuit). Ces langages doivent tre utilisables pour : crire la spcication dun systme (description comportementale ou fonctionnelle) le construire par interconnexion de cellules lmentaires (description structurelle ou physique) grer des description hirarchises (dont la description structurelle est un cas particulier) valider par simulation les diffrents types de description permettre lutilisation de programmes de synthse automatique De plus les descriptions comportementales doivent se faire dans deux modes : mode concurrent : les donnes se propagent dans des lements dont le comportement est dcrit par des dclarations qui ont un effet permanent (comme dans les descriptions structurelles) mode procdural : les donnes sont manipules par des squences dinstructions (comme dans les programmes dordinateurs) Dans le mode concurrent les donnes sont actives, on parle de data ow, alors que dans le mode procdural cest le programme qui contrle les venements, on parle alors de program ow. Il existe deux standards de langages de description de matriel : VHDL Verilog Leurs syntaxes sont assez diffrentes mais mettent en oeuvre les mmes concepts.

J.L.N.2005

page 3

INITIATION VERILOG

page 3

1.2 Les supports de donnes en Verilog


Le langage Verilog utilise deux classes de supports de donnes distinctes pour les modes concurrents et procedural. classe net dans le mode concurrent : un net est quivalent un noeud dun circuit lectrique, son tat est contrl en permanence par les lments aux sorties desquels il est connect. classe reg dans le mode procdural : un reg est quivalent une variable dun programme informatique : il subit des affectations instantanes par instructions et conserve son tat jusqu la prochaine affectation. Le bon usage des nets et regs est la seule relle difcult de Verilog. On y a consacr le chapitre 5.

2. Des exemples, pour commencer


2.1 Simulation dun latch RS
bibliothque

stimuli

circuit

interpretation

environnement de simulation

Dans cette exemple, on utilisera le langage Verilog pour dcrire un petit circuit, la bibliothque de cellules standard qui sert le construire, et lenvironnement de simulation qui sert le valider.

2.1.1 Description structurelle de la bascule rs_latch :


module rs_latch( R, S, Y ); output Y; wire YB; input R, S; LibNo2 I1 ( Y, R, YB ); LibNo2 I2 ( YB, Y, S ); endmodule R a b a S b
J.L.N.2005

(YB)

page 4

INITIATION VERILOG

page 4

Un module ou cellule est un noeud de la hirarchie structurelle. Sa description commence par la dclaration des ports qui servent le connecter au monde extrieur (les ports sont de la classe "net"). Suivent des instances ou "appels" de modules situs en dessous dans la hirarchie. A chaque instance est associ un nom dinstance unique (ici I1 et I2). Ici, la cellule LibNo2 est suppose faire partie d'une bibliothque de cellules standard. Dans ce module, un net interne YB est dclar en tant que wire (classe "net"). Les identieurs crs dans le module (R, S, Y, YB, I1, I2) sont locaux. La connexion des nets de rs_latch aux ports de chaque instance de LibNo2 est rgie par l'ordre des lments dans la liste. Le langage permet une variante : la connexion par noms, plus explicite mais plus lourde : module rs_latch( R, S, Y ); output Y; input R, S; wire YB; LibNo2 I1 ( .a(R), .b(YB), .s(Y) ); LibNo2 I2 ( .s(YB), .a(Y), .b(S) ); endmodule

2.1.2 Description comportementale des cellules standard


Pour simuler notre rs_latch, nous avons besoin d'une description comportementale de LibNo2 : `timescale 1ns/10ps module LibNo2 ( s, a, b ); // porte NOR output s; input a, b; assign #(2.5, 2.0) s = ~(a|b); endmodule La directive de compilation `timescale sert indiquer qu'on veut donner les temps en ns avec une rsolution de 10 ps. L'instruction assign tablit une connexion permanente ("data-ow") entre l'expression ~(a|b) et le net s, avec un dlai de 2.5 ns la monte et 2 ns la descente. (La syntaxe des expressions est dtaille dans le chapitre 4.)

2.1.3 Environnement de simulation


L'environnement de simulation de notre circuit devra assurer la gnration des stimuli et l'afchage des rsultats, ce qu'on fera de manire procdurale. Ces lments doivent tre hbergs dans un module dit module de test qui constituera la racine de la hirarchie. Ce module na ni entre ni sortie. Pour que les signaux injects dans le circuit (stimuli) puissent tre contrls de manire procdurale, le module de test doit contenir des regs connects aux entres du circuit.

J.L.N.2005

page 5

INITIATION VERILOG

page 5

Par contre les sorties du circuit doivent tre connectes des nets (dclars comme wire). module test; reg r, s; wire y; rs_latch lat( r, s, y ); // instance de notre circuit initial begin $display("simulation RS"); $monitor("t = %4g ns : rs = %b%b --> %b (%b)", $realtime, r, s, y, lat.YB ); r = 0; s = 0; #5 r = 1; #5 r = 0; #5 s = 1; #5 s = 0; #5 s = 1; r = 1; #5 $display("t=%g ns : travail fini", $realtime ); end endmodule Aprs ces dclarations de signaux, le module test contient une instance du circuit rs_latch luimme, et enn un bloc procdural (initial begin ......... end). Dans ce bloc procdural, il y a une squence d'instructions d'affectation dont certaines sont prcdes d'une condition de temporisation #5 exprimant une attente de 5 ns. Les identieurs commenant par $ dsignent des fonctions ou tches prdnies dans le simulateur Verilog-XL. $display afche du texte l'instant o il est excut, alors que $monitor dclenche un processus automatique qui va ritrer l'afchage chaque fois qu'un des signaux concerns change d'tat. L'expression lat.YB permet de dsigner un signal situ "en dessous" dans la hirarchie en indiquant un chemin constitu de noms dinstances. Dans cet exemple trs simple, on a rencontr les 3 niveaux de description : - structurelle (rs_latch) - comportementale "data-ow" (LibNo2) - procdurale (test) Le langage permet de mlanger librement les 3 niveaux. N.B. : Toute description doit tre hberge par un module Toute description procdurale doit tre hberge par un bloc procdural "initial" ou "always" (chapitre 7.).
J.L.N.2005

page 6

INITIATION VERILOG

page 6

2.2 Un exemple de conception descendante ("TOP-DOWN")


Un registre dcalage chargement parallle de 4 bits ("PISO", pour "Parallel-In, Serial-Out"). ser_out PISO par_in

load

clk

Le signal load commande le chargement dun mot par_in (ici de 4 bits) que le registre devra restituer bit par bit sur la sortie ser_out, en commenant par le bit de faible poids, avec un fonctionnement strictement synchrone (horloge clk). Considrons une conception manuelle, partant d'une spcication consistant en une description comportementale globale (2.2.1), et aboutissant une structure base sur des cellules standard disponibles (2.2.3), avec une tape intermdiaire de dcoupage en tages (2.2.2).

2.2.1 Modle global du registre en Verilog :


// description comportementale du registre piso module piso4( clk, load, par_in, ser_out ); input clk, load; input [3:0] par_in; output ser_out; reg [3:0] contenu; always @ (posedge clk) begin if ( load ) contenu = par_in; // chargement else contenu = contenu >> 1; // decalage end assign #3 ser_out = contenu[0]; endmodule L'entre parallle par_in de ce registre est un groupe de 4 connexions reprsentes par un seul nom. Cette manire de dsigner les signaux comme des tableaux indics est souvent appele "bus", ou mieux : "vecteur". La dclaration comprend les valeurs extrmes de l'indice entre crochets. Le premier indice correspondant au bit de fort poids, il est vivement conseill de toujours mettre le plus fort indice en premire position. Quelques exemples d'utilisation : contenu[0] est le "lsb" (less signicant bit = bit de plus faible poids) de contenu, contenu[2] est son bit de poids 4, J.L.N.2005

page 7

INITIATION VERILOG

page 7

par_in[2:0] est un bus de 3 bits contenant les 3 lsb de par_in, par_in[3:0] est synonyme de par_in. Le coeur du modle est un bloc procdural always, dont la condition de dclenchement est le front montant de l'horloge clk. (cf chapitre 7.) La mmoire interne du registre est modlise par le reg contenu. La sortie srie ser_out est connecte de faon permanente au bit de faible poids de contenu par une directive assign.

2.2.2 Modle dcoup en tages :


ser_out

q3

q2

q1

par_in[3]

par_in[2]

par_in[1]

par_in[0]

// description structurelle du registre piso module piso4( clk, ld, par_in, ser_out ); input clk, load; input [3:0] par_in; output ser_out; wire q1, q2, q3; etage e3 ( clk, load, par_in[3], 0, q3 ); etage e2 ( clk, load, par_in[2], q3, q2 ); etage e1 ( clk, load, par_in[1], q2, q1 ); etage e0 ( clk, load, par_in[0], q1, ser_out ); endmodule N.B. q3, q2, q1 sont des nets internes de piso4. On a reli 0 (zro) lentre de dcalage de ltage e3 pour obtenir un comportement semblable celui de loprateur >> de la description comportementale. // decription comportementale d'un etage de registre module etage ( clk, select, d1, d0, q); input clk, select, d1, d0; output q; reg rq; d0 always @ (posedge clk) if ( select ) rq = d1; d1 else rq = d0; select clk assign #1 q = rq; endmodule

J.L.N.2005

page 8

INITIATION VERILOG

page 8

2.2.3 Modle niveau cellules standard


// decription structurelle d'un etage de registre module etage ( ck, select, d1, d0, q); input ck, select, d1, d0; output q; wire d; LibDFF bascule ( .q(q), .ck(ck), .d(d) ); LibMux multipl ( .y(d), .i0(d0), .i1(d1), .s(select) ); endmodule Ceci suppose l'existence des cellules standard LibDFF et LibMux, dont les descriptions comportementales pourraient tre : // bascule D sensible au front montant module LibDFF( q, ck, d ); input ck, d; output q; reg resu; always @ ( posedge ck ) resu = d; assign #1 q = resu; endmodule // multiplexeur deux entres module LibMux( i0, i1, s, y ); input i0, i1, s; output y; assign #1 y = ( i0 & ~s ) || ( i1 & s ); endmodule

2.3 Simulation dun circuit synchrone


On va proter du paralllisme offert par le langage pour produire le signal dhorloge priodique avec une boucle spare de la squence de test principale. Dautre part on doit imprativement viter toute collision entre les transitions des entres et les fronts actifs d'horloge. Il est donc commode et recommandable de "caler" toutes les transitions des entres sur les temps multiples de la priode d'horloge, et de dcaler le gnrateur d'horloge d'une fraction de priode. Pour rendre plus lisible les signaux internes et ventuellement les sorties (machine de Mealy), on placera le front actif d'horloge un peu avant les multiples de la priode. Dans cet exemple, l'horloge de priode p est cale de manire ce que son premier front actif arrive l'instant p/4 + p/2 soit 3/4 de priode. Les fronts actifs seront donc en avance de 1/4 de priode par rapport aux transitions des entres. On a utilis l'instruction parameter pour crer un symbole p reprsentant la priode d'horloge.
J.L.N.2005

page 9

INITIATION VERILOG

page 9

Exemple : simulation du registre dcalage chargement parallle : module test; reg [3:0] data_in; // reg vectoriel de 4 bits reg ck, load; wire ser_data; parameter p=5000; // periode horloge piso4 piso ( ck, load, data_in, ser_data ); // instance initial begin //============= sequence principale

load = 1; data_in = 1; #p load = 0; #(p*6) load = 1; data_in = 10; #p load = 0; #(p*6) load = 1; data_in = 'b1101; #p load = 0; #(p*6) $finish; end initial // ============= generation horloge begin ck = 0; #(p/4) forever #(p/2) ck = ~ck; end always @ (posedge ck) // ===== affichage echantillonne $display("ld=", load, " data_in=%b", data_in, " ser_data=", ser_data ); endmodule

J.L.N.2005

page 10

INITIATION VERILOG

page 10

Sortie texte : on a mis dans cet exemple un afchage de rsultats chantillonn, produisant une ligne de texte par priode dhorloge : un bloc always qui appelle la fonction $display chaque front actif d'horloge. Dans le cas dun systme synchrone, ceci facilite l'interprtation des rsultats (contrairement la fonction $monitor qui produit un nombre variable de lignes par priode). De cette manire, on "voit" les sorties du circuit exactement comme un autre module synchrone les "verrait".

3. Dclarations
ATTENTION : le langage distingue les majuscules et minuscules. Les regs et nets doivent tre dclars : l'intrieur des modules, mais l'extrieur des blocs procduraux La dclaration des regs est toujours obligatoire. La dclaration des nets est obligatoire sauf dans un cas : dans une reprsentation structurelle, les nets internes du module qui apparaissent dans les instances sans avoir t dclars explicitement sont considrs comme dclars implicitement (avec le type de net "par dfaut"). Attention Danger : il faut dclarer explicitement les nets vectoriels, car la dclaration implicite leur donne une capacit de 1 bit seulement, sans avertissement. Les ports du module sont des nets, et les dclarations de direction des ports (input, output, inout) valent comme dclarations de nets. Les types de regs sont les suivants : reg "simple" ou "scalaire" de 1 bit reg vecteur (nombre de bits arbitraire) (non-sign) table de regs vectoriels = "RAM" integer (reg de 32 bits, sign) Il y a de nombreux types de nets, qui diffrent principalement par la manire dont sont rsolus les conits et les indterminations. Le type de net le plus appropri pour les circuits CMOS statiques est le wire, qui rsout les conits en fonction des forces des sources en prsence (cf 6) et prend l'tat Z (haute impdance) lorsqu'aucune force ne dtermine son tat. N.B. Le mot net n'est pas un nom de type, mais de "classe de types".

J.L.N.2005

page 11

INITIATION VERILOG

page 11

exemple de dclaration : reg [15:0] a, b; reg c; reg [1:200] bizar; reg [7:0] babar[0:127]; wire [23:0] leBus; a et b sont des regs vectoriels de 16 bits, dont le lsb porte l'indice 0, c est un reg scalaire, bizar est un reg de 200 bits dont le lsb porte l'indice 200, babar est un tableau de 128 mots de 8 bits, pouvant tre utilis comme modle d'une mmoire RAM ou ROM, leBus est un net de 24 bits.

4. Expressions et Constantes
Les rgles de constructions des expressions sont similaires dans les mondes concurrent et procdural. Elles sont fortement compatibles avec le langage C. N.B. En cas de doute sur la priorit des oprateurs, utiliser des parenthses.

4.1 oprations logiques verticales ou bitwise


comme en C : oprateurs ~, &, |, ^ pour respectivement not, and, or, xor exemple : c = a & b; d = ~c | ~( a ^ b ); chaque bit de c sera le "et" du bit de mme poids pris sur a et sur b. L'oprateur ~ est prioritaire sur les autres.

4.2 oprations logiques horizontales ou unary


oprateurs &, |, ^ pour respectivement and, or, xor exemple : reg [7:0] b; reg azero; azero = ~( | b ); azero est 1 si et seulement si tous les 8 bits de b sont nuls.

4.3 oprations arithmtiques et dcalage


comme en C : oprateurs +, -, *, /, %, <<, >> Attention : les oprateurs d'incrmentation et de dcrmentation (++, --) n'existent pas en Verilog.

J.L.N.2005

page 12

INITIATION VERILOG

page 12

4.4 opration boolennes


comme en C : oprateurs !, &&, || pour respectivement not, and, or tant entendu que la valeur zro reprsente "false" et que toute valeur diffrente de zro reprsente "true".

4.5 oprations relationnelles


comme en C : oprateurs ==, !=, <, >, <=, >= pour respectivement gal, diffrent, infrieur, suprieur, inf. ou gal, sup. ou gal. avec en plus : oprateurs ===, !== pour respectivement littralement gal, littralement diffrent. (au sens de == et !=, l'tat X implique un rsultat de comparaison toujours gal X, alors que au sens de === et !==, X est gal lui-mme) N.B. les comparaisons sont non signes, sauf pour le type integer.

4.6 vecteurs
Les oprateurs { et } servent former un vecteur par concatnation de bits ou de vecteurs (msb=most signicant bit en premier). exemple : reg [8:0] resu; reg [2:0] rev_a; reg q0, q1, q2; wire [7:0] sum; wire [2:0] a; resu = { carry, sum[7:0] }; { q2, q1, q0 } = a + b; rev_a = { a[0], a[1], a[2] }; c = sum[ n - 1 ]; resu est un vecteur de 9 bits dont le msb est carry, q2, q1, q0 reoivent sparment les 3 lsb de la somme a + b, rev_a contient les trois lsb de a dans l'ordre inverse, c est le n-ime bit de sum (n tant un entier >= 1 ).

4.7 constantes numriques


Les constantes numriques sont dcimales par dfaut. Les oprateurs 'b, 'h ,'o prxent les constantes binaires, hexadcimales et octales. (ces oprateurs peuvent tre prcds d'un entier indiquant le nombre de digits.) Le caractre "_" ("soulign") peut tre insr librement pour rendre la constante plus lisible. La dclaration parameter permet d'associer un symbole une constante.
J.L.N.2005

page 13

INITIATION VERILOG

page 13

exemples : parameter msb8 = 'b1000_0000; a = a + 'hFC0; b = 'bz; // etat haute impdance

4.8 extension - troncature


- si un lment d'une expression comporte plus de bits que la destination de cette expression, cet lment va tre tronqu "par la gauche", c'est dire que ce sont les bits de faible poids qui vont subsister. - si un lment d'une expression comporte moins de bits que la destination de cette expression, cet lment va tre complt par des zros " gauche" (du cot des forts poids). Attention : ces oprations ne s'accompagnent d'aucun avertissement et peuvent dissimuler des erreurs fatales.

5. Communication reg <--> net


Rgles fondamentales : - l'tat d'un reg n'est modi que par assignement procdural (une instruction excute de manire squentielle). L'assignement procdural est instantan, le reg conserve son tat jusqu'au prochain assignement. - l'tat d'un net n'est modi que par connexion structurelle ("branchement" d'un instance) ou par assignement continu ("branchement" d'un net une expression). Dans ces deux cas, l'action sur le net est permanente. Consquences : - un reg ne peut pas tre branch un port de sortie d'une instance, ni un port bidirectionnel (inout), - un net ne peut pas modi directement dans une squence d'instructions constituant un modle procdural. Transmission net --> reg : ne prsente aucune difcult dans un bloc procdural, car le membre de droite d'un assignement procdural peut tre une expression contenant librement regs et nets. Transmission reg --> net : - si le net est en dessous dans la hirarchie structurelle, la transmission peut se faire par connexion du reg un port d'entre d'une instance. C'est ainsi qu'on procde en gnral pour injecter les stimuli dans le module tester : voir pour exemples 2.1.3 et 2.3.
J.L.N.2005

page 14

INITIATION VERILOG

page 14

- si le net est au dessus ou au mme niveau dans la hirarchie structurelle, la transmission peut se faire par assignement continu (le membre de droite d'un assignement continu peut tre une expression contenant librement regs et nets). C'est ainsi qu'on procde en gnral pour acheminer le rsultat du modle procdural d'un module vers les ports de sortie de ce module : voir pour exemples 2.2.1, 2.2.2 et 2.2.3. (On en prote souvent pour introduire dans cet assignement le temps de propagation des sorties du module). N.B. Ne pas confondre assignement procdural et assignement continu. L'assignement procdural est dans un bloc procdural, il ne contient pas le mot-clef "assign" mais seulement le signe "=", son membre de gauche est un reg. L'assignement continu est en dehors de tout bloc procdural, il commence par le mot-clef "assign", son membre de gauche est un net.

6. Etats et Forces
Le simulateur Verilog connat quatre tats logiques : 0, 1, X et Z. L'tat X est l'tat "indtermin" ou "inconnu". C'est une pure abstraction : il n'existe pas dans le circuit rel, mais sert traduire une absence de dterminisme un instant particulier de la squence de simulation. C'est l'tat initial de tous les regs et nets. C'est aussi l'tat qui apparat lorsqu'un conit entre 1 et 0 ne peut tre rsolu. Cet tat n'est pas considr comme une erreur, mais comme un tat part entire qui est propag par application d'une extension de l'algbre de Boole : 1 & X --> X 1 | X --> 1 ~X --> X 0 & X --> 0 0 | X --> X En sortie, il sert dtecter un manque d'initialisation ou un conit. En entre, il peut tre utilis pour faire une analyse de dterminisme : exemple : Supposons qu'on veuille prouver que lorsque le bit a[7] de l'entre a[7:0] d'un circuit est nul le rsultat est indpendant des 7 autres bits de a. Pour cela il suft de faire : a = 'b0xxx_xxxx; et d'observer que aucune des sorties n'est X (on vite ainsi de devoir essayer 128 valeurs de a). L'tat Z est l'tat haute-impdance. Il traduit un phnomne physique rel : le noeud "ottant". Il apparait lorsqu'une entre est "en l'air" ou lorsqu'un bus bidirectionnel n'est contrl par aucun des drivers tri-state qui y sont connects. Lors de l'valuation des expressions logiques, il est d'abord converti en tat X.

J.L.N.2005

page 15

INITIATION VERILOG

page 15

Les conits apparaissent lorsque plusieurs sources de signal (sorties ou ports bidirectionnels ou assignements continus) sont connectes sur le mme net, et tendent le forcer des tats contradictoires. Bien entendu, l'tat Z ne contredit aucun autre vu son caractre passif. (Mais l'tat X contredit tous les autres). Une chelle de forces permet de contrler la rsolution des conits. Si les sources ont des forces diffrentes, la plus forte impose sa valeur, si elles ont des forces gales, la contradiction se traduit par l'tat X du noeud. Echelle des 5 forces : supply, strong, pull, weak, highz. La force par dfaut est : strong. Exemple : Modlisation de portes NMOS ou DCFL-MESFET ou "open-collector" avec pull-up passif : module DCFL_nor2( s, a, b ); output s; input a, b; assign (strong0, pull1) #(2.5, 2.0) s = ~( a | b ); endmodule En "court-circuitant" les sorties de plusieurs de ces portes, on effectue un "et cbl" puisque les conits se rsolvent en faveur du 0. Autre exemple : forage des noeuds d'un circuit pour initialisation : On ajoute un assignement continu (conictuel) sur un noeud dj connect une sortie de cellule, avec une force supply suprieure la force par dfaut. Pour relcher le forage, on donne cette source la valeur Z.

7. Blocs Procduraux
7.1 Rgles
La modlisation procdurale est contenue dans des blocs procduraux (ou dans les tches et fonctions appeles par ces blocs). Les blocs procduraux sont des portions de programme qui sont excutes en parallle. Il n'y a pas de hirarchie des blocs procduraux, un bloc ne peut pas en appeler un autre. (Par contre un bloc procdural peut appeler des tches et fonctions). Les blocs procduraux ne sont pas appels, mais dmarrent tous simultanment l'instant zro. Les blocs procduraux sont obligatoirement contenus dans des modules. L'ordre de leurs dclarations n'a aucune incidence sur leur excution. Ils ne contiennent ni instances, ni assignements continus.

J.L.N.2005

page 16

INITIATION VERILOG

page 16

Exemples : bloc initial (excut une seule fois) : voir 2.1.3 bloc always (ritr indniment) : voir 2.2

7.2 Temporisation procdurale


Les conditions de temporisation procdurale #, @ et wait peuvent apparatre soit dans l'en-tte d'un bloc initial ou always, soit en prxe d'une instruction dans un bloc

7.2.1 dlai relatif


Le caractre # suivi d'un nombre ou d'un expression numrique introduit une attente avant l'excution d'une instruction ou d'un bloc (et retarde d'autant toute la suite du bloc). On ne peut spcier le temps de manire absolue (mais en cas de besoin, on peut crer un bloc initial contenant seulement l'instruction dont on veut spcier l'instant d'excution de faon absolue.)

7.2.2 attente de transitions ou de front


Le caractre @ suivi d'une liste de signaux entrane l'attente de la prochaine transition dun des signaux de la liste. Sous cette forme, cette condition permet la modlisation de circuits combinatoire de manire procdurale, exemple : always @ ( A or B or C ) begin ..... RESU = .... end Chaque fois que l'un des signaux d'entre A, B, ou C change d'tat, la sortie RESU est re-calcule (comparable au "process" de VHDL). Avec les mots-clefs posedge (front montant) et negedge (front descendant) on peut choisir quel front va tre attendu, ce qui nous fournit l'outil de base de modlisation des systmes synchrones : @ (posedge clk) attendra le prochain front actif d'horloge.

7.2.3 attente dun niveau


Le mot-clef wait suivi d'un expression logique va faire attendre que cette expression prenne une valeur "vraie" (non-nulle). Si l'expression est vraie au moment de l'excution, il n'y a pas d'attente. N.B. ne pas confondre wait et if : wait bloque l'excution tant que la condition n'est pas satisfaite, alors que if saute immdiatement l'instruction suivante.
J.L.N.2005

page 17

INITIATION VERILOG

page 17

8. Constructions Procdurales
A l'intrieur d'un bloc procdural, on trouve des instructions simples ou composes, ventuellement prxes de conditions de temporisation. Une instruction simple peut tre : un assignement procdural un appel de tche une construction itrative (boucle) ou dcisionnelle (if ou case). Dans les deux premiers cas, elle doit tre termine par le caractre ";" Une instruction compose est une squence d'instructions encadre par les mots-clefs begin et end. Les constructions sont trs similaires au langages C, deux diffrences prs : prsence des conditions de temporisations, begin et end la place de { et }. N.B. Il n'y a pas de danger mettre plus de couples begin - end qu'il n'est strictement ncessaire, et cela peut amliorer la lisibilit du texte (exemple 2.2.1)

8.1 Itrations ou boucles


8.1.1 boucle for
similaire au C : for ( <assignement>; <condition>; <assignement> ) <instruction> exemple : for ( i = 0; i < IMAX; i = i+1 ) begin @ (posedge clk) a = a >> 1; #11 x = a & 1; end N.B. la variable de contrle doit avoir t dclare (integer en gnral)

8.1.2 boucle while


similaire au C : while ( <condition> ) <instruction> exemple : while ( a[7] == 0 ) // justification gauche de a[7:0] a = a << 1;
J.L.N.2005

page 18

INITIATION VERILOG

page 18

8.1.3 boucle repeat


repeat ( <expr> ) < instruction > exemple : repeat (3) begin a = 1; #t a = 0; #(t*3) ; // le ";" reprsente une inst. vide end La variable qui sert a compter les "tours de boucle" est cache, on ne peut ni la dclarer ni y accder explicitement.

8.1.4 boucle forever


forever <instruction> exemple forever #(p/2) clk = ~clk; Attention : Il faut imprativement viter une boucle capable de faire un nombre illimit de "tours" en un temps de simulation nul. Ceci bloque irrmdiablement la simulation sans que l'utilisateur soit averti. Exemple : while ( a == 0 ) begin end // attendre que a passe a 1 bloque la simulation sans attendre que a passe 1, doit tre remplac par wait ( a ) ; Autre exemple : l'exemple du 8.1.2 va bloquer la simulation si a[7:0] est nul. Si cela risque de se produire, il faut modier le programme comme suit : i = 7; while ( ( a[7] == 0 ) && ( i ) ) // justification gauche begin a = a << 1; i = i - 1; end

8.2 Dcisions
8.2.1 dcision if
similaire au C : if ( <condition> ) <instruction> else <instruction> ou simplement : if ( <condition> ) <instruction> exemple : cf 2.2.1

J.L.N.2005

page 19

INITIATION VERILOG

page 19

8.2.2 expression conditionnelle


similaire au C : ( <condition> ) ? <instruction> : <instruction> N.B. peut aussi s'utiliser dans un assignement continu ! exemple : cf 9.2 et 10.1.1

8.2.3 dcision case


trs diffrent du C ! case ( <expression> ) <constante> : <instruction> .... .... default : <instruction> endcase exemple : case ( opcode ) // ALU combinatoire 1 : s = a & b; 2 : s = a | b; 5 : s = a + b; 7 : s = ~a; default : s = 'bXXXXXXXX_XXXXXXXX; endcase

9. Encore quelques exemples


9.1 bascule D avec clear asynchrone
Soit faire le modle d'une bascule D sensible au front montant, avec une entre de remise zro asynchrone (prioritaire) sensible au niveau : module LibDFFc ( q, ck, d, clear ); input ck, d, clear; output q; reg iq; always @ ( posedge ck ) // <== sensible au front if ( clear == 0 ) iq = d; always wait ( clear == 1 ) // <== sensible au niveau begin iq = 0; wait ( clear == 0 ) ; end assign #8 q = iq; specify // timing a verifier : setup 5.2 ns, hold 1.5 ns $setuphold( posedge ck, d, 5.2, 1.5 ); endspecify
J.L.N.2005

page 20 endmodule

INITIATION VERILOG

page 20

N.B. Si on oublie la condition wait ( clear == 0 ) la n du second bloc always, celui-ci va boucler un nombre indni de fois ds que clear sera 1 ==> simulation bloque (cf 8.1 ). Remarquer aussi que cette condition prxe une instruction vide, reprsente par un ";" (obligatoire). Le bloc "specify" sert ici demander au simulateur des vrications de "timing", dans le cas prsent il devra signaler par un "warning" toute transition de d qui surviendrait entre 5.2 ns avant et 1.5 ns aprs le front montant d'horloge.

9.2 Buffer tri-state


module LibTRI ( out, in, out_ena ); inout out; input in, out_ena; assign (strong0, highz1) #1 out = in | ~out_ena; assign (highz0, strong1) #1 out = in & out_ena; endmodule variante : module LibTRI ( out, in, out_ena ); inout out; input in, out_ena; assign #1 out = ( out_ena ) ? in : 'bz; endmodule

9.3 Cellule paramtre


Lutilisation de paramtres permet de faire des descriptions gnriques. exemple : le registre dcalage du 2.2.1 gnralis N bits : // registre piso de N bits module pisoN( clk, load, par_in, ser_out ); parameter N=4; input clk, load; input [(N-1):0] par_in; output ser_out; reg [(N-1):0] contenu; always @ (posedge clk) contenu = (load)?(par_in):(contenu >> 1); assign #3 ser_out = contenu[0]; endmodule exemple dinstance dun piso de 16 bits : defparam piso_inst.N = 16; pisoN piso_inst ( ck, load, data_in, ser_data ); La directive defparam a permis de xer une valeur de N diffrente de la valeur par dfaut.
J.L.N.2005

page 21

INITIATION VERILOG

page 21

10. Introduction la Synthse Logique


C'est la technique qui consiste utiliser un logiciel de synthse pour obtenir automatiquement une description structurelle (utilisant les cellules d'une bibliothque pralablement dnie) partir d'une description comportementale. (Accessoirement cette technique peut aussi tre utilise pour optimiser une description structurelle existante, ou l'adapter une bibliothque diffrente ("reciblage").) Il faut savoir qu'il ne suft pas qu'une description comportementale donne un rsultat correct la simulation pour qu'elle soit "synthtisable", il y a de nombreuses restrictions dans l'emploi des primitives du langage. De plus un logiciel de synthse utilis sans prcautions est capable de produire un circuit N fois plus compliqu qu'il n'est ncessaire. On donnera ici quelques directives gnrales, en prcisant bien que chaque logiciel de synthse impose des contraintes particulires.

10.1 Modules combinatoires


10.1.1 description concurrente
La solution "sans problmes" est la description concurrente base d'assign. Elle sapplique spcialement bien aux cas o on dispose dj dexpressions boolennes (non ncessairement minimales) des fonctions raliser : exemple : le multiplexeur du 2.2.3. module LibMux( i0, i1, s, y ); input i0, i1, s; output y; assign #1 y = ( i0 & ~s ) || ( i1 & s ); endmodule On peut aussi exploiter dautres possibilits des expression Verilog : module LibMux( i0, i1, s, y ); input i0, i1, s; output y; assign #1 y = (s)?(i1):(i0); endmodule variante (gnralisable N entres) : module LibMux( ivec, s, y ); input s; input [1:0] ivec; output y; assign #1 y = ivec[s]; endmodule autre exemple : additionneur-soustracteur 8 bits : module addsous( A, B, sign, X ); input [7:0] A, B; input sign; output [8:0] X; assign X = (sign)?(A+B):(A-B); endmodule

J.L.N.2005

page 22

INITIATION VERILOG

page 22

10.1.2 description procdurale


Si la spcication du bloc combinatoire se prsente sous forme dune table de vrit, on peut vouloir viter lextraction manuelle des expressions boolennes des sorties. Pour dcrire le module directement sous forme de table, on peut utiliser la dcision case (voir 8.2.3) dans un bloc procdural dclench par les transitions des entres : module tableau( A, B, Z ); input [2:0] A; input B; output [4:0] Z; reg [4:0] rZ; always @ ( A or B ) case ( { A, B } ) 'b0001 : rZ = 'b10001; 'b0100 : rZ = 'b01001; 'b0110 : rZ = 'b01111; default : rZ = 'b10000; endcase assign Z = rZ; endmodule N.B : on a d dclarer un reg pour la sortie de la table. Le reg ayant en gnral une capacit de mmorisation, le programme de synthse risque de mettre des bascules, ce qui est contraire lobjectif de faire un circuit combinatoire. Heureusement leffet de mmorisation est vit si on respecte : Les deux conditions de modlisation procdurale dun bloc combinatoire : toutes les variables intervenant dans lvaluation du reg apparaissent dans la condition de dclenchement du bloc always, le reg est re-valu dans tous les cas dxcution du bloc Dans lexemple ci-dessus, la clause default du case permet de garantir la seconde condition. Dune faon plus gnrale, un circuit combinatoire peut tre dcrit par une construction procdurale si les deux conditions ci-dessus sont satisfaites. Un autre exemple : supposons qu'on veuille faire un module comptant les "uns" du vecteur d'entre : module compte_uns( in, res ); input [2:0] in; output [1:0] res; reg [1:0] r; integer cnt; always @ (in) begin r = 0; for ( cnt = 0; cnt < 3; cnt = cnt + 1 ) r = r + in[cnt]; end assign res = r; endmodule
J.L.N.2005

page 23

INITIATION VERILOG

page 23

Bien que lalgorithme soit squentiel, le circuit synthtis par logiciel Synopsys sera purement conbinatoire.

10.2 Modules Squentiels Synchrones


La description fait appel un bloc procdural, de type always @ (posedge clk) dcrivant les actions effectuer entre deux fronts actifs d'horloge. Ce bloc ne doit contenir aucune temporisation autre que celle de len-tte. Ce bloc constitue la boucle unique de la description, il ne doit pas en gnral contenir de boucle interne genre while ou for. Les signaux de type reg tant dous de mmoire, le logiciel va avoir tendance placer une bascule pour chaque bit de reg recevant des valeurs lintrieur du bloc always. Il faut donc soigneusement valuer les besoins en mmoire du systme projet et ne dclarer que le minimum de regs ncessaires. exemple : le registre du 2.2.1 est dcrit dans un style parfaitement synthtisable. Il est galement possible quun mme module contienne plusieurs blocs procduraux, dont un seul dclench par le font dhorloge, et un ou plusieurs autres reprsentant des parties combinatoires respectant les deux conditions expliques au 10.1.2. Attention : un mme reg ne doit pas subir des affectations dans deux blocs procduraux ayant des conditions de dclenchement diffrentes. Ceci aboutirait a une impossibilit de synthse. (Ainsi lexemple du 9.1 nest pas synthtisable)

J.L.N.2005

page 24

INITIATION VERILOG

page 24

10.3 Machine tats nis


Considrons une machine tats nis ou automate synchrone selon le modle de Moore et dcrivons la dans le style RTL :

module moore_fsm( entrees, sorties, clk ); input [1:0] entrees; input clk; output [3:0] sorties; reg [2:0] etat_futur, etat_present; reg [3:0] r_sorties; always @ (posedge clk) etat_present = etat_futur; always @ (etat_present or entrees) begin < calcul etat_futur > end always @ (etat_present) begin < calcul r_sorties > end assign sorties = r_sorties; endmodule Naturellement il est possible de remplacer le second ou le troisime bloc procedural par une description concurrente ( base dassigns).

J.L.N.2005

page 25

INITIATION VERILOG

page 25

Variante ou ltat futur napparait pas explicitement : module moore_fsm( entrees, sorties, clk ); input [1:0] entrees; input clk; output [3:0] sorties; reg [2:0] etat_present; reg [3:0] r_sorties; always @ (posedge clk) begin < calcul etat_present > end always @ (etat_present) begin < calcul r_sorties > end assign sorties = r_sorties; endmodule

10.4 Registre avec clear asynchrone


La description de bascule du 9.1 est correcte mais nest pas accepte par certains programmes de synthse. On utilise alors la variante suivante (qui nest pas strictement correcte) : always @ ( posedge ck or posedge clear ) if ( clear ) iq = 0; else iq = d; De cette manire on peut facilement introduire le clear asynchrone dans une description de type RTL comme celle du 10.3.

J.L.N.2005

page 26

INITIATION VERILOG

page 26

11. Ce qui resterait voir


Ce document n'est pas le manuel de rfrence du langage Verilog mais seulement une introduction. Il faut savoir qu'il existe de nombreuses possibilits complmentaires... primitives du simulateur, soit modules pr-dnis reprsentant les portes logiques de base primitives dnies par l'utilisateur (UDP) par reprsentation tabulaire (comb. et seq.) modlisation MOS au niveau transistor, modlisation MOS dynamique (effets capacitifs) chelle des 3 cas de temps de propagation : min, typ, max modles de propagation (inertiel et transport) "path delay specify" : spcications des temps de propagation par chemins assignement continu incorpor la dclaration de net dlais, forces incorpors la dclaration de net types de net autre que wire instances avec ports non connects conits de types de net aux ports d'une instance output port dclar comme reg --> assignement continu implicite nombres rels "command line options" : options d'invocation, organisation des bibliothques ("libraries") mode interactif et mise au point ("debugging", "patching") "tasks", "functions" : tches et fonctions dnies par l'utilisateur (= sous-programmes) fonctions et tches pr-dnies autres que celles utilises dans les exemples ($xxxx) accs des chiers de donnes directives de compilation `default_nettype, `dene, `unconnected_drive, etc.. vnements nomms ("named events") paralllisme l'intrieur d'un bloc procdural ("fork", "join") "intra-assignement timing" : dlai l'intrieur d'un assignement procdural

J.L.N.2005

Vous aimerez peut-être aussi