Sunteți pe pagina 1din 54

2.

LIMBAJULVERILOGHDL
n acest capitol se va prezenta limajul de descriere arhitectural Verilog HDL, utilizat n scopul
proiectrii,implementrii,simulriiisintezeilogiceaunuisistemnumeric.
Astfel,vorfireliefateurmtoareleaspecte:
- Istoric,caracteristicigeneraleifuncionale,structuraifluxuldeproiectare;
- Sintaxaisemantica;
- Operatori,construcii/instruciuni,taskuriifuncii;
- Sincronizareimodelare,programedetest.

2.1.INTRODUCERE
2.1.1.ISTORIC
Verilog a fost dezvoltat n momentul cnd proiectanii cutau unelte (toolsuri) software pentru a
combina diferitele niveluri de simulare. La nceputul anilor 1980, existau simulatoare la nivel de
comutare, simulatoare la nivel de pori i simulatoare funcionale. Mai mult, majoritatea limbajelor
tradiionale de programare erausunt n esen secveniale i astfel semantica lor era o provocare
pentrumodelareaconcureneidincadrulcircuitelordigitale.
LimbajulVerilogafostinventatdePhilMorbydelaAutomatedIntegratedDesignSzstems(redenumit
apoi Gateway Design Automation GDA) n anul 1984 ca un limbaj de modelare arhitectural
(hardware) iar n anul urmtor a fost scris primul simulator, extins substanial pn n 1987 i
redenumit VerilogXL. Verilog a mprumutat mult de la limbajele existente, ca de exemplu: aspectele
referitoarelaconcurendelaModulaiSimula,sintaxadelaCimetodeledecombinareanivelurilor
de abstractizare de la HiLo (Brunnel University, UK). Limbajul nu era standardizat i a suferit multe
modificripnn1990.
nanul1989,GDA(precumidrepturileasupraVerilogiVerilogXL)afostcumpratdectreCadence
careapusVerilogndomeniulpublicn1990.Acestlucruapermisialtorcompanii(precumSynopsys)
sdezvoltetoolsurialternativelaCadence,ceeaceapermisutilizatorilorsadoptelimbajulpescar
larg.
27

ns,nanul1981,DepartamentulAmericanalAprriiasponsorizatunworkshoppetemalimbajelor
dedescriere hardwarecaparteaprogramuluiVHSIC(VeryHighSpeedIntegratedCircuits)dincare
saunscutspecificaiilepentruVHDL(VhsicHDL)nanul1983.Dezvoltatcurestriciipnnanul1985,
VHDLadevenitstandardIEEE1076nanul1987.Acestlucruafcutca,nanul1990,Verilogsdevin
un limbaj nchis. De aceea, Cadence a organizat Open Verilog International (OVI) i a furnizat n anul
1991documentaiapentruVerilogHDL.nanul1992,OVI(cunoscutacumcaAccellera)adusomunc
laborioasdembuntireamanualuluidereferinalimbajului(LRMLanguageReferenceManual)
i,nanul1994,grupuldelucruIEEE1364atransformatOVILRMnstandardIEEE.
Astfel, n 1995, VerilogHDL a devenit standard comercial IEEE1364, fiind referit ca Verilog95.
Standardul combina att sintaxa limbajului Verilog, ct i PLI (Programming Language Interface) ntr
unsingurvolum.
nurmtoriianiaufostadugatenoicaracteristiciiarnouaversiunealimbajuluiadevenitstandardIEEE
13642001 sau Verilog2001. Prin muntiri ulterioare, printrun proiect separat System Verilog,
limbajul a devenit stahdard IEEE 13642005 sau Verilog2005. Prin includerea suportului de modelare
analogice i mixte, limbajul a fost referit ca VerilogAMS. n anul 2005, de ctre CoDesign Automation
Inc, sa dezvoltat un limbaj de verificare de nivel nalt numit Superlog; acest limbaj a fost donat ctre
Accellera,carelatransformatnSystemVerilog,devenindstandardIEEEP18002005completaliniatcu
Verilog2005.
2.1.2.CARACTERISTICIISTRUCTURAUNUIPROGRAMVERILOGHDL
Verilog este un limbaj de descriere hardware (HDL) utilizat pentru a modela sisteme numerice.
Limbajul suport proiectare, verificare i implementare a circuitelor analogice, digitale i mixte pe
diferitenivelurideabstractizare.
Limbajul are o sintax similar cu cea a limbajului C, ceea ce l face familiar n utilizare. Astfel, ca i
limbajul C, Verilog are un preprocesor, construcii de control ca if, while, etc, rutine de afiare i
operatori similare lui C. El difer ns fundamental de C n anumite aspecte, ca de exemplu: utilizeaz
begin/end pentru delimitarea blocurilor de cod, utilizeaz constante definite pe dimensiuni de bii, nu
are structuri, pointeri i subrutine recursive (totui, System Verilog include acum aceste capabiliti) i
lucreazcuconceptuldetimp,importantpentrusincronizare.
28

Limbajul difer de un limbaj convenional n sensul c execuia instruciunilor nu este strict liniar. Un
proiectVerilogconstntroierarhiedemodule.Modulelesuntdefinitecaunsetdeporturideintrare,
ieire i bidirecionale. Intern, modulele conin fire de legtur i registre. Relaia dintre porturi, fire i
registre este definit prin construcii concurente i secveniale care stabilesc comprtamentul modului.
Construciile secveniale sunt plasate n interiorul blocurilor i sunt executate n ordine secvenial n
cadrul blocului. Toate construciile concurente i blocurile din proiect sunt executate n paralel. Un
modulpoateconineiunasaumaimulteinstanealealtormoduledefinitenierarhie.
Unsubsetdeconstruciidinlimbajsuntsintetizabile.Dacamoduleledinproiectconinnumaiconstrucii
sintetizabile, programul Verilog poate fi utilizat pentru a sintetiza proiectul ntro list de legturi care
descriecomponenteledebaziconexiunilecevorfiimplementatehardware.Listadelegturipoate
fiapoitransformatntroformcaredescriecelulestandardaleunuicircuitintegrat (cumesteASIC
Application Specific Integrated Circuit) sau un flux de bii (bitstream) pentru un dispozitiv logic
programabil(cumesteFPGAFieldProgrammableGateArrays).
ActualmenteexistoconcurenputernicntrelimbajeleVHDLiVerilog,ceeaceimpuneprezentarea
uneiscurtecomparaiintreceledoulimbaje.
OprimadiferenntrelimbajeestesintaxadupcumVerilogestebazatpeCiarVHDLestebazatpe
ADA:
Verilog este uor de invat pentru ca C este mai simplu. El produce astfel mai mult cod
compact, att pentru citire, ct i pentru scriere. Mai mult, proiectanii )care deja tiu C
comparativcuceicaretiuADA)lnvaifactrainingmaiuor.
VHDL este foarte puternic tipizat i permite programatorilor si defineasc propriile lor tipuri
dei,npracticseutilizeaztipuriledebazicele definitedeIEEE.Beneficiulconstnfaptul
cverificareatipuluiserealizeazdectrecompilator,ceeacereduceerorile;dezavantajuleste
cschimbareatipuluitrebuiefcutexplicit.
VerilogaredouavantajeimportantefadeVHDL:
Permitemodelarealaniveldecomutare.
Se asigur faptul c toate semnalele sunt iniializate ca nedefinite ceea ce asigur c toi
proiectaniivorfurnizalogicanecesardeiniializareaproiectelorlor(tipuriledebazdinVHDL
iniializeazla0).
29

VHDLaredouavantajeimportantefadeVerilog:
Sepermitinstaniericondiionaledemodule(if/for...generate)
Sefurnizeazunmecanismsimplu(construciaconfigure)carepermiteproiectantuluiscomute
uorntredescrieridiferitedemoduleparticulare.
Alegerea ntre cele dou limbaje nu se poate face ns n mod izolat. Trebuie inclui i ali factori n
mediuldeproiectare,cumarfivitezadesimulare,uurinacucaresepoatetestaidepanacodul,etc.
VerilogincludePLIcarepermiteaccesuldinamiclastructurilededate,ceeaceoferprogramatorilorun
grad de control mai mare asupra simulrii iar proiectanilor posibilitatea dezvoltrii mediului de
proiectare prinincludereadeinterfee graficesaurutine de tip Cpentruacalculantrzierilenanaliza
sincronizrii.Pragmatic,unproiectantarfibinesletiepeamndou.
Stilurideproiectare
Verilog, la fel ca orice alt limbaj de descriere hardware, permite realizarea unui proiect n ambele
metodologii:bottomup(dejosnsus)sautopdown(desusnjos):
Proiectareabottomupestemetodatradiional.Fiecareproiectesterealizatlaniveldepori
utiliznd pori standard, ceea ce este greu de realizat pentru noile structuri numerice care au
milioanedetranzistoare.Proiecteleastfelrealizatesuntgrupatelamacronivel.
nmetodologiabottomup,maiintiseidentificblocurileconstructive,caresuntdisponibile.
ncontinuareseconstruiesccelulemaimariutilizndacesteblocuri.Procesulcontinupnse
ajungelasintezabloculuidenivelsuperior.

Figura2.1.Ierarhiadeblocuribottomup
Proiectareatopdownestemetodaactualprincaresepleacdelaspecificaiiledesistemi
se detaliaz n jos pn la componentele de sistem. Aceast metod permite testarea mai
devreme, schimbarea uoar a tehnologiilor, proiectarea structurat a sistemelor numerice i
30

multe ale avantaje. Este ns sificil de urmrit un proiect pur topdown, de aceea multe
proiectecomplexembinambelemetode.
n cazul topdown se definete un bloc de nivel superior, identificnd apoi subblocurile
necesare pentru construcia acestuia. n continuare subblocurile se divid pn se ajunge la
celulefrunze,carenumaipotfidescompusenelementemaisimple.

Figura2.2.Ierarhiadeblocuritopdown
StructuraunuiprogramVerilog
Limbajul Verilog descrie un sistem numeric ca un set de module. Fiecare dintre aceste module are o
interfacualtemodule,pentruaspecificamanierancaresuntinterconectate.Deregula,unmodulse
plaseazntrunfiier,frcaaceastasfieocerinobligatorie.Moduleleopereazconcurent.
ngeneral,existunmodulpenivelulcelmainalt,carespecificunsistemnchisceconine,attdatele
de test, ct i modelele/modulele hardware. Modulul de pe nivelul cel mai nalt invoc instane ale
celorlalte module; acest modul poate fi mprit ntr+un modul de test i unul sau mai multe module
principale,careconincelelaltesubmodule.
Modulele reprezint pri hardware, care pot fi de la simple pori pn la sisteme complete, ca de
exempluunmicroprocesor.Elepotfispecificate,fiecomportamental,fiestructural(sauocombinaiea
celor dou). O specificare comportamental definete comportarea unui sistem numeric (modul)
folosindconstruciilelimbajelordeprogramaretradiionale,deexemplu:ifiinstruciunideatribuire.O
specificare structural exprim comportarea unui sistem numeric (modul) ca o conectare ierarhic de
submodule.
Labazaierarhieicomponenteletrebuiesfieprimitivesausfiespecificatecomportamental.
PrimitiveleVerilogincludattpori,ctitranzistoaredetrecere(comutatoare).
31

Structuraunuiprogramesteurmatoarea:
Moduldetest;
Modul(saumodule)toplevel;
Submodul1;

Submoduln;
Fie ca prim exemplu de modul Verilog programul care afieaz Hello World (dat ca exemplu n toate
limbajeledeprogramare):
//-----------------------------------------------------
// Acesta este primul program Verilog
// Functia : Acest modul va afisa 'Hello World
//----
module hello_world ;
-------------------------------------------------

initial begin // inceput de bloc de initializare
$display ("Hello World"); // afisare
#10 $finish; // terminare afisare
end // sfarsit de bloc

endmodule // sfarsit de modul

2.1.3.REPREZENTAREACIRCUITELORISITEMELORNUMERICENIVELURIDEABSTRACTIZAREVERILOG
Printroabordareierarhic,unsistemhardwarecomplexpoatefidescrissubaspectcomportamental,
structural,fiziciabstractpemaimulteniveluri:
Modalitide Comportamental Structural Fizic Abstract
descriere:

Niveluriierarhice: Aplicaii,sistemul Calculator, Modul, Arhitectur,


deoperare procesor plachet, algoritm,
circuit modul/bloc
funcional
Programe Sumatoare, Celule Logic,
pori,registre comutaie
Subrutine, Tranzistoare Tranzistoare Circuit
instruciuni
Abordarea pe niveluri de abstractizare ajut la alegerea unui stil de proiectare, n funcie de
complexitateastructurilornumerice.ncontinuaresedefinescacesteniveluri:
32

1. Arhitectura, nivelul cel mai de sus, se refer la aspectele funcionale ale sistemului. La acest
nivelexisturmtoareletreisubniveluri:
arhitecturasistemului:subnivelulcelmainalt,careconstituieinterfaacuutilzatorul;
organizarea sistemului: structurarea sistemului n uniti funcionale, interconectarea lor,
fluxuldeinformaiidintreele;
microarhitectura: structura unitilor funcionale, care realizeaz interfaa dintre
hardwareifirmware.
2. Algoritmulmapeaznivelularhitecturallanivelullogic.
3. Modulul/blocul funcional este un nivel tipic de transfer ntre registre (RTL Register Transfer
Level), care caracterizeaz n termeni ca registre, ntrzieri, numrtoare, ceas, memorie,
circuitecombinaionaleisecveniale.
4. Logicareprezintnivelulcaredescriesistemul,utilizndporilogice.
5. Comutaiaestenivelulcareanalizeazcomutareasemnalelordepeunnivellogicpealtul.
6. Circuitul constituie nivelul abstract cel mai sczut, care reprezint sistemul la nivel de circuite
electronice.
Iniial descrierea structurilor hardware a fost realizat la nivelul transferurilor ntre registre (sunt
cunoscute limbaje ca APL (A Programming Language) sau AHPL (A Hardware Programming
Language));elepotservintromaimicmsurilanivelulproiectriilogice.
ncepndcuanii1980auaprutlimbajepentrudescrierealanivelarhitectural,cumarfiS*MsauADL.
Pentruaevitainconvenientulmajordedescriereastructurilorhardware,utilizndmaimultelimbaje
adecvatediferitelorniveluriprezentatemaisus,sacutatdezvoltarealimbajelorpentruaobineunele
capabilesneleagctmaimultenivelurideabstractizare,mergndpnlanivelullogic.
Primele dintre ele au fost MIMOLA i M, dar cele care reprezint la ora actual vrful n domeniul
proiectriiautomateastructurilorhardwaresuntVHDL(VeryHighSpeedIntegratedCicuitHardware
DescriptionLanguage)iVerilogHDL.
33

NivelurideabstractizareVerilog
Verilog suport proiectare pe diferite niveluri de abstractizare. Cele mai importante sunt nivelul
comportamental,nivelulRTL,nivelulstructuralsaupoartinivelulfizic.
Nivelulcomportamental
Nivelul comportamental descrie un sistem prin algoritmi concureni. Fiecare algoritm este el nsui
secvenial, ceea ce nseamn c el const dintrun set de instruciuni care se execut una dup
cealalt.Elementeleprincipalesuntfunciile,taskurileiblocurileinitialialways.
Exemplu:
primitive dEdgeFF_UDP (q, clk, d);
output q;
reg q;
input clk, d;
table
// clk d stare q
(01) 0 : ? : 0;
(01) 1 : ? : 1;
(0x) 1 : 1 : 1;
(0x) 0 : 0 : 0;
(?0) ? : ? : -;

endtable
? (??) : ? : -;
endprimitive
NivelulRTL
ProiectarealanivelRTLspecifictoatecaracteristicileunuicircuitprinoperaiiitransferuridedate
ntre registre. Se utilizeaz un semnal explicit de ceas. Proiectele RTL conin delimitri exacte de
ntrzieri: operaiile sunt planificate s apar la anumite momente de timp. O definiie modern a
coduluiRTLeste:OricecodcareestesintetizabilestenumitcodRTL.
Exemplu:
module geFF_RTL (q, clk, d); dEd
output q;
reg q;
input clk, d;

initial
q = 0;
always @(negedge clk)
#10 q = d;

endmodule
34

Nivelulpoart(structural)
Lanivelpoartlogic,caracteristicileunuisistemsuntdescriseprinsemnalelogiceintrzierilelor.
Toate semnalele pot avea doar valori logice de tipul 0, 1, X i Z. Operaiile uzuale sunt
predefinite ca primitive logice (pori AND, OR, NOT, etc). Utilizarea modelrii la nivel de poart
poatesnufieceamaibunideepentruoricenivelalproiectriilogice.Coduldenivelpoarteste
generat de tooluri precum cel de sintez iar lista de legturi generat este utilizat pentru
simularealaniveldepori.
Exemplu:
module dEdgeFF_gates(d,clk,q,q_bar);
input d,clk;
output q, q_bar;

wire n1,n2,n3,q_bar_n;
wire cn,dn,n4,n5,n6;

// primul latch
not (n1,d);

nand (n2,d,clk);
nand (n3,n1,clk);

nand (dn,q_bar_n,n2);
nand (q_bar_n,dn,n3);

// al doilea latch
not (cn,clk);
not (n4,dn);

nand (n5,dn,clk);
nand (n6,n4,clk);

nand (q,q_bar,n5);
nand (q_bar,q,n6);

endmodule
Nivelulfizic(altranzistoarelor)
Descrierea fizic furnizeaz informaii privind modul de construcie al unui circuit particular descris
din punct de vedere comportamental i structural; descrierea fizic este asociat cu descrierea la
nivel de mti tehnologice. Aceast descriere cuprinde mai multe niveluri de abstractizare: nivelul
modul(descrielimitelegeometriceexternepentrucircuit),unsetdesubmodule(librriideprimitive
fizice), nivelul porturilor (corespund unei conexiuni de intrare/ieire din descrierea structural a
35

componenteipentrucaresespecificpoziia,stratul,numeleilimea)iarlanivelulcelmaidejos
seaflapelriledetranzistoare,fireilaconexiuni.
ncontinuaresevaconsideradoarproiectarealanivelRTLicomportamental.
2.1.4.FLUXULDEPROIECTARE
FluxultipicdeproiectareaunuisistemnumericutilizndlimbajulVerilogpoatefireliefatastfel:

Proiectarelanivelnalt
Proiectarelanivelsczut
CodificareRTL
Verificarefuncional
Sintezlogic
Plasareirutare
Fabricare
Simularelaniveldepori
ValidarepostfabricarewaferdeSiliciu
Specificaiideproiectare

36

Specificaiideproiectare
Este etajul n care se definesc parametrii de proiectare sistem. Astfel, se specific scopul proiectrii,
moduriledefuncionare,tipurilededateifuncii,etc.nacestscopsepotfolosieditoaredetexte.
Proiectarealanivelnalt
Acesta este etajul n care se precizeaz blocurile funcionale ale sistemului de proiectat, intrrile i
ieirile n/din sistem, forme de und precum i modul de comunicare dintre blocurile funcionale. n
acestscopsepotfolosieditoaredetexteideformedeund.
Proiectarealanivelsczut
Proiectarea aceasta se mai numete i microproiectare i este faza n care proiectantul descrie
implementarea fiecrui bloc. Ea conine detalii despre maina de tranziii de stri i despre blocurile
funcionale. Este bine s se deseneze formele de und pentru diferitele interfari. La aceast faz se
pierdedestuldemulttimp.Sepotutilizaeditoaredetexteideformedeund.
CodificareaRTL
n aceast faz, microproiectarea este convertit n cod Verilog utiliznd constructorii sintetizabili ai
limbajului.SeutilizeazeditoareHDLseparatesauceledincadrultoolutilorfolositelaproiectare.
Verificareaisimularea
Aceast etap este procesul de verificare funcional la orice nivel de abstractizare. Se utilizeaz
simulatoareadecvate.PentruatestadaccodulRTLndeplinetecerinelefuncionaledinspecificaiile
deproiectare,trebuiessescrieprogramedetest(testbench)cucaresevaverificafuncionalcodul
RTL proiectat pe baza studiului formelor de und obinute n urma simulrii. Se pot utiliza
simulatoare/compilatoare separate sau incluse n diferite tooluri de proiectare, precum Modelsim,
ISEXilinx,Veriwell,Icarus,etc.Pentru averificasimulareantrzierilorpentru sincronizare (attlanivel
depori,ctilaniveldefire),dupfazadesintez,semairealizeazosimularelaniveldeporisauSDF
(StandardDelayFormat).
Sinteza
Esteprocesulprin caretooluriledesintez caXST,Ahdlsau Synplifyiau codulRTLi,inndcontde
tehnologie i constrngeri ca intrri, l mapeaz n primitive tehnologice la nivel de pori. Toolul de
37

sintez, dup mapare, realizeaz i o analiz minimal a ntrzierilor pentru a verifica cerinele de
sincronizare(nsdoarlaniveldepori,lanivelulfirelorsefacenfazadeplasareirutare).
Plasareairutarea
Listadelegturilaniveldeporigeneratdetooluldesintezesteluatiimportatntoolulde
plasare i rutare n format list de legturi Verilog. Mai nti toate porile i bistabilii sunt plasai iar
semnalele deceasiiniializaresuntrutate,dup carefiecare blocesterutatobinnduse caieireun
fiierGDSutilizatlafabricareacircuitelorASIC.
Validarepostfabricare
O dat ce circuitul este gata de fabricaie, este necesar ca el s fie pus n condiii de mediu real de
funcionare i testat nainte de a fi lansat pe pia. Aceasta deoarece viteza de simulare a RTL este
sczutiexistposibilitateagsiriiunorbugurilatestareawaferelordeSiliciu.
2.2.SINTAXAISEMANTICALIMBAJULUIVERILOGHDL
2.2.1.CONVENIILEXICALE
Sunt similare cu cele ale limbajului C. Verilog este un limbaj casesensitive n care toate cuvintele
cheiesuntculiteremici.
Spaiilibere(albe)
Spaiilealbepotconinecaractereprecumspaii(/bblank),caracteretab(/t),caracterelinienou
(/n),caracteresfritdelinie(CarriageReturn<CR>),sfritdeparagrafisfritdefiier(EOFEnd
OfFile).
Aceste caractere sunt ignorate cu excepia cnd servesc la separarea altor convenii sau n cadrul
irurilor.
Comentarii
Existdoumodurideaintroducecomentarii:
- Comentariipeosingurlinie,carencepcu//isfresccu<CR>
- Comentariipeliniimultiple,carencepcu/*isfresccu*/
38

Identificatori
Identificatoriisuntnumedatepentruunobiect,precumunregistru,ofunciesauunmodul,astfelnct
spoatfireferitdinalteprialedescrieriiRTL.
Identificatoriitrebuiesnceapcuuncaracteralfabeticsaucaracterulunderscore(_).Eipotconine
caractere alfabetice, caractere numerice, _ i $. De asemenea, ei pot avea o lungime de pn la 1024
caractere.
Verilog permite utilizarea oricrui alt caracter prin omiterea lui plasnd un caracter \ (backslash) la
nceputulidentificatoruluiiterminndnumeleluicuunspaiuliber.
Deexemplu:
module \1dEdge_FF (, \q~, \reset*, );

Valorilogice
nVerilogexisttreitipuridevalorilogice:
0zero,nivelsczutsaufals
1unu,nivelnaltsauadevrat
Zsauznaltimpedan(valoaretreistrisauflotant)
Xsauxnedefint,necunoscutsauneiniializat
Puterilogice
nVerilogexisturmtoereletipurideputerilogice(valorilogiceputerniccuplatelogicstrengths):
Nivelde
putere
Numevaloare
puterniccuplat
Mnemonic
specific
Afiare
mnemonic
7 Drivedealimentare supply0 supply1 Su0 Su1
6 Driveputerniccuplat strong0 strong1 St0 St1
5 Driveinut(pull) pull0 pull1 Pu0 Pu1
4 Capacitatemare Large La0 La1
3 Driveslabcuplat weak0 weak1 We0 We1
2 Capacitatemedie Medium Me0 Me1
1 Capacitatemic Small Sm0 Sm1
0 Impedannalt highz0 highz1 HiZ0 HiZ1
39

2.2.2.REPREZENTAREANUMERELOR
Sepotspecificaconstantenumericenformatzecimal,hexazecimal,octalsaubinar.Verilogsuportatt
numerecusemn,ctinumerefrsemn;oricenumrfrsemnulesteconsideratpozitivntimp
ce numerele precedate de sunt considerate negative cu semn. Numerele negative se reprezint n
codcomplementar.
Numerentregi
Sintaxaeste:
<mrime><baz><valoare>
Caracteristici:
- Numerelesuntcusemnsaufrsemn.ntremrime,bazivaloaresuntpermisespaii
- <baza> (opional) este baza de numeraie (binar, octal, zecimal sau hexazecimal). Ea este
predefinitcazecimalinuestecasesensitive
- <mrime>(opional)estenumruldebiidinntreg.ntregiifrsemnsuntpredefiniila32bii
- <valoare>nuestecasesensitiveiar?esteunaltmoddeareprezentavaloareaZ
Baza Simbol Valorilegale
Binar bsauB 0,1,x,X,z,Z,?,_
Octal osauO 07,x,X,z,Z,?,_
Zecimal dsauD 09,_
Hexazecimal hsauH 09,af,AF,x,X,z,Z,?,_

- Caracterul_(underscore)poatefipusoriundeninteriorulnumruluiiesteignorat
- Valorile sunt expandate de la dreapta la stnga (lsb (least signifiquant bit) spre msb (most
signifiquantbit))
- Cnd mrimea este mai mic dect valoarea, atunci biii cei mai semnificativi sunt trunchiai.
Cnd mrimea este mai mare dect valoarea, atunci biii cei mai semnificativi sunt setai la 0
dacvaloareaeste0sau1,laZsauXdacvaloareaesteZsauX
- Valorile0i1potfifolositecanumerepentrucnupotfiidentificatori
- Numerelepotfideclaratecaparametri
40

Numerereale
Sintaxaeste:
<valoare>.<valoare>(notaiazecimal)sau
<valoaremantis>E<valoareexponent>undeEnuestecasesensitive(notaiatiinific)
Caracteristici:
- Verilogsuportconstanteivariabilerealeiconvertetenumerelerealelantregiprinrotunjire
- NumerelerealenupotconineZsauXipotaveavaloridoardela0la9i_doarnvaloare
- Numerelerealesuntrotunjitelacelmaiapropiatntregcndsuntatribuitelaunntreg
2.2.3.MODULE;INSTANIERI,PARAMETRIZRIIIDENTIFICATORIIERARHICI
DefinireamodulelornVerilogHDL
Modulele sunt blocurile constructive ale proiectelor Verilog. Se poate crea un proiect ierarhic prin
instaniereamodulelornaltemodule.Unmodulesteinstaniatcndseutilizeazacestmodulnaltul,
peunnivelierarhicsuperior.
Sintaxaunuimodulesteurmtoarea:
Sintaxa
Conexiuneinternimplicit(prinordineaporturilor)
modulenume_modul(nume_port,nume_port,...);
componente_modul
endmodule
Conexiuneinternexplicit(prinnume)
modulenume_modul(.nume_port(nume_semnal),.nume_port(nume_semnal),...);
componente_modul
endmodule

41

Conexiuneainternimplicitconecteazportullaunfirinternsauunregistrucuacelai nume.
Ordineatrebuiessepotriveasccorect.Normal,nuesteoideebunsseconectezeporturile
implicitpentrucarputeacauzaproblemendepanare(deexemplulocalizareaunuiportcarea
cauzatoeroarelacompilare),cndoriceportesteadugatsauters.
Conexiunea intern explicit conecteaz portul la un semnal intern cu nume diferit sau la
semnaleinterneselectatepebiisaupeprisauconcatenate.
Numeletrebuiessepotriveasccumodululfrunziarordineanuesteimportant.
Componenteleunuimodulsunt:
- declaraii_porturi_modul
- declaraii_tipuridedate
- instanieri_module
- instanieri_primitive
- blocuri_procedurale
- atribuiri_continue
- definiii_taskuri
- definiii_funcii
- blocuri_specificate
Funcionalitateaunuimodulpoatefi:
- Comportamental (RTL): modelat cu constructori de blocuri procedurale sau atribuiri
continue
- Structural:modelatcaolistdelegturideinstanedemodulei/sauprimitive
- Combinat:comportamentalistructural
Definiiiledemodulenupotfimbricatensunmodulpoateinstaniaaltemodule.
Definiiiledemodulepotfiexprimateutilizndconstanteparametru.
Fiecareinstandemodulpoateredefiniparametriipentruafiunicipentruaceainstan.
Componenteleunuimodulpotapreanoriceordinedardeclaraiiledeporturiiceledetipuri
dedatetrebuiesaparnaintecaporturilesausemnalelesfiereferite.
Porturi
Porturile permit comunicarea ntre un modul i componentele sale. Toate modulele mai puin modulul
detestareauporturi.Porturilepotfiasociateprinordinesauprinnume.
42

Sintaxadedeclarareaporturiloresteurmtoarea:
Sintaxa
direcie_port[msb:lsb]nume_port,nume_port,...;

Direciaporturilorpoatefi:
- inputpentruscalarisauvectorideintrare
- outputpentruscalarisauvectorideieire
- inoutpentruscalarisauvectoribidiracionali
Valorile msb i lsb trebuie s fie ntregi, parametri ntregi sau o expresie care se rezum la o
constantntreag.
Se poate folosi att convenia littleendian (lsb este cel mai mic bit) ct i convenia big
endian(lsbestecelmaimarebit)
Dimensiuneamaximaunuiportpoatefilimitatdarnumaipuinde256bii
Ca o practic bun, se recomand declararea unui singur port de identificare pe linia program
pentruaputeaficomentat
Regulideconectareaporturilor:
- Intrrile: intern trebuie s fie ntotdeauna un tip de fir, extern pot fi conectate la o
variabildetipregistrusaufir
- Ieirile:internpotfidetipfirsauregistru,extern trebuiesfie conectate la ovariabil
detipregistru
- Porturile bidirecionale: intern i extern trebuie ntotdeauna s fie de tip fir i pot fi
conectatenumailaovariabildetipfir
- Potrivirea ca dimensiuni: este legal s se conecteze intern i extern porturi de
dimensiunidiferite;darateniectooluriledesintezpotraportaprobleme
- Porturineconectate:suntpermiseprinutilizareanotaiei,
- Fireletipuridedatesuntutilizatepentruaconectastructura;unastfeldefirestecerut
dacunsemnalpoatefidatntroconexiunestructural
Instaniereamodulelor
Sintaxapentruinstaniereesteurmtoarea:
43

Sintaxa
Conexiuniimpliciteprinordineaporturilor
nume_modulnume_instan[domeniu_tablou_instane](semnal,semnal,...);
Conexiuniexpliciteprinnumeleporturilor
nume_modulnume_instan[domeniu_tablou_instane](.nume_port(semnal),
(.nume_port(semnal),...);
Redefinireexplicitprinparametri
defparamcale_ierarhic.nume_parametru=valoare;
Redefinireimplicitprinparametri
nume_modul#(valoaresaunumeparametru)nume_instan(semnale);

Unmodulpoatefiinstaniatutilizndordineasaunumeleporturilor:
- Instaniereaprinordineaporturilorlisteazsemnaleleconectatelaelenaceeaiordine
canlistadeporturidindefinireamodulului
- Instaniereaprinnumeleporturilorlisteaznumeleportuluiisemnalulconectatlaeln
oriceordine
Nume_instan(cerut)esteutilizatpentruerealizainstanemultiplealeaceluiaimodulnmod
unicdintrunaltul.
Domeniu_tablou_instane (opional) instaniaz module multiple, fiecare instan fiind
conectatlabiiseparaiaiunuivector:
- Domeniul este specificat ca [lhi:rhi] (index stnga (lefthandindex) la index dreapta
(righthandindex))
- Dac dimensiunea pe bii a unui modul port dintrun tablou este aceeai cu cea a
semnalului conectat la el, semnalul complet este conectat la fiecare instan a
modulului port; daca dimensiunea difer, atunci fiecare instan de modul port este
conectat la o parte selectat a semnalului, cu cel mai puin semnificativ index de
instanconectatlaceamaipuinsemnificativparteaunuivectoritotaaprogresiv
ctrestnga
- Trebuiesexisteunnumrcorectdebinfiecaresemnalpentruaseconectalatoate
instanele(mrimeasemnaluluiimrimeaportuluitrebuiesfiemultiple)
44

Parametriidintrunmodulpotfiredefiniipentrufiecareinstan:
- Redefinirea explicit utilizeaz o construcie defparam cu numele ierarhic al
parametrului
- Redefinirea implicit utilizeaz jetonul # ca parte a instanierii modulului. Parametrii
trebuieredefiniinaceeaiordinencareaufostdeclaraiprinmodul
Numele cii ierarhice este dat de identificatorul modulului rdcin (toplevel) urmat de
idntificatorii instanelor modulului, separate prin puncte. Acest lucru este folositor atunci cnd
se dorete a se vedea semnalul dintrun modul frunz sau cnd se dorete forarea unei valori
nuntrulunuimodulintern.
2.2.4.PRIMITIVEPROGRAM
Primitive
Verilogareprimitiveincluse(builtin)cumsuntporile,poriledetransmisieicomutatoarele.Acestea
sunt utilizate rar n proiecte RTL, dar sunt utilizate n faza de postsintez pentru modelarea celulelor
ASIC/FPGA;acestecelulesuntapoiutilizatepentrusimularealaniveldepori,saucumsemainumete,
simulareaSDF(StandardDelayFormat).Deasemenea,formatuldeieireallisteidelegturidintoolul
desintez,careesteimportatntooluldeplasareiderutare,estetotlcuprimitiveVeriloglanivelde
pori.Sintaxadeutilizareaacestorprimitiveesteurmtoarea:
Poart Descriere Listdeterminale
and
or
xor
PoartI
PoartSAU
PoartSAUEXCLUSIV
(1ieire,1saumaimulteintrri)
nand
nor
xnor
PoartINU
PoartSAUNU
PoartSAUNUEXCLUSIV
(1ieire,1saumaimulteintrri)

Poartdetransmisie Descriere Listdeterminale


not
buf
Inversor
Tampon
(1saumaimulteieiri,1_intrare)
bufif0
bufif1
Tamponcutreistri(Low)
Tamponcutreistri(High)
(1ieire,1intrare,1control)
notif0
notif1
Inversorcutreistri(Low)
Inversorcutreistri(High)
(1ieire,1intrare,1control)
45

Comutatoare Descriere Listdeterminale


pmos
rpmos
PMOSunidirectional
PMOSrezistiv
(1ieire,1intrare,1control)
nmos
rnmos
NMOSunidirectional
NMOSrezistiv
(1ieire,1intrare,1control)
cmos
rcmos
CMOSunidirectional
CMOSrezistiv
(1ieire,1intrare,ncontrol,pcontrol)
tranif1
rtranif1
Tranzistorbidirecional(High)
Tranzistorrezistiv(High)
(2bidirecionale,1control)
tranif0
rtranif0
Tranzistorbidirecional(Low)
Tranzistorrezistiv(Low)
(2bidirecionale,1control)
tran
rtran
Tranzistordetrecerebidirecional
Tranzistordetrecererezistiv
(2bidirecionale)
pullup
pulldown
Rezistorlasurs
Rezistorlamas
(1ieire)

Instaniereaprimitivelor
Sintaxadeinstaniereesteurmtoarea:
Sintaxprimitiv
tip_poart(drive_strength)#(ntrziere)nume_instan[domeniu_instan_tablou](terminal,
terminal,...);
tip_comutator#(ntrziere)nume_instan[domeniu_instan_tablou](terminal,terminal,...);

iarsintaxantrzierilorprimitiveloreste:
Sintaxntrziereprimitiv
#ntrziereor#(ntrziere)
ntrzieresingularpentrutoatetranziiiledeieire
#(ntrziere,ntrziere)
ntrzieriseparatepentrutranziii(rising,falling)
#(ntrziere,ntrziere,ntrziere)
ntrzieriseparatepentrutranziii(rising,falling,turnoff)
#(ntrziere_minim:ntrziere_tipic:ntrziere_maxim)
Domeniudentrzieridelaminimumlamaximumpentrutoatetranziiile
46

#(ntrziere_minim:ntrziere_tipic:ntrziere_maxim,
ntrziere_minim:ntrziere_tipic:ntrziere_maxim)
Domeniudentrzieridelaminimumlamaximumpentrutranziii(rising,falling)
#(ntrziere_minim:ntrziere_tipic:ntrziere_maxim,
ntrziere_minim:ntrziere_tipic:ntrziere_maxim,
ntrziere_minim:ntrziere_tipic:ntrziere_maxim)
Domeniudentrzieridelaminimumlamaximumpentrutranziii(rising,falling,turnoff)

unde:
- ntrziereariseesteasociattranziieiieiriiporiin1din0,x,z
- ntrziereafallesteasociattranziieiieiriiporiin0din1,x,z
- ntrziereaturnoffesteasociattranziieiieiriiporiinzdin0,1,x
- ntrzierea (opional) reprezint timpul de propagare prin primitiv i este predefinit la
zero;poateaveavalorintregisaureale
- Nume_instan (opional) poate fi utilizat pentru a referi primitive specifice n toolurile de
depanare,scheme,etc
- Domeniu_instan_tablou (opional) instaniaz primitive multiple, fiecare instan fiind
conectat la bii separai ai unui vector, unde semnalele vector trebuie s aib aceeai
dimensiune cu cea a tabloului iar semnalele scalare sunt conectate la toate instanele din
tablou;domeniulestespecificatca[lhi:rhi]lafelcalainstaniereamodulelor
PrimitiveDefinitedeUtilizator
CumprimitiveleinclusenVerilogsuntnspuine,dacestenevoiedeprimitivemaicomplexeatuncise
furnizeazUDP(UserDefinedPrimitivesprimitivedefinitedeutilizator).
UDPpotmodelalogiccombinaionalisecvenialipotincludentrzieri.Eletrebuiedefinitenafara
corpuluimodule...endmodule.
SintaxanUDPesteurmtoarea:
primitivenume_primitiv(porturi/terminale);
declaraii_primitive
construcii_initial...
tabel_definiie
endprimitive
unde:
47

- nume_primitiv:identificator
- declaraii_UDP: declaraii_ieiri_UDP, declaraii_registre pentru ieiri (numai pentru UDP
secveniale),declaraii_intrri_UDP;
- construcii initial (opional): stabilesc valoarea iniial (1b0, 1b1, 1bx, 1, 0) a terminalelor de
ieireprinatrinuireauneivaloriliteralepeunsingurbitunuiregistruterminaldeieire;valoarea
predefinitestex.
- tabela_definiie a funcionrii: descrie funcionalitatea primitive, att combinaional, ct i
secvenialiarestructuratableintrri_tabel...endtable;
CaracteristicileUDP:
RegulidefolosireaporturilornUDP:
- O UDP poate conine numai o ieire ipn la 9 intrri (UDP secveniale) sau 10 intrri
(UDP combinaionale); portul de ieire trebuie s fie primul port urmat de una sau mai
multeporturideintrare
- Toate porturile UDP sunt scalari; porturile vectori nu sunt permise; UDP nu pot avea
porturibidirecionale
- TerminaluldeieireauneiUDPsecvenialecereodeclaraiesuplimentarcatipregistru
- Este ilegal s se declare un registru pentru un terminal de ieire a unei UDP
combinaionale
Fiecare linie dintrtabel este o condiie; cnd o intrare se schimb, condiia de intrare este
marcatiieireaesteevaluatpentruareflectanouaschimbareaintrrii
UDPutilizeazsimbolurispecialepentruadescriefunciicafrontcrector,nuconteaz.a:
Simbol Interpretare Explicaie
0sau1sauxsauX 0sau1sauxsauX 0,1saunecunoscutpeintraresauieire
? 0sau1saux Intrareapoatefi0sau1saux
bsauB 0sau1 Intrareapoatefi0sau1
fsauF (10) Frontdescresctorpeointrare
rsauR (01) Frontcresctorpeointrare
psauP (01)sau(0x)sau(x1)sau(1z)sau(z1) Frontpozitivincluzndxiz
nsauN (10)sau(1x)sau(x0)sau(0z)sau(z0) Frontnegativincluzndxiz
* (??) Toatetranziiileposibilepeintrri
Nicioschimbare
Nicioschimbarelaieire(numaipentru
UDPsecveniale)
48

UDPcombinaionale
Ieireaestedeterminatcaofunciedeintrareacurent.Oridecteoriointrareischimbvaloarea,
UDP este evaluat i unul dintre rndurile tabelei de stare este marcat. Ieirea strii este setat la
valoareaindicatprinacelrnd.Acestlucruestesimilarconstruciilordecondiie:fiecareliniedintabel
esteocondiie.UDPcombinaionaleauuncmppentruintrriiunulpentruieire,caresuntseparate
prin simbolul:. Fiecare rnd al tabelei este terminat prin simbolul ;. Ordinea intrrilor n descrierea
tabeleidestaretrebuiescorespundcuordineaintrrilordinlistadeporturidinantetuldedefinirea
UDP. Nu are legtur cu ordinea de declarare a intrrilor. Intrrile trebuie separate unele de altele
printrunspaiuliber.
Fiecare rnd din tabel definete ieirea pentru combinaie particular de stri de intrare. Dac toate
intrrilesuntspecificatecax,atunciieireatrebuiespecificatcax.Toatecombinaiilecarenusunt
specificateexplicitrezultnstareapredefinitdeieirecax.
Esteilegalsaexisteaceeaicombinaiedeintrri,specificatpentrudiferiteieiri.
UDPsecvenialesenzitivepenivel
Comportarea este specificat la fel ca mai sus, cu excepia faptului c ieirea este declarat ca tip
registruiexistuncmpsuplimentarnfiecareintrareatabelei,carereprezintstareacurentaUDP.
Ieirea indic faptul c exist o stare intern I are aceeaI valoare cu ea. Cmpul suplimentar este
separatprinsimbolul:ntrecmpulpentruintrriicelpentruieire.
UDPsecvenialesenzitivepefront
Diferfadeceleanterioareprinfaptulcschimbrilelaieiresunteantionateprintranziiispecifice
ale intrrilor. Pentru fiecare intrare n tabel, numai un singur semnal de poate avea poate avea
specificatotranziiepefront.Toatecelelaltesemnaledeintraretrebuiesaibintrrintabelpentru
aacoperitranziiilesauUDPvafurnizaxlaieirecndtranziiaapare.Intrriledintabelsenzitivepe
frontsuntmaipuinprioritaredectcelesenzitivepenivel.
2.2.5.TIPURIDEDATE;IRURI
Sintaxadedeclarareatipurilordedateesteurmtoarea:
49

Sintaxa
tip_registru[dimensiune]nume_variabil,nume_variabil,...;
tip_registru[dimensiune]nume_memorie[dimensiune_tablou];
tip_legtur[dimensiune]#(ntrziere)nume_legtur,nume_legtur,...;
tip_legtur(drive_strength)[dimensiune]#(ntrziere)nume_legtur=
atribuire_continu;
trireg(capacitance_strength)[dimensiune]#(ntrziere,timp_decay)
nume_legtur,nume_legtur,...;
parameternume_constant=valoare,nume_constant=valoare,...;
specparamnume_constant=valoare,nume_constant=valoare,...;
eventnume_eveniment,nume_eveniment,...;
unde:
ntrziere (opional) poate fi specificat numai pentru tipul legtur. Sintaxa este la fel ca la
primitive.
Dimensiuneaesteundomeniudeforma[msb:lsb].
Valorile msb i lsb trebuie s fie ntregi, parametri ntregi sau o expresie care se rezum la o
constantntreag.Sepoatefolosiattconvenialittleendian(lsbestecelmaimicbit)cti
conveniabigendian(lsbestecelmaimarebit).
Dimensiuneamaximaunuivectorpoatefilimitatdarnumaipuinde2
16
bii.
Dimensiune_tablouestedeforma[prima_adres:ultima_adres].
Cele dou valori trebuie s fie ntregi, parametri ntregi sau o expresie care se rezum la o
constantntreag.Potfiutilizatesauordineacresctoaresauceadescresctoare.
Dimensiuneamaximaunuitabloupoatefilimitatdarnumaipuinde2
24
bii.
Timp_decay(opional)specificvolumuldetimpncareolegturtriregvamemoraoncrcare
dupcetoatesurselesevoropri,naintedeajungerealavcaloarealogicX.
Sintaxa este (ntrziere_cresctoare, ntrziere_cztoare, timp_decay). Valoare de default a
timpuluiesteinfinit.
Verilogaredoutipuriprimarededate:
- Legturreprezintconexiunistructuralentrecomponente
- Registrureprezintvariabileutilizatepentruamemoradate
50

Fiecaresemnalareuntipdedateasociatcuel,astfel:
- Prindeclarareexplicit:cuodeclaraiencodulVerilog
- Prin declarare implicit: fr declarare cnd se conecteaz structural blocurile constructive din
cod;aceastaestentotdeaunaolegturdetipwireidedimensiuneunbit.
Tipurilegtur
Fieacre tip de legtur are o funcionalitate care este utilizat pentru a modela diferite tipuri de
hardware(cumarfiPMOS,NMOS,CMOS,etc).
Existurmtoareletipuridelegturi:
Mnemonica Funcionalitatea
wiresautri Interconectaresimpldefire
worsautrior IeirilegateprinSAUcablat(modelECL)
wandsautriand IeirilegateprinIcablat(modelopencollector)
tri0 Legturalamascutreistri(Pullsdowncutristated)
tri1 Legturalasurscutreistri(Pullsupcutristated)
supply0 Constantlogic0(supplystrength)
supply1 Constantlogic1(supplystrength)
trireg Reineultimavaloarecndtrecentreistri(capacitancestrength)

TipulwireestecelmaifolositnproiecteleVerilog.
Exemple:
wor a; sau wand a;
reg b, c;

assign a = b;
assign a = c; //a = b | c sau a = b & c si pleaca cu valoarea x
sau
tri a; sau trireg a;
reg b, c;

assign a = (b) ? c : 1'bz; // a pleaca cu valoarea z si va prelua c sau z
// sau a pleaca cu valoarea x si va prelua ultima
// valoare c
51

Legturiletransferattvalorilogice,ctiputeri(strengths)logice.
Olegturdedatetrebuieutilizatcnd:
- unsemnalestedatdectreieireaunuianumitdispozitiv
- unsemnalestedeclaratcaportdeintraresaubidirecional
- unsemnalestedeparteastngauneiatribuiricontinue
Tipuriregistru
Registrele memoreaz ultima valoare atribuit lor pn ce o alt atribuire le schimb valoarea. Ele
reprezint constructori de memorare a datelor. Se pot crea reele de registre numite memorii. Tipurile
de date registru sunt utilizate ca variabile n blocurile procedurale. Un astfel de tip este cerut dac un
semnalesteatribuituneivaloriprintrunblocprocedural(acesteblocurincepcuinitialsaualways).
Existurmtoareletipurideregistre:
Mnemonica Funcionalitatea
reg Variabilfrsemnpeoricedimensiunedebii
integer Variabilcusemnpe32bii
time Variabilfrsemnpe64bii
realsaurealtime Variabilnvirgulmobilcudublprecizie

TipulregestecelmaifolositnproiecteleVerilog.Tipurilededateregistrusuntutilizatecavariabilen
blocurile procedurale. Ele memoreaz numai valori logice (nu strengths) i trebuie utilizate cnd
semnalulestepestngauneiatribuiriprocedurale.
iruri
Uniresteosecvendecaracterencadratepringhilimeleitoateconinutentrosingurlinie.irurile
utilizatecaoperanzinexpresiiiatribuirisunttratatecaosecvendevaloareASCIIpe8bii,valoarece
reprezintuncaracter.Pentruadeclaraovariabilsmemorezeunir,sedeclarunregistrusuficient
demarepentruainenumrulmaximdecarcaterepecarevariabilalpstreaz;nVerilognusecerbii
suplimentari pentru a pstra o terminaie de caracter. irurile pot fi manipulate utiliznd operatori
standard. Cnd o variabil este mai mare dect este cerut s pstreze o valoare n timpul atribuirii,
Verilog umple coninutul la stnga cu zerouri dup atribuire. Acest fapt asigur consistena n timpul
atribuiriiunorvalorinonir.
52

Anumite caractere pot fi utilizate n iruri numai cnd sunt precedate de un caracter introductiv numit
caracterdescpare(escape).Acestecaracterespecialesunturmtoarele:
Caracter Descriere
\n Caracterlinienou
\t CaracterTab
\\ Caracterbackslash(\)
\ Caracterghilimele
\ddd Caracterspecificatn13digiioctali(0<=d<=7)
%% Caracterprocent(%)

Exemplu:
module strings();
// Declara o variabila registru pe 29 octeti
reg [8*29:0] string ;

initial begin
string = "Acesta este un exemplu de sir";
$display ("%s \n", string);
end

endmodule
Altetipuridedate
Altetipuri Funcionalitate
parameter
Constant runtime pentru memorarea ntregilor,
numerelor reale, timpului, ntrzierilor sau irurilor
ASCII. Parametrii pot fi redefinii pentru fiecare
instanamodulului.
specparam
Specificconstantablocpentrumemorareantregilor,
numerelor reale, timpului, ntrzierilor sau irurilor
ASCII.
event
Un flag temporar fr valoare logic sau memorare
date. Este utilizat adesea pentru sincronizarea
activitilorconcurentedintrunmodul.

53

2.3.OPERATORIDELIMBAJ
Operatoriiexecutooperaiepeunulsaudoioperanzi:
Expresiiunare:operatoroperand
Expresiibinare:operandoperatoroperand
Operanzii pot fi de tip legturi sau registru i pot fi scalar, vector sau o selecie de bii ai unui vector.
Operatorii care ntorc un rezultat adevrat/fals vor ntoarce o valoare pe 1 bit cu valoare 1 pentru
adevrat,0pentrufalsixpentrunedeterminat.
2.3.1.OPERATORIARITMETICI
Simbol Utilizare Descriere
+ m+n Adunnlam
mn Scadendinm
m Negatulluim(ncomplementfade2)
* m*n nmuletemcun
/ m/n mpartemlan
% m%n Modululdem/n

mprirea ntreag trunchiaz orice parte fracional. Rezultatul operaiei modul ia semnul primului
operand. Daca oricare bit al unui operand are valoare x, atunci ntregul rezultat este x. Tipurile de
date registru sunt utilizate ca valori fr semn (numerele negative sunt memorate n cod
complementar).
2.3.2.OPERATORILANIVELDEBIT
Simbol Utilizare Descriere
~ ~m Inverseaz(neag)fiecarebitalluim
& m&n Ilogicfiecarebitalluimcufiecarebitalluin
| m|n SAUlogicfiecarebitalluimcufiecarebitalluin
^ m^n SAUEXCLUSIVfiecarebitalluimcufiecarebitalluin
~^
^~
m~^n
m^~n
SAUNUEXCLUSIVfiecarebitalluimcufiecarebitalluin
54

Dacunoperandestemaiscurtdectaltul,elsevaextindelastngacuzerouripncesepotriveteca
lungimecuoperandulmailung.Operaiileconsideribiidevaloarex.
2.3.3.OPERATORIDEREDUCERE
Simbol Utilizare Descriere
& &m Ilogicmpreunpetoibiiidinm(1Adevrat/1Fals)
~& ~&m INUlogicmpreunpetoibiiidinm(1Adevrat/1Fals)
| |m SAUlogicmpreunpetoibiiidinm(1Adevrat/1Fals)
~| ~|m SAUNUlogicmpreunpetoibiiidinm(1Adevrat/1Fals)
^ ^m SAUEXCLUSIVmpreunpetoibiiidinm(1Adevrat/1Fals)
~^
^~
~^m
^~m
SAUNUEXCLUSIVmpreunpetoibiiidinm(1Adevrat/1Fals)

Operatoriidereduceresuntunariiproducrezultatpe1bit.Operaiiledereducereconsideribiiide
valoarex.
2.3.4.OPERATORILOGICI
Simbol Utilizare Descriere
!
!m m negat logic (1Adevrat/1Fals)
&&
m && n m I logic n (1Adevrat/1Fals)
||
m || n m SAU logic n (1Adevrat/1Fals)

Expresiile conectate prin && sau || sunt evaluate de la stnga la dreapta. Rezultatul este x dac
oricareoperandconinebiidevaloarex.
2.3.5.OPERATORIDEEGALITATE
Simbol Utilizare Descriere
== m==n Estemegalcun?(1Adevrat/1Fals)
!= m!=n Estemneegal(diferit)cu(de)n?(1Adevrat/1Fals)
=== m===n Estemidenticcun?(1Adevrat/1Fals)
!== m!==n Estemneidentic(diferit)cu(de)n?(1Adevrat/1Fals)
55

Egalitatea este logic (rezultatul este x dac operatorii conin x sau z) iar identitatea este
cazuistic(includeicomparaiidexiz).
Operanzii sunt comparai bit cu bit, cu adugri de zerouri dac cei doi operanzi nu au aceeai
dimensiune.
2.3.6.OPERATORIRELAIONALI
Simbol Utilizare Descriere
< m<n Estemmaimicdectn?(1Adevrat/1Fals)
> m>n Estemmaimaredectn?(1Adevrat/1Fals)
<= m<=n Estemmaimicsauegaldectn?(1Adevrat/1Fals)
>= m>=n Estemmaimaresauegaldectn?(1Adevrat/1Fals)

Dacoricaredintreoperanziestexsauz,atuncirezultatulesteconsideratfals.
2.3.7.ALIOPERATORI
Operatorideplasarelogic
Simbol Utilizare Descriere
<< m<<n Deplasaremlastngadenori
>> m>>n Deplasaremladreaptadenori

Poziiilevacantesuntumplutecuzerouri.
MiscellaneousOperators
Simbol Utilizare Descriere
?: sel?m:n
Operatorcondiional:dacseleste
adevrat,selecteazm:altfelselecteazn
{} {m,n}
Concateneazmlan,realizndunvector
maimare
{{}} {n{m}} Replicmdenori
> >m
Poziioneazunsemaforpeuntipdedate
event

56

Concatenarea nu permite numere constante fr semn. Se pot utiliza multiplicatori (constante) de


repetare(exemplu:>{5{b}}//echivalentcu{b,b,b,b,b}).
Sunt posibile operaii cu operatori de concatenare I replicare mbricai (exemplu: > {a, {4{b, c}}} //
echivalentcu{a,b,c,b,c,b,c,b,c}).
2.3.8.PRECEDENAOPERATORILOR
Precedenaoperatorilor
!~+(unari)

*/%

+(binari)

<<>>

<<=>>=

==!====!==

&~&

^~^

|~|

&&

||

?:
Ceamainaltpreceden

Ceamaisczutpreceden

Operatorii de pe aceeai linie au aceeai preceden i asociaz termenul din stnga celui din dreapta
ntroexpresie.
Parantezelesuntutilizatepentruamodificaprecedenasaupentruaclarificasituaia.
Pentruauuranelegerea,serecomandautilizareaparantezelor.

57

2.4.CONSTRUCII/INSTRUCIUNIVERILOG
2.4.1.BLOCURIPROCEDURALE
DeregulcodulcomportamentalVerilogexistninteriorulblocurilorprocedurale,darexistiexcepii
carevorfiprezentateulterior.
nVerilogexistdoutipurideblocuriprocedurale:
- initial:seexecutnumaiodat,lamomentuldetimpzero(cndseporneteexecuia)
- always: aceste bucle se execut mereu i mereu, adic, dup cum sugereaz i numele, se
executntotdeaunapnalaoprireasimulrii
Sintaxablocurilorproceduraleesteurmtoarea:
Sintaxa
tip_bloc@(list_senzitivitate)
grup_instruciuni:nume_grup
declaraii_variabile_locale
control_sincronizareinstruciuni_procedurale
sfrit_grup_instruciuni

unde:
tip_bloc:esteunuldinceledoutipurideblocuriprocedurale
list_senzitivitate:esteunevenimentdecontrolalsincronizriicarestabiletecndvorncepea
fi evaluate toate instruciunile din blocul procedural; lista este utilizat pentru a modela
comportarealogiccombinaionalisecvenial
structura grup_instruciuni sfrit_grup_instruciuni: este utilzat pentru a grupa mpreun
dousaumaimulteinstruciuniproceduraleicontroleazordineadeexecuie
- begin end grupeaz mpreun dou sau mai multe instruciuni n mod secvenial,
astfelnctinstruciunilesfieevaluatenordineancaresuntlistate;fiecarecontrolde
sincronizare este relativ la instruciunea precedent iar blocul se termin dup ultima
instruciunedinbloc
- fork join grupeaz mpreun dou sau mai multe instruciuni n mod paralel, astfel
nct toate instruciunile sunt evaluate concurent; fiecare control de sincronizare este
absolut la momentul cnd grupul ncepe s se execute iar blocul se termin cnd dup
ultimainstruciune(instruciunilecuceamaimarentrzierepotfiprimeledinbloc)
58

- Potexistaconstruciiforkjoinninterioruluneiconstruciibeginend
- nume_grup (opional): creaz un scop n grupul de instruciuni; grupurile (blocurile)
denumitepotaveavariabilelocaleipotfidezactivateprinconstruciadisable
- declaraii_variabile_locale(opional):trebuiesfieuntipdedateregistru
- control_sincronizare:esteutilzatpentruacontrolaatuncicndseexecutinstruciunile
dintrunblocprocedural;vafiprezentatulterior
- instruciuni_procedurale: sunt atribuiri procedurale la o variabil registru (reg, integer,
time) sau instruciuni program i vor fi prezentate ulterior; atribuirile procedurale pot
atribui valori de tip legtur (wire), constante, un alt registru sau o valoare specific iar
instruciunile program pot fi instruciuni condiionale, de caz, de repetare sau
dezactivare
2.4.2.ATRIBUIRIPROCEDURALE
Potfiatribuiridetipblocantesaunonblocante.
Atribuirile blocante se execut n ordinea n care au fost scrise, adic sunt secveniale.Ele au simbolul
=.Acesteatribuiriacioneazcainlimbajeletradiionaledeprogramare:instruciuneaurmtoarenu
seexecutpnacentreagainstruciunecurentestecompletexecutatidoaratuncisetrececontrolul
execuieilainstruciuneaurmtoareceleicurente.
Sintaxauneiatribuiriblocanteesteurmtoarea:
nume_tip_date_registru=expresie;
Atribuirilenonblocantesuntexecutatenparalel.Eleausimbolul<=.Instruciuneaurmtoarenueste
blocatntimpulexecuieiinstruciuniicurente.Atribuireanonblocantevalueaztermenuldindreapta,
pentruunitateacurentdetimpiatribuievaloareaobinuttermenuluidinstnga,lasfritulunitii
detimp.
Sintaxauneiatribuirinonblocanteesteurmtoarea:
nume_tip_date_registru<=expresie;
Exemplu:
//se presupune c iniial a = 1
// testarea atribuirii blocante

59

always @(posedge clk)


begin
a = a+1; //n acest moment a=2
a = a+2; //n acest moment a=4

end //rezultat final a=4
// testarea atribuirii nonblocante
always @(posedge clk)
begin
a <= a+1; //n acest moment a=2
a <= a+2; //n acest moment a=3

end //rezultat final a=3
Efectulesteacelac,pentrutoateatribuirilenonblocantesefolosescvechilevalorialevariabilelor,dela
nceputulunitiicurentedetimp,pentruaasignaregistrelornoilevalori,lasfritulunitiicurentede
timp.
Aceastareprezintoreflectareaamoduluincareaparuneletransferurintreregistre,nunelesisteme
hardware.
Controlulsincronizriivafiprezentatulterior.
Existurmtoareletipurideatribuiriprocedurale,blocantesaunonblocante:
Assignideassign
Aceste construcii de atribuire procedural permit ca atribuirile continue s fie plasate pe registre
pentru controlul perioadelor de timp. Construcia assign se extinde peste atribuirile procedurale la o
variabilregistru.Construciadeassigndezactiveazoatribuirecontinulaovariabilregistru.
Sintaxaacestoraesteurmtoarea:
assignnume_tip_date_registru=expresie;
deassignnume_tip_date_registru;
Forceirelease
Aceste construcii au efect similar ca al perechii assign deassign dar pot fi aplicate i legturilor
(wire),nunumairegistrelor;foreazatribuireaideatribuireaoricrortipuridedatelaovaloare.
60

Sepotutilizantimpulsimulriilaniveldeporincazulproblemelordeconectivitatelareset.
Deasemenea,potfiutilizatepentruainseraunulsaudoibiideeroarelaocitirededatedelamemorie.
Sintaxaacestoraesteurmtoarea:
forcenume_tip_date_registrusaulegtur=expresie;
releasenume_tip_date_registrusaulegtur;
2.4.3.CONSTRUCII/INSTRUCIUNICONDIIONALE
Construciaifelsecontroleazexecuiaaltorinstruciuniipoateincludesincronizriprocedurale.
Cndmaimultdeoinstruciunenecesitafiexecutatpentruocondiieif,atuncisevorutilizabegini
endninteriorulconstruciei.
Sintaxainstruciunilorcondiionaleesteurmtoarea:
Sintaxa
Instruciuneif
if(expresie_condiie)//dacexpresiaevaluatesteadevrat
instruciunesaugrupdeinstruciuni//executinstruciuneasaugrupuldeinstruciuni
Instruciuneifelse
if(expresie_condiie)//dacexpresiaevaluatesteadevrat
instruciunesaugrupdeinstruciuni//executinstruciuneasaugrupuldeinstruciuni
else//altfeldacexpresiaevaluatestefalssaunecunoscut
instruciunesaugrupdeinstruciuni//executinstruciuneasaugrupuldeinstruciuni
Instruciunembricatifelseif
if(expresie1_condiie)//dacexpresiaevaluatesteadevrat
instruciunesaugrupdeinstruciuni//executinstruciuneasaugrupuldeinstruciuni
elseif(expresie2_condiie)//altfeldacexpresia1evaluatestefalssaunecunoscut
//idacexpresia2evaluatesteadevrat
instruciunesaugrupdeinstruciuni//executinstruciuneasaugrupuldeinstruciuni

nmodnormalnuseincludeverificareaderesetnexpresia_condiie.Aacatuncicndestenecesaro
logicdeprioriti,seutilizeazconstruciaifelseif.
Pedealtpartedacnusedoreteimplementareauneilogicideprioriti,tiindcnumaiointrareeste
activlaunmomentdat(adictoateintrrilesuntmutualexclusive),atuncisepoatescriecodulVerilog
allogiciintrunifparaleldeformaifelseifif.

61

2.4.4.CONSTRUCII/INSTRUCIUNIDECAZ
Construciile de caz compar o expresie cu o serie de cazuri i execut instruciunea sau grupul de
instruciuniasociatcuprimapotriviredecaz.ncazulgrupuluideinstruciunimultipleseutilizeazbegin
end.
Sintaxainstruciunilordecazesteurmtoarea:
Sintaxa
Instruciunecase
case(legtur_sau_registru_sau_simbolliteral)//comparlegtura,registrulsau
potrivire_caz1:instruciunesaugrupdeinstruciuni//valoareasimboluluiliteralcufiecarecazi
potrivire_caz2,//executinstruciuneasaugrupuldeinstruciuni
potrivire_caz3:instruciunesaugrupdeinstruciuni//asociatcuprimapotriviredecaz
default:instruciunesaugrupdeinstruciuni//executpredefinit(opional)dac
endcase//niciuncaznusepotrivete
Instruciunecasez
casez(legtur_sau_registru_sau_simbolliteral)//trateazzcanuconteaz
Instruciunecasex
casex(legtur_sau_registru_sau_simbolliteral)//trateazxizcanuconteaz

Cndnusefolosetedefaultatuncitrebuieprecizatetoatecazurile.
Daclamaimultecazuriseexecutaceeaiinstruciunesaugrupdeinstruciuniatuncisepotspecifica
cazurilemultiplecaunsingurcaz,dupcumseprezintnexempluldemaijos:
module mux_fara_default (a,b,c,d,sel,y);
input a, b, c, d;
input [1:0] sel;
output y;

reg y;

always @ (a or b or c or d or sel)
case (sel)
0 : y = a;
1 : y = b;
2 : y = c;
3 : y = d;
2&apos;bxx,2'bx0,2'bx1,2'b0x,2&apos;b1x,
2&apos;bzz,2'bz0,2'bz1,2'b0z,2&apos;b1z : $display("Eroare de selectie");
endcase

endmodule

62

2.4.5.CONSTRUCII/INSTRUCIUNIPENTRUREPETARE
Construciile de repetare apar numai n interiorul blocurilor procedurale. Verilog are patru astfel de
construcii(forever,repeat,while,for)ivorfiprezentatencontinuare.
Forever
Bucla forever se execut continuu, ea nu se termin niciodat. n mod normal se utilizeaz aceast
instruciunenblocurileinitial.
Sintaxaesteurmtoarea:
foreverinstruciunesaugrupdeinstruciuni
Trebuieacordatoateniedeosebitlautilizareaacesteiinstruciuni:simulareasepoateagadacanu
esteprezentunconstructordesincronizare.
Repeat
Buclarepeatseexecutdeunnumrfixatdeori.Numrulpoatefiunntreg,ovariabilsauoexpresie
(ovariabilsauoexpresieesteevaluatnumaicndseintrprimadatnbucl).
Sintaxaesteurmtoarea:
repeat(numr)instruciunesaugrupdeinstruciuni
Trebuielafelavutgrijpentrusincronizareainstruciunilormultipledininteriorulbuclei.
While
Buclawhileseexecutatttimpctexpresiaesteevaluatcaadevrat.
Sintaxaesteurmtoarea:
while(expresie)instruciunesaugrupdeinstruciuni
For
Sintaxaesteurmtoarea:
for(atribuire_iniial;expresie;atribuire_pas)instruciunesaugrupdeinstruciuni
Buclafor,lafelcanoricelimbajdeprogramare:
63

- Executoatribuireiniialodatlastartulbuclei
- Executbuclaatttimpctexpresiaesteevaluatcaadevrat
- Executoatribuiredepaslasfritulfiecreitreceriprinbucl
Exemplu:
...
for (i = 0; i < 256; i = i + 1) begin
...
Trebuielafelavutgrijpentrusincronizareainstruciunilormultipledininteriorulbuclei.
2.4.6.CONSTRUCII/INSTRUCIUNIDEDEZACTIVARE
Sintaxaesteurmtoarea:
disablenume_grup;
ntrerupe execuia unui grup denumit de instruciuni. Simularea acestui grup sare la sfritul grupului
frexecuiaoricruievenimentprogramat.
2.4.7.ATRIBUIREACONTINU;PROPAGAREANTRZIERILOR
Construciile de atribuiri continue manipuleaz legturi (tipuri de date fire). Ele reprezint conexiuni
structurale.
Sintaxaesteurmtoarea:
Sintaxa
Atribuirecontinuexplicit
tip_legtur[dimensiune]nume_legtur;
assign(strength)#(ntrziere)nume_legtur=expresie;
Atribuirecontinuimplicit
tip_legtur[dimensiune](strength)nume_legtur=expresie;

Atribuirilecontinueexplicitecerdouinstruciuni:unapentruadeclaralegturaiunapentrua
atribuicontinuuovaloarelaaceasta.
Atribuirile continue implicite combin declararea legturii i atribuirea continu ntro singur
instruciune.
64

Tip_legturpoatefioricetipdedatelegturcuexcepiatrireg.
Strength (opional) poate fi specificat numai cnd atribuirea continu este combinat cu o
declararedelegtur.Valoareapredefinitpentrustrengtheste(strong1,strong0).
ntrzierea (opional) urmrete aceeai sintax ca la instanierea primitivelor. Valoarea
predefinitestezero.
Expresiapoateincludeoricetipdedate,oriceoperatoriapelridefuncii.
Atribuirile continue modeleaz tampoane (buffers) cu impedan nalt i pot modela logica
detipcombinaional.Defiecaredatcndunsemnalseschimbpeparteadindreapt,partea
dreaptestereevaluatirezultatulesteatribuitlegturiidinparteastng.
Atribuirile continue sunt declarate n afara blocurilor procedurale i se extind peste orice
atribuiri procedurale. Ele devin automat active la momentul zero i sunt evaluate concurent cu
blocurileprocedurale,instanieriledemoduleideprimitive.
Exemple:
...
reg a, b;
wire suma, transport_out;

assign #5 { transport_out,suma} = a+b;
...sau
...
wire [0:31] (strong1, pull0) ual_out = functie_ual(cod_op,a,b);
...sau
...
reg date_in, activare;
wire date_out;

assign date_out = (activare) ? date_in : 1'bz;
...sau
...
tri [0:15] #5 date_out = (activare) ? date_in : 16'bz;
...etc.

65

Propagareantrzierilor
Atribuirilecontinuepotaveaontrzierespecificatinumaipentrutoatetranziiile.Poatefispecificat
iundomeniudentrzieriminim:tipic:maxim.
Exemplu:
assign #(1:2:3) date_out = (activare) ? date_in : 1'bz;
2.4.8.CONTROLULBLOCURILORPROCEDURALE;BLOCURINUMITE
Blocurile procedurale devin active la momentul zero de simulare. Pentru a controla execuia unei
proceduriseutilizeazevenimentesenzitivepenivel.Nusepoatecontrolaunbloccuovariabilcreia
bloculiatribuievalorisaupecareellemanipuleaz.Dacninteriorulunuimodulexistblocurialways
multiple, atrunci toate blocurile (always i initial) vor ncepe s se execute de la momentul zero i vor
continuasseexecuteconcurent;deseoriacestlucrupoateconducelacondiiineprecizateiieirilenu
potfistabilite.
Controlulproceduralallogiciicombinaionale
Pentruamodelalogicadetipcombinaional,unblocproceduraltrebuiesfiesenzitivlaoriceschimbare
a intrrilor. Daca se utilizeaz instruciunea condiional atunci este nevoie s se utilizeze i partea
else; lipsa acestei pri schimb logica ntrun latch. Daca nu se dorete utilizarea else atunci
trebuiesseiniializezetoatevariabileledinbloculcombinaionalchiardelanceput.
Controlulproceduralallogiciisecveniale
Pentruamodelalogicadetipcombinaional,unblocproceduraltrebuiesfiesenzitivlafrontulpozitiv
sau negativ al semnalului de ceas. Dac se dorete o iniializare asincron atunci blocul trebuie s fie
senzitiv i la frontul semnalelor de reset, preset, clear, etc. Toate atribuirile la logica sevenial
trebuiesfierealizateprinatribuiriproceduralenonblocante.Lasimularesepotutilizafronturimultiple
alevariabilelordarlasinteznumaiunfrontalvariabileiconteaznfuncionareareal;nuestebinela
sintezsseutilizezesemnaluldeceaspentruaactivabistabile.
Blocurinumite
Blocurile pot fi numite prin adugarea construciei : nume_bloc dup begin. Blocurile numite pot fi
dezactivateprinutilizareainstruciuniidisableninteriorulblocului.
66

2.4.9.BLOCURISPECIFICE
Auurmtoareasintax:
Sintaxa
specify
declaraii_specparam
verificri_constrngeri_timing
ntrziere_cale_simpl_pinlapin
ntrziere_cale_frontsenzitiv_pinlapin
ntrziere_cale_staredependent_pinlapin
endspecify

Declaraii_specparam
Ausintaxa:
specparamnume_parametru=valoare,nume_parametru=valoare,...;
Parametrii specifici sunt constant utilizate pentru a memora ntrzieri, factori de calcul ai ntrzierii,
factoridesintez,etc.Valorilelorpotfintregi,realisauiruri.
Verificriconstrngeridetiming
Sunttaskurisistemcaremodeleazrestriciilelaschimbrilepeintrri,cumsunttimpiidesetupide
hold.
Ausintaxaurmtoare:
Sintaxa
$setup(eveniment_date,eveniment_referin,limit_setup,notificare);
$hold(eveniment_date,eveniment_referin,limit_hold,notificare);
$setuphold(eveniment_referin,eveniment_date,limit_setup,limit_hold,notificare);
$skew(eveniment_referin,eveniment_date,limit_skew,notificare);
$recovery(eveniment_referin,eveniment_date,limit,notificare);
$period(eveniment_referin,limit_period,notificare);
$width(eveniment_referin,width_limit,width_threshold,notificare);

67

Caracteristici:
Verificriledetimingpotfiutilizatenumainblocurispecifice.
Evenimentul de referin este un front al unui semnal de intrare care stabilete un punct de
referin pentru schimbrile unui eveniment de date. Evenimentul de date este semnalul de
intrare care este monitorizat pentru schimbri. Evenimentele de date i de referin trebuie s
fieporturideintrare.
Limitithresholdsuntvaloridentrzieriiutilizeazaceeaisintaxlantrzierilesingulare
deprimitive.
Notificarea (opional) este o variabil registru utilizat ca un indicator. Cnd apare o violare de
timing, funcionalitatea modelului poate utiliza indicatorul de notificare pentru a modifica
ieirilemodelului.
ntrziericalepinlapin
ntrzierecalesimpl:
(port_intrarepolaritate:indicator_caleport_ieire)=(ntrziere);
ntrzierecalesenzitivpefront:
(frontport_intrareindicator_cale(port_ieirepolaritate:surs))=(ntrziere);
- Front (opional) poate fi posedge sau negedge. Dca nu este specificat sunt utilizate
toatetranziiiledeintrare.
- Sursa(opional)esteportuldeintraresauvaloareadeieirecarevafiprimit.Sursaeste
ignorat de ctre majoritatea simulatoarelor logice, dar poate fi utilizat de ctre
analizoareledetiming.
ntrzierecaledependentdestare:
if(prima_condiie)ntrziere_cale_simpl_sau_frontsenzitiv
if(urmtoarea_condiie)ntrziere_cale_simpl_sau_frontsenzitiv
ifnonentrziere_cale_simpl
- Permitentrzieridiferitepentruaceeaicalecareurmeazafispecificat,pebazaaltor
condiiideintrare.
- Condiiapoatefibazatnumaipeporturideintrare.
68

- Cu condiii pot fi utilizai majoritatea operatorilor, dar trebuie sa se rezume la


adevrat/fals(ovaloarelogicxsauzesteconsideratadevrat;dacaocondiiese
rezumlaunvectoresteutilizatnumailsb).
- Fiecare ntrziere dependent de stare pentru aceeai cale trebuie s aib o condiie
diferitsauunfrontsenzitivdiferit.
- Condiia ifnone (opional) poate fi numai o ntrziere de cale simpl i servete ca
valoarepredefinitdacnuesteevaluatniciocondiiecaadevrat.
o Polaritatea (opional) este ori + sau P i indic dac intrarea va fi sau nu va fi inversat.
Indicatorul de polaritate este ignorat de ctre majoritatea simulatoarelor logice, dar poate fi
utilizatdectreanalizoareledetiming.
o Indicatorul de cale este ori simbolul *> pentru conexiune complet sau simbolul => pentru
conexiune paralel. ntrzierea de cale complet conectat indic faptul c fiecare bit de intrare
poateaveaocaledentrzierelafiecarebitdeieire.ntrziereadecaleconectatparalelindic
faptulcfiecarebitdeintrareesteconectatlabitulsucorespondentdeieire(bitul0labitul0,
bitul1labitul1,...).
o ntrziereareprezintfaptulcpotfispecificate1,2,3,6sau12tranziii.Fiecaretranziiepoate
aveaontrzieresingularsauundomeniudentrziereminim:tipic:maxim.
ntrzieri Tranziiireprezentate(nordine)
1 Toatetranziiiledeieire
2
Tranziiiledeieirecresctoarei
descresctoare
3
Tranziiiledeieirecresctoare,
descresctoareiturnoff
6
Tranziiicresctoare,descresctoare,
0>Z,Z>1,1>Z,Z>0
12
Tranziiicresctoare,descresctoare,
0>Z,Z>1,1>Z,Z>0,
0>X,X>1,1>X,X>0,X>Z,Z>X

2.4.10.CONTROLULSINCRONIZRIINBLOCURILEPROCEDURALE
Controlulsincronizriisepoaterealizaprincontrolulntrzierii,princontrolulevenimentelorsenzitivepe
frontsauprincontrolulevenimentelorsenzitivepenivel.
69

Controlulntrzierii
Sintaxaesteurmtoarea:#ntrziere
ntrzie execuia unei construcii procedurale pentru o valoare specific de timp. ntrzierea poate fi
oricenumrliteral,ovariabilsauoexpresie.
Controlulevenimentelorsenzitivepefront
Aresintaxa:@(front_semnalsaufront_semnalsau...)instruciune;
trzie execuia pn ce apare o tranziie logic pe un semnal. Frontul (opional) poate fi posedge sau
negedge; daca nu se specific nici un front atunci este utilizat orice tranziie logic. Semnalul poate fi
scalarsauvectorideoricetipdedate.
Controlulevenimentelorsenzitivepenivelconstruciiwait
Sintaxaesteurmtoarea:wait(expresie)#ntrziereinstruciune;
ntrzieexecuiapnceexpresiaesteevaluatcaadevrat.
Altesincronizri
Sintaxeposibile:
control_ntrzierenume_tip_date_registru=expresie;
control_ntrzierenume_tip_date_registru<=expresie;
ntrzieatribuiriprocedurale.Evaluareaatribuiriiestentrziat deuntipde controlalsincronizriidin
cadrulcelorprezentatemaisus.
nume_tip_date_registru=control_ntrziereexpresie;
Sunt atribuiri blocante ntrziate intern. Expresia este evaluat n pasul de timp n care este ntlnit
instruciunea i este atribuit ntro ordine nedeterminist n pasul de timp specificat prin controlul
sincronizriloranterioare.
nume_tip_date_registru<=control_ntrziereexpresie;
70

Sunt atribuiri nonblocante ntrziate intern. Expresia este evaluat n fiecare pas de timp n care este
ntlnitinstruciuneaiesteatrbuitlasfritulpasuluidetimpspecificatprincontrolulsincronizrilor
anterioare.Sincronizareamodeleaztransportulntrzierii.
Controlul intern al atribuirilor evalueaz ntotdeauna expresia din partea dreapt i atribuie rezultatul
dupntrzieresauevenimentdecontrol
Ori de cte ori un semnal se schimb n partea dreapt, ntreaga parte dreapt este reevaluat i
rezultatulesteatribuitnparteastng.
2.5.TASKURIIFUNCII
2.5.1.TASKURI
Taskurile sunt utilizate ca n toate limbajele de programare i sunt cunoscute n general ca proceduri
sausubrutine.Liniiledecodsuntdelimitatedecuvintelecheietask,lanceputiendtask,lasfrit.
Datelesunttrimisetask_uluicareleproceseazirezultatulestereturnatlaterminareatask_ului.
Task_urilesuntapelatenmodspecific,cudatedeintrareideieireisuntinclusecodulprogramului
Verilog.Elepotfiapelatedemulteori,evitndrepetareacodului.
Task_urile pot avea orice numr de intrri, ieiri sau inouturi i pot conine sincronizri de tip #, @
sauwait.
Taskurile sunt definite n modulul n care sunt utilizate. Este posibil s se defineasc un task ntrun
fiier separat i s se utilizeze directiva de compilare include pentru a include taskul n fiierul care
instaniaztaskul.
Sintaxadedefinireaunuitaskesteurmtoarea:
Sintaxa
tasknume_task;
declaraiiinput,output,iinout
declaraiivariabilelocale
construcii_proceduralesaugrup_instruciuni
endtask

71

Caracteristici:
Variabilelelocaledeclaratentruntasksuntlocaleaceluitask.
Ordinea de declarare dintrun task definete cum sunt utilizate variabilele trimise taskului de
ctreapelani.
Cnd nu sunt utilizate variabile locale, taskurile pot manipula variabile globale (n aces caz
variabilele sunt declarate ca registre nainte de definirea taskului, n modulul n care se
definetetaskul).Cndseutilizeazvariabilelocale,ieireaesteasignatuneivariabileregidtru
numailasfritulexecuieitaskului.
Taskurilepotapelaaltetaskurisaufuncii.
Taskurilepotfiutilizatepentruamodelaattlogicacombinaional,ctilogicasecvenial.
Un task trebuie s fie apelat specificcu o instruciune. El nu poate fi utilizat cu o expresie aa
cumpoatefiutilizatofuncie.
Exemplu:
Fieuntaskdefinitnfiierultaskul_meu.v:
module definire_task;

task calculeaza; // definire task
input [0:15] a_in, b_in;
output [0:15] suma_out;
begin
su
end
ma_out = a_in + b_in;
endtask

endmodule
Apelareataskuluiserealizeazastfel:
module apelare_task (a_in, b_in, c_in, suma_out);
input [0:7] a_in, b_in, c_in;
output [0:7] suma_out;
reg [0:7] suma_out;
`include task-ul_meu.v

always @ (c_in)
begin
c
end
alculeaza (a_in, b_in, suma_out); // apelare task

endmodule
72

2.5.2.FUNCII
OfuncieVerilogesteasemntoarecuuntask,cufoartepuinediferene,cumarfifaptulcfuncianu
poatedectoieireinupoateconinentrzieri.Funciilerentorccaieirevaloareacareesteatribuit
numelui funciei. O funcie ncepe cu cuvntul cheie function i se termin cu cuvntul cheie
endfunction.
Funciile sunt definite n modulul n care sunt utilizate. Este posibil s se defineasc funcii n fiiere
separate i s se utilizeze directiva de compilare include pentru a include funcia n fiierul care
instaniazfuncia.
Sintaxadedefinireauneifunciiesteurmtoarea:
Sintaxa
function[dimensiune_sau_tip]nume_funcie;
declaraiiinput
declaraiivariabilelocale
construcii_proceduralesaugrup_instruciuni
endfunction


Caracteristici:
Funciiletrebuiesaibcelpuinointrareinupotaveaieirisauinouturi.
Ele nu pot conine sincronizri de tip posedge, negedge, #, @ sau wait, ceea ce nseamn c
funciileseexecutcuntrziereazero.
Dimensiune_sau_tip (opional) este domeniul de bii rentors ca [msb : lsb], sau cuvntul cheie
integersaureal.
Variabileledeclaratentrofunciesuntlocaleaceleifuncii.Ordineadedeclararedintrofuncie
definetecumsuntutilizatevariabileletrimisefuncieidectreapelani.
Cnd nu sunt utilizate variabile locale, funciile pot manipula variabile globale (n aces caz
variabilele sunt declarate nainte de definirea funciei, n modulul n care se definete funcia).
Cnd se utilizeaz variabile locale, ieirea este asignat unei variabile fir (wire) numai la
sfritulexecuieifunciei.
Funciilepotapelaaltefuncii,nunsitaskuri.
Funciilepotfiutilizatepentruamodeladoarlogicacombinaional.
73

Exemplu:
Fieofunciedefinitnfiierulfunctia_mea.v:
module definire_functie;

function [15:0] functia_mea; // definire functie
input [7:0] a_in, b_in;
begin
functia_mea = a_in * b_in;
end
endfunction

endmodule
Apelareataskuluiserealizeazastfel:
module apelare_functie (a_in, b_in, c_in, produs);
input [7:0] a_in, b_in;
input c_in;
output [15:0] produs;
wire [7:0] produs;
`include functia_mea.v

assign produs = (c_in)? functia_mea (a_in, b_in) :16b0; // apelare functie

endmodule
2.6.MODELAREAMEMORIILORIAMAINILORALGORITMICEDESTARE
Modelareamemoriilor
Pentru a ajuta la modelarea memoriilor, Verilog furnizeaz suport pentru tablouri cu dou dimensiuni.
Modelele comportamentale ale memoriilor sunt modelate prin declararea unui tablou de variabile
registru; orice cuvnt din tablou poate fi accesat utiliznd un index n tablou. Este cerut o variabil
temporarpentruaaccesaunbitdincadrultabloului.
Sintaxaesteurmtoarea:
reg[msb_reg:0]nume_tablou[0:msb_tablou]
Exemplu:
reg[7:0]memoria_mea[0:1023]//memoriaconine1024locaii(adrese)decuvintede8bii,
//nordinelittleendian
Scrierea se face prin atribuirea memoria_mea[adres]= reg_in; iar citirea prin reg_out =
memoria_mea[adres];.
74

Citireaunuibitsefacedupcitireacuvntuluiprinreg_out_bit_0=reg_out[0];.
Iniializareamemoriilor
Un tablou de memorie poate fi iniializat prin citirea fiierului patternului de memorie de pe disk i
memorareaacestuiantablouldememorie.Sintaxaesteurmtoarea:
$readmemh_readmemb(nume_fiier.extensie,nume_tablou_memorie,adres_start,adres_stop);
Adreseleiextensiafiieruluisuntopionale.
Exempludefiier:
//Suntpermisecomentariisiunderscoreintredigitisauocteti,
1100_1100//Aceastesteprimaadresa,8'h00
1010_1010//Aceastaesteadouaadresa,8'h01
@99//Saltlanouaadresa8'h99
0101_1010//Aceastaesteadresa8'h99
0110_1001//Aceastaesteadresa8'h9A
...
Taskul sistem $readmemh poate fi de asemenea utilizat pentru citirea vectorilor de test, dup cum se
vaartanseciuneaprogramelordetest.
Modelareamainiloralgoritmicedestare(FSMFlowStateMachine)
Diagramele de stri sau FSM sunt inima oricrui proiect digital i sunt necesare ori de cte ori avem i
logicsecvenial(cumestenevoienmajoritateaproiectelorVerilog).
Existdoutipuridediagrame:Moore,undeieirilesuntfuncienumaidestareacurentiMealy,unde
unasaumaimulteieirisuntfunciedestareacurentiunasaumaimulteintrri.
Diagramele de stri pot fi de asemenea clasificate dup modul de codificare al strilor: binar, complet
decodificat, gray, etc. Codificarea este un factor critic care decide viteza i complexitatea porilor
pentrudiagrameledestri.
EstebinedeinutminteunlucruimportantcndsecodificFSMianumeclogicadetipcombinaional
i cea de tip secvenial trebuie s se gseasc n dou blocuri always diferite. De asemenea, utilizarea
declarrilordetipparametersau`definepentruadefinistriledinFSMfacecodulmaiuordecititide
gestionat.
75

CodulVerilogtrebuiesaibtreiseciuni:
Stilulcodificrii:Celmaiutilzatestebinaricompletdecodificat.
Partea combinaional: Aceast seciune poate fi modelat utiliznd funcii, construcii de
atribuiresaublocurialwayscuoconstruciecase.
Partea secvenial: Aceast seciune trebuie s fie modelat utiliznd logica senzitiv pe front
cumsuntblocurilealwazscuposedgesaunegedgedesemnaldeceas.
2.7.SCRIEREAPROGRAMELORDETEST
Scrierea unui program de test este la fel de complex ca i scrierea codului RTL nsui. n zilele actuale
circuiteleASICdevindincencemaicomplexeiastfelverificareaacestoradevineoprovocare.nmod
tipic 6070% din timpul necesar pentru proiectarea unui ASIC este cheltuit pe partea de
verificare/validare/testare.
Pentrunceput,pentruscriereaprogramelordetestesteimportantsexistespecificaiiledeproiectare
ale design under test (DUT proiectare n vederea testrii). Specificaile trebuie nelese clar i este
necesarsfierealizatndetaliuunplandetestcuodocumentaretemeinicaarhitecturiiprogramului
de test i a scenariilor de test. Primul pas n scrierea unui program de test este construirea unui
template al lui, care va conine registre (reg) pentru intrri, fire (wire) pentru ieiri apoi instaniaz
proiectul.
Structuraunuitemplateesteurmtoarea:
modulenume_testbench;
reg[msb_r:0]intrri;
wire[msb_w:0]ieiri;

nume_modulinstan(
.semnal1_modul(semnal1_instan),
.semnal2_modul(semnal2_instan),

);

endmodule
Urmtorulpasestesseadaugelogicadeceas.naintenstrebuiesseiniializezediagramalaostare
cunoscut; acest lucru se realizeaz printr+un bloc initial care seteaz semnalele de intrare la valorile
corespunztoareprimeistricarevafisetate.Logicadeceassepoatefurnizaprinmaimultemoduri:se
poate utiliza un bloc always #ntrziere semnal_ceas = !semnal_ceas; sau se poate utiliza o bucl
76

foreverntrunblocinitial.Sepoateadugaun parametersausepoateutliza`definepentruadefinii
controlantrzierea.
Acum se poate testa dac programul de test genereaz semnalul de ceas n mod corect adugnd n
programuldetestnliniadecomandopiunidecompilareisimulare,inclusenblocuriinitial.
Astfeldeopiuniarfi:
$dumpfile: este utilizat pentru specificarea fiierului pe care l utilizeaz simulatorul pentru a
memoraformeledeund.
$dumpvars:instruietecompiulatorulVerilogsnceapcusemnaleledintrunfiier.
$display:esteutilizatpentruatipripeecrantextesauvariabile.
$monitor: pstreaz urma modificrilor variabilelor din list; cum apare o schimbare ea va fi
afiatnformatspecific.
$finish:esteutilizatpentruterminareasimulriidupaunnumrdeunitidetimp
$readmemh:esteutilizatpentrucitireavectorilordetest,etc.
Logica de reset se poate furniza n multe moduri. Un prim mod ar fi printrun bloc initial i apoi
specificarea tranziiilor printrun bloc always, la fel ca pentru toate semnalele de intrare n proiectul
Verilog de testat. Un alt mod, mai elegant, ar fi utilizarea unui event eantionat, cum ar fi
reset_trigger,laapariiacruialogicaderesetvaactivasemnalulderesetpefrontulnegativdeceasi
l va dezactiva pe urmtorul front negativ de ceas; dup dezactivare, logica de rest va eantiona un alt
eventdesincronizarereset_trigger_gata.
Mergndmaideparte,sepoateadugalogicpentruageneracazuridetest.Astfeldecazuripotfi:
- Reset test: se pornete cu reset dezactivat, apoi se activeaz reset pentru cteva perioade de
ceasiapoisedezactiveaz
- Enabletest:activare/dezactivareenabledupaplicareareset
- Activare/dezactivarealeatoarepentruenableireset
Cazurile de test nu pot exista n acelai fiier, aa c ele se codific separat i sunt incluse apoi n
programul de test utiliznd directiva `include. Se poate condiiona terminarea simulrii de un event
terminate_sim.
Sepoateadugaacumologicdecomparareaceeaceseateaptsseobinlasimulareiceeacese
obinedefapt.Aceastlogicvafaceprogramuldetestsseautotestezeautomat.
77

2.8.CONCLUZII
EstebinesseadopteunstildecodificarealprogramelorVerilog.Aceststilpresupuneurmtoarele:
Utilizareaunornumesugestivepentrusemnaleivariabile
Anusemixaelementesenzitivepenivelipefrontnacelaibloc
Aseevitamixareadebistabileeantionatepefrontpozitivipefrontnegativ
Utilizareaparantezelornvedereaoptimizriistructuriilogice
Utilizareainstruciunilordeatribuirecontinupentrulogicasimplcombinaional
Utilizareaatribuirilornonblocantepentrulogicasecvenialiacelorblocantepentrulogicede
tipcombinaional
Anusemixaatribuiriblocanteinonblocantenacelaiblocalways
Atenielaatrbuirimultiplelaaceeaivariabil
Asedefininmodexplicitconstruciileifelseicase
nsintezalogicnusuntsuportaitoiconstructorii.Acetiasunturmtorii:
Tipconstructor Observaii
initial Utilizatnumainprogrameledetest
events Utilizatnumainprogrameledetest
real Nesuportat
time Nesuportat
forceirelease Nesuportat
assignideassign
Nesuportat pentru tipul de date registru dar suportat
pentrutipuldedatewire
forkijoin
Nesuportat; a se utiliza atribuiri nonblocante n
vedereaaceluiaiefect
primitivesimple Suntsuportatenumaiprimitiveletippoart
UDP UDPitabelelenusuntsuportate

Sintezalogicanusuportnicioperatorii===i!==.
Furnizoriidetooluriiutilizatoriidetooluripotdefinitaskuriifunciispecificetooluluilor,cumarfi
ieiridetextsauafiareformedeund.Taskurilesistemifunciilencepcusimbolul$.
78

Utilizatorii pot defini taskuri i funcii predefinite (builtin) utiliznd interfaa Verilog PLI
(ProgrammingLnaguageInterface).
Pentru a controla cum vor interpreta modelele Verilog se furnizeaz directive de compilare. Acestea
ncepcusimbolul`
BIBLIOGRAFIE
1.CadenceDesignSystems,Inc.,VerilogXLReferenceManual.
2. Open Verilog International (OVI), Verilog HDL Language Reference Manual (LRM), 15466 Los Gatos
Boulevard, Suite 109071, Los Gatos, CA 95032; Tel: (408)3538899, Fax: (408) 3538869, Email:
OVI@netcom.com,$100.
3. Dr. Hyde, C., Daniel, Handbook on Verilog HDL, Computer Science Department, Bucknell University,
Lewisburg,PA17837,August25,1995,UpdatedAugust23,1997.
4.Sternheim,E.,R.Singh,Y.Trivedi,R.MadhavenandW.Stapleton,DigitalDesignandSynthesiswith
VerilogHDL,publishedbyAutomataPublishingCo.,Cupertino,CA,1993,ISBN096274882X,$65.
5. Thomas, Donald E., and Philip R. Moorby, The Verilog Hardware Description Language, second
edition, published by Kluwer Academic Publishers, Norwell MA, 1994, ISBN 07923 95239, $98,
includesDOSversionofVeriWellsimulatorandprogramsondiskette.
6.Bhasker,J.,AVerilogHDLPrimer,StarGalaxyPress,1058TreelineDrive,Allentown,PA18103,1997,
ISBN0965627748,$60.
7.WorldWideWebPages:
SutherlandHDL,Inc.http://www.sutherlandhdl.com/online_ref_guide/vlog_ref_top.html
ALDEC,Inc.http://www.aldec.com/products/tutorials/
AWC,Inc.http://tutor.alwilliams.com/wpv1.htm
CadenceDesignSystems,Inc.http://www.cadence.com/
Synopsis,Inc.http://www.synopsis.com
Xilinx,Inc.http://www.xilinx.com
Department of Electrical Engineering in the University of Edinburgh, Scotland, UK
http://www.see.ed.ac.uk/~gerard/Teach/Verilog/manual/index.html

79

80

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