0% au considerat acest document util (0 voturi)
547 vizualizări45 pagini

Tutorial Verilog

Încărcat de

marceliny
Drepturi de autor
© Attribution Non-Commercial (BY-NC)
Respectăm cu strictețe drepturile privind conținutul. Dacă suspectați că acesta este conținutul dumneavoastră, reclamați-l aici.
Formate disponibile
Descărcați ca PDF, TXT sau citiți online pe Scribd
0% au considerat acest document util (0 voturi)
547 vizualizări45 pagini

Tutorial Verilog

Încărcat de

marceliny
Drepturi de autor
© Attribution Non-Commercial (BY-NC)
Respectăm cu strictețe drepturile privind conținutul. Dacă suspectați că acesta este conținutul dumneavoastră, reclamați-l aici.
Formate disponibile
Descărcați ca PDF, TXT sau citiți online pe Scribd

Lab1-OC A: Tutorial de Verilog. B: Introducere in FPGA-uri.

Plci Altera DE2

Part A: Tutorial de Verilog


1. Introducere
1.1. Ce este Verilog-ul ? 1.2. Cateva caracteristici 1.3. Modelarea unui system digital cu Verilog 1.3.1. Modelul flux de date 1.3.2. Modelarea comportamentala 1.3.3. Modelarea structurala 1.3.4. Modelarea mixt

2. Elemente si artificii ale limbajului Verilog HDL prezentate prin exemple


2.1. Modulul Verilog 2.2. Atribuiri de tip blocking i non-blocking 2.3. Tipuri de date 2.3.1. Tipuri net 2.3.2. Tipuri variabil 2.3.3. Diferena ntre reg i wire 2.3.4. Semnale pe mai muli bii 2.4. Operatori Verilog HDL 2.5. Clauza initial 2.6. Instruciuni procedurale 2.6.1. Instruciuni decizionale 2.6.2. Instruciuni repetitive 2.6.3. Instruciuni de tip bloc secvenial 2.7. Alte tipuri de instruciuni 2.8. Funcii i task-uri Verilog HDL 2.9. Task-urile i funciile sistem

3. Verificarea i simularea unui design Verilog HDL


3.1. Modelarea ntrzierilor 3.2. Modulul de test (testbench)

Copyright @ Oana Boncalo & Alexandru Amaricai

Part A: Tutorial de Verilog

Obiective: dobndirea unor cunostine de baz prinvind modelarea sistemelor digitale folosind limbajul de descriere hardware Verilog. n cele ce urmeaz, prezentul material ofer o descriere succint a principalelor noiuni (subset Verilog) n vederea modelrii i sintezei unor sisteme digitale de complexitate medie.

1. Introducere
1.1. Ce este Verilog-ul ? Verilog-ul este un limbaj de descriere hardware (HDL) care permite modelarea unui sistem digital la diferite niveluri de abstractizare: algoritmic, comportamental, port logic, nivelul comutator (switch level). Acesta se bucur de o mare popularitate n rndurile designerilor de hardware i a productorilor de tool-uri CAD. Din acest considerent, Verilog HDL a fost transformat ntr-un standard IEEE, ultima aciune de acest tip concretizndu-se prin standardul IEEE 1364-2001.

1.2. Cteva caracteristici


O scurt enumerare a principalelor trsturi ale limbajului Verilog HDL cuprinde: Primitive logice elementare, precum pori logice and, or i nand sunt definite n cadrul limbajului; Este un standard IEEE; Permite trei stiluri diferite de modelare: flux de date, comportamental, i structural; Prezint dou tipuri de date: net-ul care modeleaz conexiunea fizic ntre elementele de structur (firul/traseul fizic) i tipul variabil (un element de memorare al informatiei abstract); Permite mai multe niveluri de abstractizare, pornind de la nivelul comutator, la nivelul poart logic, nivelul transfer la nivel de regitri (register transfer level RTL), la nivel de algoritm; Pot fi scrise entiti de test (testbench-uri) i generai stimuli pentru procesul de verificare a designurilor; Trsturi precum execuia concurent i ntrzierile (timpul) pot fi modelate;

Copyright @ Oana Boncalo & Alexandru Amaricai

Faciliti de manipulare a fiierelor;

1.3. Modelarea unui sistem digital folosind Verilog HDL


Exist mai multe stiluri de a modela un sistem n Verilog. Elementul central in Verilog este constituit de noiunea de modul. Acesta poate fi folosit pentru a modela att elemente simple, ct i sisteme complexe. n esen un design Verilog complex poate fi asimilat cu o multitudine de module interconectate, reprezentnd subansamblele sale. n cadrul unui modul se pot ntalni urmtoarele stiluri de modelare: Modelarea sub form de flux de date; Modelarea comportamental; Modelarea structural; Modelarea mixt; Acestea vor fi succint prezentate prin nite exemple n cele ce urmeaz. 1.3.1. Modelul flux de date Mecanismul care este folosit pentru modelul flux de date se bazeaz pe instruciunea assign, de atribuire continu. Aceasta realizeaz evaluarea continu (reevalueaz expresia de fiecare dat cnd unul dintre operanzi i modific valoarea) a expresiei din dreapta egalului, i atribuie noua valoare unui net (vector de tip net). n dreapta putem avea att tipul net ct si tipul variabil. Sintaxa este urmtoarea: assign [delay] tipul_net = expresie; Specificarea unei ntrzieri este opional. Ea trebuie s fie precedat de o directiv de compilator care asociaz o unitate de timp. Aceasta apare naintea declaraiei de modul. `timescale 2ns/1ns Aceast directiv stabilete c unitatea de timp este egal cu 2 ns i c se lucreaz cu o precizie de 1 ns (toate ntrzierile sunt rotunjite la 1 ns). Aadar un exemplu de atribuire continu este urmtorul: assign #2 a=b; Atribuie lui a valoarea lui b cu o ntrziere de 2 cuante de timp (pentru directiva timescale din exemplul anterior dup 4 ns). Atribuirea continu reprezint o modalitate natural de modelare a logicii combinaionale. Operanzii corespunztori n exemplul urmtor este prezentat codul Verilog HDL pentru o celul sumator complet cu 3 intrri de date i dou ieiri. De asemenea sunt prevzute ntrzieri pentru operaiile logice din celula de nsumare.

Copyright @ Oana Boncalo & Alexandru Amaricai

s = a b cin

cout = ab + acin + bcin

Figura 1: Celul sumator pe 1 bit. Cod Verilog HDL pentru modelul de tip flux de date Operanzii corespunztori acestiu tip de descriere sunt de nivel jos: Atribuire condiionat: (expresie_condiie)? (valoare?adevrat): (valoare_fals); Ex.: assign out= sel? in1: in2; Operatori logici: ~, &, |, ^ (negare, i, sau, xor); Operatori aritmetici: +, +, *;

Exist i posibilitatea folosirii de construcii ncuibate. Trebuie insistat asupra faptului c aceste instruciuni se execut concurent (nu conteaz ordinea n care au fost scrise, ele bucurndu-se de calitatea de execuie paralel, - aspect similar cu execuia portilor logice dintr-un design hardware).

Copyright @ Oana Boncalo & Alexandru Amaricai

1.3.2. Modelarea comportamental Are la baz construcii de tip always. Acestea permit o descriere de nivel nalt a comportamentului unui dispozitiv hardware prin folosirea unor instruciuni care se execut secvenial similare cu cele ntlnite n limbajul C precum cele de decizie (if, case), repetitive (for, while), etc.. Exist dou tipuri de blocuri de cod Verilog HDL care sunt executate secvenial: initial este executat o singur dat, de regul la instanierea unei componente de tipul celei definite de modulul n care se afl blocul initial. Rolul lui este de a realiza o iniializare a componentei; always folosit pentru a descrie comportamentul unui dispozitiv (pri a acestuia) hardware; Pentru a exemplifica acet tip de modelare vom folosi acelai dipozitiv celula de nsumare complet.

Figura 2: Celul sumator pe 1 bit. Cod Verilog HDL pentru modelarea comportamental O clauz always trebuie s fie prevzut cu un fel de control pentru timp. Acesta poate fi reprezentat fie de ntrzieri (wait ateapt un interval de timp), fie de producerea unui eveniment (wait ateapt modificarea unui semnal din lista de senzitiviti). n lipsa acestora, codul este executat la infinit. Foarte important este i cuvntul cheie reg. Acesta nu face referire la regitri ntlnii n calculul digital. Acetia din urm i modific valoarea sincron cu un semnal de tact.
Copyright @ Oana Boncalo & Alexandru Amaricai

Registri reg Verilog HDL nu necesit tact, nu li se induce o valoare ntr-un mod analog firelor fizice, i i pot modifica valoarea n orice moment al simulrii. n Verilog HDL, cuvntul cheie reg denot o variabil care poate memora o valoare la un moment dat. 1.3.3. Modelarea structural Verilog HDL suport pori logice elementare (primitive): and, nand, or, nor, xor, xnor, not, buf cu intrri multiple nanad3in(out, in1, in2, in3); buif1 i buif0 sunt bufere de tip tristate;

Copyright @ Oana Boncalo & Alexandru Amaricai

Figura 3: Celul sumator pe 1 bit. Cod Verilog HDL pentru modelarea structural Acestea sunt instaniate n componentele unui design, i sunt conectate prin net-uri. Acestea se declar folosind cuvntul cheie wire. Reprezint analogul firelor/traseelor din design-urile fizice. 1.3.4. Modelarea mixt De multe ori in descrierea HDL este folosita o abordare mixta, care presupune folosirea a oricror doua modaliti de descriere hardware n cadrul unui modul. n cele ce urmeaz extindem exemplul cu celula de nsumare pentru modelarea mixt.

Figura 4: Celul sumator pe 1 bit. Cod Verilog HDL pentru modelarea mixt

Copyright @ Oana Boncalo & Alexandru Amaricai

Dac instanierea altor tipuri de subsisteme declarate prin alte module nu ridic probleme, este important de realizat diferena dintre o atribuire la un reg, i o atribuire la un wire. Astfel aceast diferen este punctat n cele ce urmeaz: Pentru reg atribuirea se face la fiecare execuie a codului (de regul dintr-o clauz always); aadar ea este condiionat de apariia evenimentului dorit la unul sau mai multe semnale de gard (front cresctor de tact, modificarea palierului unui semnal funcie de realitatea modelat); Pentru wire atribuirea/evaluarea expresiei din dreapta este una continu;

Exemplele prezentate n aceast seciune i-au propus s realizeze o scurt trecere n revist a unui sub-set din trsturile i posibilitile oferite de Verilog HDL pentru descrierea dispozitivelor logice.

2. Elemente i artificii ale limbajului Verilog HDL prezentate prin exemple 2.1 Modulul Verilog
Reprezint unitatea de structur n Verilog HDL. Acesta prezint urmtoarea sintax: module nume_modul (list_porturi); declaraii_i_instruciuni endmodule Lista de porturi definete interfaa unui modul maniera prin care comunic cu exteriorul. Porturile pot fi de trei tipuri: Intrare input Ieire output Bidirecionale inout Un port este n mod implicit de tip net (reamintim c tipul net este asimilat unei conexiuni fizice vezi seciunea 2.3.1). Opional (dac este folosit n cadrul unei construcii always) porturile de ieire pot si declarate de tip reg. Declaraiile de porturi se pot face n cadrul listei de porturi, fir pot constitui parte a modulului (module port declaration style versus module port list style). n cele ce urmeaz cele dou stiluri vor fi exemplificate pentru a se evidenia diferenele. n Verilog HDL, pentru claritate i lizibilitate este proferabil s sie folosit module port declaration style, ntruct att porturile ct i tipurile de date sunt specificate ntr-un singur loc. Din punct de vedere al corectitudinii codului, cele dou tipuri de realizare a declaraiilor sunt echivalente.
Copyright @ Oana Boncalo & Alexandru Amaricai

Figura 5: Exemplificarea modalitiilor de realizare a declaratiei porturilor unui modul. module port declaration style versus module port list style Verilog HDL ofer i posibilitatea parametrizrii designurilor, prin declararea unei liste de parametri afereni modulului. Acest lucru este convenabil pentru descrierea unor elemente de tip regitri, sumatoare, numrtoare, etc.. module nume_modul # (parameter param1=valoare1, param2=valoare2, ... parameter param3=valoare3, ...) (list_porturi); declaraii_i_instruciuni endmodule Un exemplu pentru folosirea parametrilor este prezrntat n cele ce urmeaz:

Figura 6: Exemplificarea modalitilor de realizare a parametrilor unui modul n continuare este prezentat modul n care se face instanierea unui modul. nume_modul nume_instan(list_asocieri_porturi); Asocierea porturilor din list se poate face implicit, prin poziia semnalelor asociate, sau explicit printr-o construcie de forma (prin nume):
Copyright @ Oana Boncalo & Alexandru Amaricai

.nume_port(expresie_care_se_asociaz) Aceast expresie poate fi o variabil sau un net, un cmp sau sub-ir dintr-un ir, o concatenare a celor anterior precizate, sau o expresie (numai pentru porturile care sunt de intrare). Trebuie avut n vedere, faptul c nu este admis folosirea simultan n cadrul aceleiai instane a asocierii poziionale cu cea bazat pe nume. De asemenea, asocierea prin poziie reclam respectarea ntocmai a ordinii i tipului expresiilor asociate porturilor. Atribuirea prin poziie, admite schimbarea ordinii expresiilor asociate porturilor n raport cu declaraia de modul. n Verilog HDL porturile neconectate rmn: Nefolosite dac sunt de ieire; Conectate la valoarea z dac sunt de intrare; n continuare este prezentat un exemplu pentru un sumator de tip ripple carry pe 4 bii. Acesta folosete celula de nsumare descris n seciunea 1, modificat astfel nct s permit un parametru de timp ntrzierea pentru o poart logic.

a)

b) Figura 7: Sumator cu propagarea serial a transportului (ripple carry adder) a- schem bloc; b- structur sumator

Copyright @ Oana Boncalo & Alexandru Amaricai

a)

b) Figura 8: Sumator cu propagarea serial a transportului (ripple carry adder) a- modul care descrie celula de nsumare; b- modul care descrie sumator cu propagarea serial a ntrzierii. Exemplu pentru diferitele modaliti de realizare a instanierii. Ca i ultim remarc, Verilog HDL este foarte flexibil n ceea ce privete declararea i instanierea unui modul, oferind fiecrui programator posibilitatea de a-i organiza codul astfel nct s fie ct mai accesibil cu putin. Totui, este recomandat ca declaraiile s

Copyright @ Oana Boncalo & Alexandru Amaricai

fie grupate pe ct, i instanierile s fie realizate folosind specificarea prin nume mai clar, care nltur pericolul asocierii greite prin poziie a semnalelor. 2.1. Clauza always - Atribuiri de tip blocking i non-blocking Clauza always reprezint principalul mecanism de modelare comportamental a unui sistem digital. Un modul poate conine un numr arbitrar de astfel de declaraii. O declaraie always definete un black-box, i conine descrierea comportamentului unui sistem prin instruciuni procedurale (similare limbajului C - if, case, for, while, etc.). care se execut in-order similar cu un cod scris ntr-un limbaj de nivel nalt. Aadar, nu trebuie pierdu din vedere faptul c dei n interiorul unui bloc always instruciunile sunt executate secvenial (n ordinea n care sunt scrise), n interiorul modulului, instruciunile sunt executate concurent. always [control_timp] construcie_procedural O clauz always trebuie s fie prevzut cu un fel de control pentru timp. Acesta poate fi reprezentat fie de ntrzieri (wait ateapt un interval de timp), fie de producerea unui eveniment (wait ateapt modificarea unui semnal din lista de senzitiviti). n lipsa acestora, codul este executat la infinit. Cea mai folosit construcie procedural este blocul secvenial de tip - begin end. Lista de senzitiviti definete semnalele care determin execuia unui always. Aceasta poate fi sensibil la front (cresctor sau descresctor), sau la palierul unui semnal (pozitiv sau negativ). Este important de precizat c o list de sensitiviti nu permite att semnale care sunt sensibile la front ct i semnale sensibile la palier. Aceast diferen este deosebit de important n contextul circuitelor secveniale. Pentru logica combinaional regula este simpl i anume se vor trece n aceast list toate semnalele care produc o modificare a ieirilor. Realizm o scurt clasificare a principalelor elemente constructive secveniale: Latch-uri sunt asincrone i evalueaz n mod constant intrrile; Flip-flop-urile (FF) sunt sincrone cu un semnal extern (tact) i pot s fie sensibile pe: o front o palier Regitri sunt o colecie de FF. Cu toate c latch-urile sunt folosite pentru a construi regitri (configuraie master-slave), ele apar rareori ca elemente de sine stttoare n cadrul unui design digital. Atribuirile de tip blocking, respectiv non-blocking sunt deosebit de uzitate n descrierea circuitelor digitale folosind Verilog HDL (dar se regsesc sub forme similare i n alte limbaje de descriere hardware, precum VHDL-ul) prin construcii de tip always. Diferena dintre cele dou tipuri este cel mai uor de scos in relief n descrierea logicii

Copyright @ Oana Boncalo & Alexandru Amaricai

secveniale. Din aceste considerente, n ceea ce urmeaz, exemplele vor viza n special circuitele secveniale. Atribuirea de tip: Blocking uziteaz de operatorul = i presupune evaluarea i actualizarea imediat (instantanee) a valorii variabilei din stnga egalului;

Non-blocking uziteaz de operatorul <= i presupune evaluarea expresiei din dreapta i actualizarea ei la sfritul pasului de simulare (la terminarea blocului always); toate atribuirile de acest tip din cadrul unui bloc always sunt evaluate cu valorile variabilelor dinainte de execuia blocului. Cu alte cuvinte, dac avem o variabil reg care i modific la un moment dat valoarea n cadrul blocului always, ca urmare a evalurii expresiei din dreapta, aceast modificare nu este una imediat, proximele evaluri folosind valoarea de la intrarea n blocul always (valoarea veche);

Sunt situaii n care, n ciuda acestor diferene se ajunge la acelai rezultat. n continuare cteva exemple folosind declaraii de tip always. Semnal cu perioada de 8 uniti de timp, care prezint un control de timp de tip ntrziere. always # 4 clk_sig=~ clk_sig;

Figura 9: Exemplu de logic combinaional cu cele dou variante de atribuiri


Copyright @ Oana Boncalo & Alexandru Amaricai

n Verilog HDL instruciunile de tip if i case sunt interpretate ad literam i pot da natere n urma sintezei la o interpretare de logic prioritar. Un exemplu n acest sens prezint codul Verilog HDL pentru un codificator binar 4 la 2 (4-to-2 binary encoder), i rezultatul obinut n urma sintezei (interpretarea pentru codul respectiv).

Figura 10: Exemplu de logic combinaional codificator 4-la-2. Tabel de adevr, schem logic minimizat de tool-ul de sintez, cod Verilog HDL

Copyright @ Oana Boncalo & Alexandru Amaricai

O modalitate nefericit de a descrie codificatorul 4-la-2 folosind clauza if determina interpretarea de ctre tool-ul de sinteza drept logica prioritar. Interpretarea din exemplul urmtor este dac i[0] este 1 atunci, independent de celelate intrri, ieirea este 11. Aadar, i[0] este prioritar n raport cu celelalte intrri.

Figura 11: Exemplu de logic combinaional descriere eronata codificatorului 4-la-2. Circuitul inferat de sintetizator n urma unei construcii eronate pentru clauza if care duce la sintetizarea de logic prioritar

n Verilog HDL netratarea explicit a tuturor ramurilor n cazul instruciunilor de tip if i case este interpretat ca i memorarea strii anterioare, i are ca rezultat de sintez inferarea unui latch (element de memorare) care s rein starea veche.

n Verilog HDL construcia always @ * este interpretat ca o list de semnale care cuprinde toate semnalele din bloc.

Copyright @ Oana Boncalo & Alexandru Amaricai

Aceast situaie este prezentat n proximul exemplu, cnd pentru instruciunea case nu este precizat cazul default. La un rezultat de sintez absolut similar se ajunge i n situaia exemplului cu instruciunea if, la care se omite ramura de else.

Figura 12: Exemplu de logic combinaional descriere eronata codificatorului 4-la-2. Circuitul inferat de sintetizator n urma unei construcii eronate pentru clauza case (datorit netratrii tuturor cazurilor pentru instructiunea case) conine elemente de memorare de tip latch n continuare sunt prezentate dou exemple de circuite secveniale, i anume un element de memorare - flip-flop de tip D cu reset sincron, respectiv un flip-flop de tip D cu reset asincron. n Verilog HDL lista de sensitiviti aferent unei construcii always nu poate conine att semnale care sunt active pe front ct i semnale active pe palier, ele sunt active fie pe front, fie pe palier.

Copyright @ Oana Boncalo & Alexandru Amaricai

a)

b) Figura 13: Exemplu de logic secvenial descriere bistabilului de tip D cu reset - a) sincron b) asincron

Foarte mare atenie trebuie acordat diferenei dintre atribuirea de tip blocking i cea de tip non-blocking. n acest sens este prezentat un exemplu simplu cu dou flip-flop-uri de tip, pentru care este prezentat rezultatul obinut n urma sintezei.
Copyright @ Oana Boncalo & Alexandru Amaricai

Pentru atribuirea de tip non-blocking, comportamentul pentru codul prezentat mai jos este urmtorul valorile de la intrarea n blocul always pentru semnalele a, b, c, f sunt folosite n toate evalurile. Atribuirile pentru noi valori calculate (pentru f i g n acest exemplu) sunt ntrziate pn la finee blocului always.

Figura 14: Exemplu de logic secvenial atribuirea de tip non-blocking. Rezultatul sintezei i codul Verilog HDL Pentru atribuirea de tip blocking, comportamentul pentru codul prezentat mai jos este urmtorul valorile folosite pentru toate evalurile sunt cele calculate n interiorul blocului, i pot fi diferite de cele de la intrarea n blocul always. De asemenea, atribuirile se fac in-order i valoarea nou calculat este actualizat imediat. n exemplul de mai jos, valoarea pentru g este calculat folosind noua valoare a lui f. n Verilog HDL atribuirile de tip blocking (folosesc simbolul =) din interiorul construciilor de tip always, se preteaz pentru descrierea logicii combinaionale pe mai multe niveluri.

Copyright @ Oana Boncalo & Alexandru Amaricai

Figura 15: Exemplu de logic secvenial atribuirea de tip blocking (acelai cod ca n exemplul anterior, singura diferen fiind atribuirea care este de tip blocking). Rezultatul sintezei i codul Verilog HDL Ultimele dou exemple vin s confirme diferenele majore care pot s apar la rezultatele de sintez, ca urmare a unor modificri aparent minore ale sintaxei.

Copyright @ Oana Boncalo & Alexandru Amaricai

2.2. Tipuri de date 2.2.1. Constante Setul de valori suportat de Verilog HDL cuprinde: Valoare Comentariu Verilog HDL 0 0 logic sau FALS 1 1 logic sau ADEVRAT X sau x necunoscut Z sau z impedan ridicat Tabel 1: Set de valori Verilog HDL Aceste valori sunt codificate n limbajul Verilog HDL. Constantele suportate de limbaj sunt: Constante ntregi; Constante reale; Constante iruri; Simbolul _ din interiorul unei constante reale sau ntregi este ignorat. El se folosete de regul pentru mbuntirea lizibilitii. Constantele ntregi pot fi exprimate n dou formate: simplu -32 15 baz de numeraie

Copyright @ Oana Boncalo & Alexandru Amaricai

Ex.: 2 ' b11 Constanta 3 exprimat - n binar pe 2 bii 2 ' b11 9 ' so72 12 ' so772 Constanta -6 exprimat -n octal pe 9, respectiv 12 bii 12 ' so7 _ 72 12 ' so72 Incorect exprimate 3' d 7 3' so772 (1 + 2) ' so7 _ 72 3' oz echivalent cu zzz, respectiv xxx 3' bx

ir extins de

n situaia n care valoarea constantei depete numrul de bii alocai, aceasta va fi trunchiat ncepnd cu partea stng, prin renunarea la bitul de semn dac este cazul. De asemenea valoarea constantelor negative este exprimat n complement de 2.

Constantele reale prezint: notaie zecimal 2.5 5.678 -15.4 45. - greit notaie tiinific 2_35.1e1 valoarea 2351 235.1e1 - valoarea 2351 5e-2 - valoarea 0.05

Constantele de tip iruri sunt definite ca secvene de caractere ntre ghilimele duble. Nu pot fi scrise pe mai multe rnduri. Pot conine caractere speciale definite cu ajutorul lui backslash:
Copyright @ Oana Boncalo & Alexandru Amaricai

Caracter special \n \t \ \\ Constanta SIR 2.2.2. Tipuri net

Comentariu newline Tab Caracterul Caracterul \

Tipul net este folosit pentru a descrie o conexiune fizic ntre mai multe elemente de structur (componente ale unui design). Valoarea net-ului este determinat de sursele pentru semnalul pe care l transport. Valoarea default n cazul n acre nu exist o surs este z. Exist mai multe tipuri de net-uri, care n ultima variant a standardului au fost multe dintre ele echivalate: Wire i tri Wire este cel mai folosit n design-urile Verilog HDL. Tradiional s-a folosit pentru reprezentarea conexiunilor cu o singur surs de semnal (signal driver). Ulterior a devenit identic ca i semnificaie cu tri semnal multisurs (mai multe declaraii de tip assign atribuie valoarea aceluiai semnal). Valoarea semnalului n acest caz este decis cu ajutorul tabelului. wire sau tri 0 1 x z Wor i trior 0 0 x x 0 1 x 1 x 1 x x x x x z 0 1 x z

Wor sau trior este echivalentul unui or-cablat ntre toate sursele unui semnal. Comportamentul este descris n tabelul ce urmeaz. wor sau trior 0 1 x z 0 0 1 x 0 1 1 1 1 1 x x x x x z 0 1 x z

Copyright @ Oana Boncalo & Alexandru Amaricai

Wand i triand

Wand sau triand este echivalentul unui i-cablat ntre toate sursele unui semnal. Comportamentul este similar cu cel al lui wor (sau trior), doar c funcia logic este de data aceasta I logic. Trireg

Modeleaz noduri capacitive cnd toate sursele de semnal sunt impedan ridicat, net-ul reine ultima valoare. Tri0 i tri1

Sunt folosite pentru a modela funcii logice cablate, avnd un tabel de funionare asemntor cu cel prezentat pentru wire (sau tri). Diferena survine pentru situaia n care semnalul surs nu are driver pe net, caz n care valoarea este 0 logic (pentru tri0), respectiv 1 logic (pentru tri1). Supply0 i supply1

Supply0 este folosit pentru a modela legtura la mas, iar supply1 modeleaz legtura la alimentare. Net-uri nedeclarate

Verilog HDL permite nedeclararea tipului de net, situaie n care n mod automat (dac nu se specific explicit altceva), ea este de tip wire pe un singur bit. Schimbarea acestui default, se face prin directiva de compilator default_nettype: `default_nettype tipul_netului //poate fi wand, wor, Sau se poate cere specificarea n mod obligatoriu a tipului de net. `default_nettype none

Vectored i scalar nets

Dac nu se specific un net este de tip scalar. Dac este declarat folosind cuvntul cheie vectored atunci nu pot fi accesate sub-pri ale vectorului (part select), i nici nu se pot face atribuiri la componentele individuale/sub-pri. 2.2.3. Tipuri variabil Variabilele sunt de mai multe tipuri: Reg; Integer; Time;

Copyright @ Oana Boncalo & Alexandru Amaricai

Real; Realtime;

Pot fi iniializate la declarare, prin atribuirea unei constante. Variabile de tip reg Sunt cele mai frecvent folosite, i se declar astfel:

O variabil neiniializat de tip reg are valoarea x. Exemple de astfel de declaraii: Ex.: reg [3:0] counter_reg, buf_reg; //ieirea unui numrator, respectiv registru reg test0; //variabil pe 1 bit 2.2.4. Diferena ntre reg i wire parameter MSB=31, LSB=1; // declararea de parametri n cadrul //modulului reg signed [MSB:LSB] adr_bus; reg signed [MSB:LSB] operand1,operand2;

Un reg reprezint o variabil care poate revendica unul sau mai muli bii. Nu trebuie confundat irul de bii cu un array de bii care reprezint o memorie.

n Verilog HDL o memorie este reprezentat printr-un vector (array) de variabile de tip reg.

Copyright @ Oana Boncalo & Alexandru Amaricai

Se declar astfel: reg [[MSB:LSB]] memory1[ADR_MAX1:ADR_MIN1], memory2[ADR_MAX2:ADR_MIN2], ; Un exemplu de memorie care are 128 de cuvinte pe 32 de bii este: parameter ADR_SIZE = 32, WORD_SIZE = 128; reg [ADR_SIZE-1:0] ram_memory [WORD_SIZE-1:0], data_reg; //ram_memory este un array de 128 variabile de tip reg pe 32 de biti //data_reg este o variabila de tip reg pe 32 de biti //putem adresa variabila reg la nivel de element, sub-ir de bii data_reg[0] sau data_reg[2:0] sunt corecte //i putem s-i atribuim o valoare assign data_reg=32bx; // //nu i la o memorie ram_memory[2:0], ram_memory1=ram_memory2 nu sunt corecte //atribuirea se face element cu element ram_memory1[0]=ram_memory2[0]; .

Se pot folosi task-urile de sistem pentru a iniializa o memorie. $readmemb([Link], ram_memory); //ncarc date sub form de numere binare //dintr-un fiier text n memorie ignornd spaiile albe i comentariile Ex.: Reg [7:0] rom_mem [3:0]; $readmemb ([Link],rom_mem); [Link] conine 11011111 11000000 10101010 01010101 $readmemh - pentru valori hexazecimale

Variabile ntregi Acestea sunt uzual folosite pentru a realiza descrieri de nivel nalt folosind Verilog HDL. Sintaxa pentru declararea unei variabile ntreg este: integer intreg1, intreg2, , intregn[MSB:LSB]; //msb, lsb specific indexii unui array de ntregi
Copyright @ Oana Boncalo & Alexandru Amaricai

n Verilog HDL o variabil ntreg este asimilat cu o variabil reg reprezentat pe 32 de bii. n baza notei de mai sus, urmtoarele atribuiri (care sunt nsoite de conversii implicite) sunt corecte: integer i; reg [7:0] reg1; i=7; reg1=i; // reg1 ia valoarea 00000111 exprimat pe 32 de bii //conversia se realizeaz implicit

Variabile real i realtime O variabil real este identic cu o variabil de tip realtime. Sintaxa pentru declararea ei este: real real1, real2, , realn[MSB:LSB]; //msb, lsb specific indexii unui array de numere reale Valoarea default pentru variabila real este 0. De asemenea daca i se atribuie unei variabile real un ir de bii care conine x i z, acetia din urm vor fi transformai n 0 logic. 2.2.5. Semnale pe mai muli bii Verilog HDL ofer suport pentru lucrul cu semnale pe mai muli bii. Astfel dou din facilitile cele mai importante vizeaz operaia de concatenare, precum i adresarea unor sub-iruri binare. Ele sunt prezentate prin dou atribuiri continue n exemplul urmtor: assign {a[7:0],a[15:8]}={a[15:8],a[7:0]}; assign {cout,s}=op1+op2+cin; //rezulatatul este extins la nr. de bii din partea stng

2.3. Operatori Verilog HDL Operatorii Verilog HDL se pot clasifica astfel: operatori aritmetici, operatori relaionali, operatori bit-cu-bit (bit-wise), operatori logici, operatori de reducere, operatori de comparare, operatori de iftare, operatori de concatenare i replicare, i operatorul

Copyright @ Oana Boncalo & Alexandru Amaricai

condiional. Ei vor fi prezentat succint n cele ce urmeaz, punctndu-se printr-un exemplu.

Operator Aritmetici + (-) * / % ** Shiftare << >> <<< >>>

Comentariu

Adunare (scdere) nmulire mprire Modulo Ridicare la putere

Shiftare logic la stnga Shiftare logic la dreapta Shiftare aritmetic la stnga Shiftare aritmetic la dreapta (se introduce n locul biilor shiftai semnul numrului)

Logici && || ! Bit cu bit ~ & | ^ ~^ sau ^~ De reducere ~& & | i-nu aplicabil la un ir de bii. i aplicat la un ir de bii. Sau aplicat la un ir de bii. Negare la nivel de bit (not). i la nivel de bit. Sau la nivel de bit. Xor la nivel de bit Xnor la nivel de bit. i logic Sau logic Negare logic

Copyright @ Oana Boncalo & Alexandru Amaricai

Relaionali > < >= <= De egalitate == != === Egalitate logic. Dac apare x sau y la unul dintre operanzi rezultatul egalitii este necunoscut (x). Inegalitate logic (diferit). Egalitate. Compar ad-literam fr s in cont de valori speciale. Tratamentul pentru y sau x este acelai ca pentru 0 sau 1. Inegalitate. Mai mare. Mai mic. Mai mare sau egal. Mai mic sau egal.

!==

n cele ce urmeaz cteva exemple de utilizare a operatorilor Verilog HDL. Ex.: my_reg1=8`b00101100; my_reg2=8`b1111110; | my_reg1 // este 1 & my_reg2 //este 0 my_reg1 & my_reg2 //este 00101100 my_reg2 <= my_reg1 //este True my_reg1 >> 2 //este 00001011 my_reg2>>>2 //este 11111111 nr. fiind cu semn my_r1=4`b11xz; my_r2=4`b11xz; my_r1 === my_r2 //este true my_r1 == my_r2 //este x (undefined)

Copyright @ Oana Boncalo & Alexandru Amaricai

2.4. Clauza initial Are un comportament asemntor cu clauza always, cu dou diferene importante: o construcie de tip initial se execut o singur dat; execuia ei are loc la momentul 0 al simulrii; Sintaxa este de forma: initial [control_timp] construcie_procedural De regul aceasta este folosit pentru a realiza o iniializare, sau generarea unor forme de und n cadrul unor entiti de test. Ex.: //generarea unei forme de und reg semnalul_meu; initial begin semnalul_meu=1`b1; #10 semnalul _meu=1`b0 ; #15 semnalul _meu=1`b1 ; end Forma de und generat este de forma:

Figura : Form de und pentru variabila reg semnalul_meu Un exemplu referitor la folosirea construciei initial este oferit n seciunea 3.2 sub forma unui testbench.

Copyright @ Oana Boncalo & Alexandru Amaricai

2.5. Instruciuni procedurale Acestea sunt utilizate pentru descrierile comportamentale n Verilog HDL. n continuare sunt prezentate instruciunile decizionale (case, if), cele repetitive (loop), precum i cele bloc (blocuri de tip beginend). 2.5.1. Instruciuni decizionale Verilog HDL prezint patru tipuri de instruciuni decizionale: if case Pentru instruciunea if sintaxa este de forma: if (condiie_1) construcie_procedural_1 [else construcie_procedural_2] Dac condiie_1 este evaluat la valoarea 1, atunci este executat construcia_procedural_1, n caz contrar dac condiie_1 este evaluat la una din valorile 0, z sau x atunci se execut ramura de else (dac ea exist). if (count_reg < 16) begin rdy=1`b1; count_reg=count_reg+ 4`b0001; end else begin rdy=1`b0; count_reg=4`b0000; end Pentru instruciunea case sintaxa este de forma: case (expresie_case) case_item_1 [, case_item_2, ] : construcie_procedural_1 case_item_m [, case_item_m+1, ] : construcie_procedural_m [default: construcie_procedural] endcase

Copyright @ Oana Boncalo & Alexandru Amaricai

case (expresie_case) case_item_1 [, case_item_2, ] : construcie_procedural_1 case_item_m [, case_item_m+1, ] : construcie_procedural_m [default: construcie_procedural] endcase Se recomand folosirea instruciunii case, pentru situaia n care este modelat un comportament care revendic decizie multipl n defavoarea unei construcii stufoase de tip if. module ALU_unit (input wire [31:0] op_a, input wire [31:0] op_b, input wire [3:0] opcode_instr, output reg rezultat); //declaraie parametri locali modulului localparam ADD_INSTR=4`b1001, SUB_INSTR=4`b1101, MUL_INSTR=4`b1011, DIV_INSTR=4`b1111; always @(op_a or op_b or opcode_instr) Case (opcode_instr) ADD_INSTR: rezultat<=op_a + op_b; SUB_INSTR: rezultat<=op_a - op_b; MUL_INSTR: considerentele op_b; Foarte importante sunt rezultat<=op_a *legate de sintez - vezi exemplele cu logica DIV_INSTR: cele legate de logica prioritar, precum i rezultat<=op_a /op_b; combinaional care este sintetizat cu // NOP ieirea rmne nemodificat elementedefault: rezultat<=rezultat; 2.2. de memorare de la seciunea endcase endmodule

Se recomand urmrirea meniunilor de la seciunea 2.2 cu privire la sintez (generarea de logic prioritar, respectiv introducerea de elemente de memorare de tip latch).

Copyright @ Oana Boncalo & Alexandru Amaricai

2.5.2. Instruciuni repetitive Verilog HDL prezint patru tipuri de instruciuni repetitive: forever-loop repeat-loop while-loop for-loop Forever-loop execut secvena de cod la infinit. Din aceste considerente este necesar un fel de control de timp (de exemplu introducerea unei ntrzieri). Pentru instruciunea forever sintaxa este de forma: forever construcie_procedural Acesta poate fi folosit pentru generarea unui semnal de tact cu perioada de 10 uniti de timp. initial begin semnal_tact=1`b0; #15 forever //semnalul este negat la fiecare 5 uniti de timp #5 semnal_tact=~ semnal_tact; end Forma de und generat este:

Figura 15: Form de und pentru semnal_tact descris anterior Repeat-loop execut secvena de cod de un numr specificat de ori. Dac contorul este x sau z el este interpretat ca 0. Pentru instruciunea repeat sintaxa este de forma: repeat (contor_nr_iteraii) construcie_procedural

Copyright @ Oana Boncalo & Alexandru Amaricai

repeat (contor) sum= sum+1; //adun 1 de contor ori A nu se confunda cu repeat care este folosit pentru controlul evenimentelor de tipul: repeat (contor) @ (posedge tact) sum= sum+1; //ateapt contor fronturi cresctoare ale semnalului de tact //pe frontul cresctor al tactului incrementeaz sum

While-loop execut secvena de cod ct timp este indeplinit condiia. Dac contorul este x sau z el este interpretat ca 0 (FALSE). Pentru instruciunea while sintaxa este de forma: while (condiie) construcie_procedural n urmtorul exemplu se realizeaz shiftarea registrului acumulator. while (nr_poz > 0) begin acc=acc<<1; nr_pos=nr_pos+1; end

For-loop execut secvena de cod un numr finit de ori. Pentru instruciunea for sintaxa este de forma: for (atribuire_iniializare ; condiie ; adunare_pas) construcie_procedural Exemplu pentru anterior n contextul instruciunii for este urmtorul: integer i; for (i=0; i<nr_pos; i=i+1) acc=acc<<1;

2.5.3. Instruciuni de tip bloc secvenial

Copyright @ Oana Boncalo & Alexandru Amaricai

Un bloc secvenia grupeaz mai multe instruciuni printr-o construcie de tip begin end. Instruciunile sunt executate n ordinea n care sunt scrise, iar eventualele ntrzieri de la instruciunea i, se raporteaz la timpul de simulare al instruciunii anterioare. Un bloc poate primi o etichet, caz in care el poate conine declaraii de variabile. Acestea din urm sunt statice (au valori valide pe tot parcursul simulrii). Sintaxa pentru un bloc secvenial este: begin [:identificator_bloc [declaraii_locale_bloc]] instruciuni_procedurale end Un exemplu de cod care genereaz un semnal: begin out1= x & y; //se execut dup atribuirea anterioar, pe frontul cresctor al semnalului de tact @ (posedge semnal_tact) out2=x | y; end 2.6. Alte tipuri de instruciuni Foarte utile pentru design-urile care necesit replicarea unor subcomponente sunt instruciunile de tip generate. Acestea permit selecia sau replicarea unor secvene de cod n faza premergtoare simulrii (faza de elaborare / elaboration time) n care toate modulele din design sunt conectate i referinele ierarhice sunt soluionate. Un bloc generate este nrmat de cuvintele cheie generate endgenerate. Trei tipuri de construcii sunt posibile: Generate-loop Generate-case Generate-condiionat Sintaxa pentru blocul generate este urmtoarea: generate //instrucii generate-loop //instrucii genetare-case //instrucii generate-condiionale //instrucii generate ncuibate endgenerate

Copyright @ Oana Boncalo & Alexandru Amaricai

Generate-loop este folosit pentru replicare de cod n faza de elaborare a ierarhiei de module n vederea simulrii. Este necesar declararea unei variabile de tip genvar care s fie folosit drept contor al for-ului din generate-loop. n continuare un exemplu pentru o poart xor word-gate. module xor_w ( input wire [7:0] in1,in2, output wire [7:0] x ); //declararea variabilei pentru generate-loop genvar i; //generate-loop-ul generate for (i=0; i<8; i=i+1) begin: multiplicare_xor xor my_xor (x[i], in1[i],in2[i]); end endgenerate endmodule n faza de elaborare a ierarhiei de module corpul for-ului este replicat pentru fiecare iteraie, astfel se obine: xor multiplicare_xor[0].my_xor (x[0], in1[0],in2[0]); xor multiplicare_xor[1].my_xor (x[1], in1[1],in2[1]); xor multiplicare_xor[2].my_xor (x[2], in1[2],in2[2]); xor multiplicare_xor[7].my_xor (x[7], in1[7],in2[7]); Trebuie remarcat obligativitatea etichetei de bloc multiplicare_xor, necesar pentru referenierea fiecrei instane de xor local generate-loop-ului. Exist i posibilitatea realizrii unei selecii n faza de elaborare, prin testarea unei condiii statice (depinde exclusiv de evaluarea unor constante i/sau parametri). Similar se poate folosi i o construcie de tip case pentru a realiza o selecie condiionat multipl. Dac modificm exemplul anterior, astfel nct primii 4 bii sunt rezultatul unui xor, iar urmtorii ai unui and logic, codul Verilog HDL se modific astfel :

Copyright @ Oana Boncalo & Alexandru Amaricai

genvar i; generate for (i=0; i<8; i=i+1) begin: multiplicare_xor if (i<4) xor my_xor (x[i], in1[i],in2[i]); else and my_and (x[i], in1[i],in2[i]); end endgenerate 2.7. Funcii i task-uri Verilog HDL Verilog HDL permite mpachetarea codului care se repet n task-uri i funcii. Task-urile prezint urmtoarele caracteristici: pot avea zero, unul sau mai multe argumente, care se transmit prin valoare; n interiorul acestora pot exista instruciuni de control a timpului de tip ntrziere (delay); poate apela alte task-uri i/sau funcii; seamn ca i comportament cu procedurile; Sintaxa pentru un task este urmtoarea: task [automatic] identificator_task; [declararaii_argumente_de_intrare] [declaraii_variabile_locale] instruciuni_procedurale; endtask Trebuie menionat c un task poate accesa orice variabil/semnal al modulului n cadrul cruia a fost definit. Foarte important este cuvntul cheie automatic. Dac acesta este prezent, variabilele locale task-ului sunt alocate dinamic (fiecare apel de task are propriul set de variabile locale). n caz contrar, ele sunt statice. Trebuie inut cont de caracterul concurent al execuiei componentelor/blocurilor n Verilog HDL. Acest fapt, poate conduce la situaia n care un task este concurent din mai multe pri ale codului. Fiecare task beneficiaz de

Copyright @ Oana Boncalo & Alexandru Amaricai

propriul control n situaia execuiei paralele. Dac este static, toate aceste apeluri folosesc aceleai variabile locale. Apelul unui task se realizeaz astfel: identificator_task [(expresie_1, expresie_2, , expresie_n)];

Funciile Verilog HDL se declar n cadrul unui modul i pot fi apelate din diferite pri ale codului. Prezint urmtoarele deosebiri fa de anterior prezentatele task-uri: pot returna o valoare, de tip real, integer, time, real i realtime; nu pot conine ntrzieri; pot apela alte funcii, dar nu pot apela alte task-uri; trebuie s aib cel puin un argument; Sintaxa pentru o funcie este urmtoarea: function [automatic] [signed] [range_of_type] identificator_funcie; [declararaii_argumente_de_intrare] [declaraii_variabile_locale] instruciuni_procedurale; endfunction Cuvntul cheie automatic are aceeai semnificaie ca i n cazul task-urilor. De asemenea o funcie declarat cu automatic poate fi recursiv. Un exemplu de funcie care calculeaz paritatea este prezentat n cele ce urmeaz. module exemplu ( input wire [7:0] my_byte, output wire [8:0] paritate_ext_byte); function automatic paritate; input [7:0] data; //input declaration reg p_bit; //local declaration integer i; //local declaration 2.8. Lucrul cu fiiere begin //begin end block statement p_bit=1b0; for (i=0; i<8; i=i+1) if (data[i]) p_bit=p_bit ^ data[i]; paritate=p_bit; end endfunction assign paritate_ext_byte={my_byte, paritate(my_byte)}; endmodule

Copyright @ Oana Boncalo & Alexandru Amaricai

2.9. Task-urile i funciile sistem Verilog HDL pune la dispoziia programatorului o sumedenie de task-uri i funcii sistem. n cele ce urmez vom prezenta cteva dintre cele mai uzitate task-uri i funcii predefinite n limbaj. Pentru afiare la ieirea standard: $display, $write. Formatul de afiare : %h hexazecimal; %d zecimal; %o octal; %b binar; %c ascii; %t timp; %m numele din cadrul ierarhiei de module; %s ir de caractere; %u binar, cu 2 valori binare ; %z binar, cu 4 valori binare ; $display (Timpul de simulare: %t, $time); n exemplul anterior este folosit funcia sistem $time, care returneaz timpul de simulare. Pentru monotorizare: $monitor monotorizeaz lista de argumente continuu i afieaz mesajul redactat la sfritul pasului de timp n care unul sau mai multe semnale din list sau modificat. Prin sfritul pasului de timp se nelege momentul de timp la care toate evenimentele aferente pasului respectiv s-au finalizat. initial $monitor (Timp: %t, semnal tact: %b valoare ieire: %b, $time,clk,out1); Alte task-uri nrudite: $monitoron activeaz monitorul $monitoroff dezactiveaz monitorul

Copyright @ Oana Boncalo & Alexandru Amaricai

Pentru intrare/ieire: Pentru deschiderea respectiv nchiderea fiierelor: $fopen deschide un fiier i returneaz o valoare de tip ntreg care este handlerul fiierului respectiv ; integer handler_fiier=$fopen(nume_fiier, mod); $fclose nchide un fiier; $fclose(handler_fiier); Un fiier poate fi deschis pentru: citire (mod este r, rb) , scriere (mod este w, wb), adugare (mod este a, ab), scriere i citire (mod este w+, w+b, wb+, r+, r+b, rb+), adugare i citire (a+, a+b, ab+). b se refer la fiiere binare. Pentru scriere ntr-un fiier: $fdisplay, $fwrite, $fstrobe, $fmonitor, $fflush Lista de argumente pentru aceste task-uri este de forma: $nume_task (handler _fiier,mesaj i specificatori format, list_argumente); Exemplu scriere n fiierul [Link]: integer h_fisier; initial begin h_fisier=fopen([Link], w) ; // alte instr. $fwrite(h_fisier, semnalul are valoare %b, semnalul _meu); $fclose(h_fisier); end Pentru citire dintr-un fiier: Dou task-uri sistem sunt folosite pentru a citi datele ntr-o memorie.

Copyright @ Oana Boncalo & Alexandru Amaricai

$readmemb - ncarc coninutul unui fiier cu valori reprezentate n binar ntr-o memorie (seciunea 2.2.3 ofer o descriere a unei memorii Verilog HDL). $readmemh ncarc coninutul unui fiier cu valori reprezentate n hexazecimal ntr-o memorie (seciunea 2.2.3 ofer o descriere a unei memorii Verilog HDL). Fiierul text conine numere (binare sau hexazecimale) separate prin spaii albe, cu eventuale comentarii. Prima dat se ncarc valori la adresa cea mai din stnga a indicilor memoriei. Opional se poate specifica un interval de adrese (de la adresa adr1, la adresa adr2, adr1 i adr2 sunt valori care se ncadreaz n plaja de indexi a memoriei) care sunt ncrcate n memorie. n acest caz primul numr citit din fiier este ncrcat la prima adres dat (adr1). Sintaxa este de tipul: $readmemb (nume_fiier,nume_memorie,adr1,adr2); Alte task-uri sistem pentru citirea din fisier: $fread citete informaie binar din fiier; $fgets citete o linie din fiier; $unget insereaz caracter napoi n fiier; $frewind poziioneaz cursor la nceputul fiierului; $fseek poziioneaz cursor la poziia indicat de offset; $fscanf, $ftell, $ferror Pentru controlul simulrii:

$finish determin terminarea simulrii; $stop determin suspendarea simulrii; Pentru determinarea timpului de simulare exprimat ca un multiplu de unitatea de timp a modului: $time exprimat ca ntreg pe 64 de bii; $stime exprimat ca ntreg pe 32 de bii; $realtime exprimat ca numr real; De conversie i formatare:

Conversie: $rtoi(numr_real) convertete un numr real ntr-un ntreg prin trunchiere;

Copyright @ Oana Boncalo & Alexandru Amaricai

$itor(numr_ntreg) convertete un numr ntreg ntr-un numr real; $realtobits(numr_real) reprezentarea pe 64 de bii n format IEEE 754 de simpl precizie; $bitstoreal(ir_bii) inversul lui realtobits; $signed(valoare) interpretarea valorii ca numr cu semn; $usigned(valoare) interpretarea valorii ca numr fr semn; Formatare ir: $swrite, $sformat, $sscanf Altele:

$random, $printtimescale, $timeformat,

3. Verificarea i simularea unui design Verilog HDL


3.1. Modelarea ntrzierilor Exist mai multe modaliti de specificare a ntrzierilor n Verilog HDL, ele sunt exemplificate n cele ce urmeaz: ntrziere prin declaraia semnalului wire #15 semnal_ntrziat; Indic faptul c orice modificare a driver-ului semnalului se produce cu o ntrziere de 15 uniti de timp. ntrziere prin atribuirea continu assign #15 semnal_ntrziat = a & b; Indic faptul c orice modificare a driver-ului semnalului (n acest caz expresia din partea dreapt care este evaluat continuu) este ntrziat cu 15 uniti de timp. control de tip ntrziere pentru descrierea comportamental #ntrziere instruciune _procedural Semnificaia este: ateapt ntrziere uniti de tip nainte de a executa instruciunea.

Copyright @ Oana Boncalo & Alexandru Amaricai

Dac ntrzierea este calculat ntr-o expresie atunci aceasta trebuie scris ntre paranteze rotunde. #(2 * STALL) ; //ateapt 2 * STALL uniti de timp #(2+3) out1= a ^ b ^ cin ; //instruciunea este executat dup ce se introduce n //o ntrziere de 5 uniti de timp

control de tip ntrzierea din cadrul instruciunii (intra-statement delay) out1= #(2+3) a ^ b ^ cin ; //expresia din dreapta este evaluat, apoi este introdus //ntrzierea, urmat apoi de atribuirea propriuzis Comportamentul este identic cu: begin aux= a ^ b ^ cin ; #(2+3) out1=aux ; end De asemenea exist o form de control al ntrzierilor pentru evenimente care se repet. repeat (expresie) @ (expresia_aferent_evenimentului) Un exemplu n acest sens: rezultat= repeat (4) @ (posedge tact) a+b; Comportamentul este urmtorul: evalueaz expresie din dreapta; ateapt 4 fronturi cresctoare; atribuie valoarea calculat;

Din considerente de sincronizare sunt utile instruciunile de tipul: @ (posedge tact);

3.2. Modulul de test (testbench) Un testbench este n esen un modul folosit pentru verificarea funcionrii corecte a unui design. Acesta are trei sarcini mai importante: generarea sau ncrcarea dintr-un fiier a stimulilor de test (valorilor de intrare pentru verificare);

Copyright @ Oana Boncalo & Alexandru Amaricai

Aplicarea stimulilor modulului care este testat i preluarea rspunsurilor de la acesta; Compararea rspunsurilor cu valorile corecte sau salvarea acestora n vederea prelucrrii ulterioare.

Generarea stimulilor Generarea unei secvene de valori de intrare poate fi realizat cu ajutorul unei construcii de tip initial. initial begin //prima variant de stimuli pentru a testa o celul de nsumare a=1b0; b=1b1; cin=1b1; //dup 20 uniti de timp modific valoarea lui a #20 a=1b1; //dup 20 uniti de timp modific valoarea lui cin i a lui b #20 cin=1b0; b=1b0; end Pattern-urile repetitive se pot obine prin iniializare, urmat de o atribuire continu, sau o construcie de tip always. //initializare initial tact=1b0; //modificare continua assign #(PERIOADA/2) tact=~tact; // PERIOADA- constanta sau parametru modul Sau: //initializare initial tact=1b0; //modificare continua always #(PERIOADA/2) tact=~tact; // PERIOADA- constanta sau parametru modul

Copyright @ Oana Boncalo & Alexandru Amaricai

Pentru situaiile n care numrul de stimuli este mare i este baleiat un numr consistent de cazuri de test, iar testele trebuie refcute, este indicat ca acetia s fie salvai i mai apoi citii din fiier. Exemplul anterior cu celula FAC este reluat pentru aceast situaie: module test_FAC; parameter BITI=5, TEST_NR=3; //variabil de memorie pentru stocarea stimulilor //dimensiunea mem. = nr de cazuri de test //dimensiune cuvnt= nr bii pentru simulii afereni unui caz de test reg [BITI-1:0] memorie [0: TEST_NR-1]; //conexiunile dintre blocul de generare stimuli i instana de celul de nsumare FAC reg a,b,cin ; wire s,cout ; //valorile care sunt ateptate reg s_c,cout_c; //variabil pentru for-ul din blocul initial integer j; //generare stimuli initial begin //citete stimuli n memorie $readmemb([Link],memorie); //aplic stimuli, ateapt un interval rspunsul i verific rezultat for (j=0; j< TEST_NR; j=j+1) begin //aplic stimuli {a,b,cin, s_c, cout_c}=memorie[j] ; // ateapt un interval rspunsul de la celula de nsumare #20; // verific rezultat if ((s!==s_c) || (cout!==cout_c)) $display(Eroare- suma: %b, cout: %b la vectorul %b,s,cout,memorie[j]); end end //instan circuit testat adder_cell_struct uadder_cell(a,b,cin,s,cout); endmodule

Copyright @ Oana Boncalo & Alexandru Amaricai

Fiierul [Link] conine urmtoarele informaii:

00 0 0 0 01 0 1 0 01 1 0 1 10 1 0 1 11 1 1 1
a b cin s cout

Pentru design-uri care au rspunsuri greu de verificat, sau care necesit o analiz ulterioar, acestea pot fi salvate n fiier.

4. Bibliografie
1. IEEE Standard Verilog Hardware Description Language IEEE Std 1364-2001 2. S. Kilts Advanced FPGA Design: Architecture, Implementation and Optimization John Willey&Sons, 2007 3. D. Thomas, P. Moorby The Verilog Hardware Description Language, Fifth Edition Kluver Academics, 2002 4. J. Bhasker A Verilog HDL Primer, Third Edition Star Galaxy Press, 2005 5. S. Brown, Z. Vranesic Fundemantels of Digital Logic with Verilog Design McGraw-Hill, 2007 6. MIT Introductory Digital Systems Laboratory [Link] -

Copyright @ Oana Boncalo & Alexandru Amaricai

S-ar putea să vă placă și