Verilog PDF
Verilog PDF
Verilog PDF
INITIATION VERILOG
page 1
1. Introduction- - - - - - - - - - - - - - - - - - - - - -2
1.1 Objectifs 1.2 Les supports de donnes en Verilog 2 3
8. Constructions Procdurales - - - - - - - - - - - - - 17
8.1 Itrations ou boucles (for, while, repeat, forever) 8.2 Dcisions (if, expr. conditionnelle, case) 17 18
page 2
INITIATION VERILOG
page 2
J.L.N.2005
page 3
INITIATION VERILOG
page 3
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.
(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
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
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).
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.
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
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.
J.L.N.2005
page 12
INITIATION VERILOG
page 12
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 ).
page 13
INITIATION VERILOG
page 13
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
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)
page 18
INITIATION VERILOG
page 18
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
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.
page 21
INITIATION VERILOG
page 21
J.L.N.2005
page 22
INITIATION VERILOG
page 22
page 23
INITIATION VERILOG
page 23
Bien que lalgorithme soit squentiel, le circuit synthtis par logiciel Synopsys sera purement conbinatoire.
J.L.N.2005
page 24
INITIATION VERILOG
page 24
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
J.L.N.2005
page 26
INITIATION VERILOG
page 26
J.L.N.2005