Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

271
Dan Nicula Gheorghe Toac¸ se ELECTRONIC ˘ A DIGITAL ˘ A VOL. II VERILOG HDL EDITURA TEHNIC ˘ A - 2005

Transcript of Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

Page 1: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

Dan Nicula Gheorghe Toacse

ELECTRONICA DIGITALA

VOL. II

VERILOG HDL

EDITURA TEHNICA - 2005

Page 2: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

II

Aceasta pagina va fi ınlocuita . II

Page 3: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

III

Si aceasta pagina va fi ınlocuita. III

Page 4: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

Inca o pagina ce va fi ınlocuita. IV

Page 5: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

Prefata

VERILOG, VERY-LOGIC HDL (”limbaj de descriere hardware foarte lo-gic”): un nume extraordinar de bine ales pentru un limbaj care a devenit astazi fun-damental pentru proiectarea circuitelor integrate digitale.

Acum 10 ani, ın 1995, scriam ın prefata unei carti: ”Limbajul VHDL permite oexprimare sintetica ın electronica digitala atat la nivel inferior, de poarta logica, catsi la nivel superior, de sistem. Tehnicile de proiectare automata ın electronica nu potfi aplicate fara existenta unui astfel de limbaj”.

Acum 7 ani, ın 1998, predam beneficiarului un proiect scris ın VHDL. In fazade depanare, beneficiarul ımi cere: ”Adauga un registru pe aceasta iesire”. ”Nici oproblema”, zic si ıncep sa scriu urmatoarea portiune de cod VHDL:

-- acesta este modelul VHDL al unui registru de 8 bitisignal extraFf : std_logic_vector(7 downto 0);process(clk, reset)begin

if (reset = ’1’) thenextraFf <= (others => ’0’);

elsif (clk’event and (clk = ’1’)) thenextraFf <= semnal;

end if;end process;iesire <= extraFf;

Am fost lasat sa termin si apoi am fost ıntrebat: ”Vrei sa vezi cum se scrie acelasilucru ın Verilog?”. Iata cum a fost rasplatita curiozitatea mea:

// acesta este modelul VerilogHDL al unui registru de 8 bitialways @(posedge clk or posedge reset)if (reset) iesire <= 0; else

iesire <= semnal;

Acum 6 ani, ın 1999, mi s-a cerut proiectarea unui sistem digital cu cerinta ex-presa: ”a se descrie ın Verilog”. Reactia mea a fost imediata: ”- Nu stiu Verilog”.Replica a venit si mai rapid: ”- Dar stii VHDL. Verilog este foarte logic. Vei ınvatalimbajul repede”. In mai putin de doua zile, eram ”fluent” ın Verilog ca si ın VHDL.Pentru mine ca inginer, ”descoperirea” Verilog a ınsemnat ınceputul unei noi ere. Oera aflata sub semnul ”simplificarii” proiectarii.

Acum, ın 2005, am inclus ın acest volum o parte din experienta mea de utilizatoral limbajului Verilog HDL ın proiectarea de circuite integrate digitale.

Cat timp proiectantii si companiile lor vor avea ca obiectiv producerea unor bunuride calitate mare ıntr-un timp scurt, Verilog va continua sa fie o solutie dominanta.Intreaga comunitate a firmelor de productie de procesoare, calculatoare, circuite speci-fice ASIC utilizeaza Verilog ca principal limbaj de modelare.

Page 6: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

VI Electronica digitala

In prezent, Verilog este un limbaj folosit ın toate etapele de proiectare a circuitelorintegrate digitale:

• specificatii;

• modelarea RTL;

• generare de vectori de test;

• mediu de simulare;

• module de monitorizare/verificare;

• netlist post-sinteza;

• biblioteci de componente specifice tehnologiei;

• model temporal cu parametrii actualizati conform implementarii;

• documentare.

Pentru un utilizator care ınvata pentru prima oara un limbaj de descriere hard-ware, alegerea Verilog este foarte justificata. Simplitatea si apropierea acestuia dehardware permit utilizatorului ıncepator atat concentrarea asupra proiectarii arhitec-turale, cat si satisfactia unei eficiente a proiectarii. Utilizatorii avansati gasesc ınVerilog satisfactia unui limbaj matur, folosit ın mod curent pentru proiectarea unorcircuite integrate reale.

Pentru utilizatorii ıncepatori, acest volum prezinta o pagina cu limbajul Verilogcondensat, pagina ce se doreste a fi o referinta rapida pentru proiectantul VerilogHDL.

Utilizatorii avansati pot gasi ın aceasta carte solutii eficiente, optimizate pentruimplementare hardware, la probleme ce par simple la nivel algoritmic. Modelareapentru sintetizabilitate si modelarea pentru obtinerea unui circuit care sa functionezela frecventa maxima sunt doua idei pe care s-a concentrat acest volum.

Toate portiunile de cod si mediile de testare asociate pot fi accesate pe situl cartii.La aceeasi adresa se gasesc indicatii pentru obtinerea unei licente de evaluare a unuisimulator Verilog. Situl web al acestei cartii este:

http://vega.unitbv.ro/electronica_digitala

Anexa din finalul acestui volum prezinta simularea unei porti inversoare ın SPICE.Anexa este realizata cu contributia dl. Corneliu ZAHARIA.

Acest volum este rodul anilor de predare a cursurilor de ”Limbaje de descrierehardware” si ”Proiectarea circuitelor integrate”, la specializarea Ingineria Calcula-toarelor de la Universitatea TRANSILVANIA din Brasov. Experienta contactului culumea reala a proiectantilor de circuite integrate digitale a fost asigurata prin partici-parea la activitatea de cercetare si dezvoltare a firmei eASIC (http://www.easic.com).Probleme practice avansate, prezentate ın ultimul capitol al acestui volum, au fostıntalnite ın activitatea curenta la aceasta firma.

Brasov, Septembrie 2005. Autorii

Page 7: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

Cuprins

1 INTRODUCERE1.1 Ce este Verilog? 11.2 De ce HDL? 31.3 Terminologia Verilog 6

1.3.1 Aspectul temporal 61.3.2 Concurenta evenimentelor 71.3.3 Modulul 7

1.4 Mediul de simulare a modelelor HDL 211.5 Comparatie Verilog-VHDL 21

2 FUNDAMENTELE LIMBAJULUI VERILOG HDL2.1 Conventii lexicale 252.2 Structura codului Verilog 252.3 Setul de valori 26

2.3.1 Numere ıntregi 262.3.2 Numere reale 272.3.3 Siruri 28

2.4 Tipuri de date si obiecte 282.5 Operatori 34

2.5.1 Operatori aritmetici 342.5.2 Operatori relationali 382.5.3 Operatori de egalitate 382.5.4 Operatori logici 392.5.5 Operatori logici pe vectori 402.5.6 Operatori de reducere 412.5.7 Operatori de deplasare 422.5.8 Operator conditional 432.5.9 Operatori de concatenare si replicare 43

2.6 Specificatii concurente 442.7 Specificatii secventiale 47

2.7.1 Specificatii de atribuire secventiale 472.7.2 Specificatii conditionale 532.7.3 Specificatii de selectie 562.7.4 Specificatii de iteratii 572.7.5 Specificatii de control temporal 59

Page 8: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

VIII Electronica digitala

2.8 Directive de compilare 632.8.1 ‘define si ‘undefine 632.8.2 ‘ifdef, ‘ifndef, ‘else, ‘endif 652.8.3 ‘include 662.8.4 ‘timescale 66

2.9 ”Stil si calitate” 67

3 MODELAREA CIRCUITELOR ELEMENTARE3.1 Circuite combinationale 79

3.1.1 Modelarea circuitelor logice cu assign 793.1.2 Modelarea circuitelor logice cu always 80

3.2 Circuite de multiplexare 813.3 Codificator/decodificator 813.4 Latch D 853.5 Bistabil D/RS 863.6 Bistabil T/JK 883.7 Numaratoare sincrone 893.8 Automate secventiale sincrone 94

3.8.1 Semi-automat descris cu o singura specificatie 943.8.2 Modelarea iesirilor automatelor 963.8.3 Modelarea automatelor ca registru de stare si circuit

combinational 983.8.4 Automat cu stari codificate ”one-hot” 100

4 NOTIUNI AVANSATE DE VERILOG4.1 Task-uri si functii 1034.2 Modelarea memoriilor 1074.3 Generarea structurilor hardware 1094.4 Modelarea la nivel de poarta logica 113

4.4.1 Porti cu intrari multiple 1134.4.2 Porti cu iesiri multiple 1134.4.3 Porti cu iesiri ın trei stari 1144.4.4 Porti cu iesiri fixe 114

4.5 Modelarea la nivel de tranzistor 1154.6 Task-uri si functii de sistem 118

4.6.1 Task-uri de afisare 1194.6.2 Task-uri de accesare a fisierelor 1204.6.3 Task-uri pentru controlul simularii 1224.6.4 Task-uri pentru verificari temporale 1224.6.5 Functii referitoare la timpul simularii 1234.6.6 Functii pentru generarea numerelor aleatorii 123

4.7 Primitive definite de utilizator 1244.8 Accesarea semnalelor ın ierarhie 1264.9 Functii PLI 127

4.9.1 Crearea unei aplicatii PLI 1284.9.2 Apelarea aplicatiei PLI 132

4.10 Noutati introduse de standardul IEEE Verilog 1364-2001 133

Page 9: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

Cuprins IX

5 PROBLEME REZOLVATE5.1 Circuite de prelucrare a impulsurilor 135

5.1.1 Circuite formatoare de impulsuri 1355.1.2 Generarea unui semnal ın avans sau cu ıntarziere 138

5.2 Circuit secvential pentru recunoastere de pattern 1425.3 Verificator de protocol de comunicatie 1475.4 Generarea semnalului de transport al unui

numarator sincron 1505.5 Modelarea registrelor 151

5.5.1 Registrul paralel 1515.5.2 Registrul cu reactie, LFSR 152

5.6 Sincronizarea semnalelor la trecerea ıntre doua domenii de ceas1625.6.1 Sincronizarea unui semnal cu evolutie lenta la trecerea

dintr-un domeniu de ceas de frecventa scazuta ıntr-undomeniu de ceas de frecventa ridicata 163

5.6.2 Sincronizarea unui puls la trecerea dintr-un domeniu deceas de frecventa ridicata ıntr-un domeniu de ceas defrecventa scazuta 165

5.6.3 Sincronizarea unui puls la trecerea dintr-un domeniu deceas de frecventa scazuta ıntr-un domeniu de ceas defrecventa ridicata 170

5.6.4 Aplicatie la sincronizarea unui bus cu variatie lenta 1735.6.5 Aplicatie la sincronizarea unui bus cu variatie rapida

(FIFO) 1745.7 Interfatarea cu CPU 1815.8 Multiplicator secvential 1975.9 Modelarea si testarea memoriilor 2025.10 Modelarea multiplexoarelor 210

5.10.1 Multiplexor modelat cu valori neprecizate 2105.10.2 Multiplexor ın bucla cu bistabil 2125.10.3 Multiplexor pe bus 216

5.11 Controller pentru memorie SDRAM 2175.11.1 Modelul Verilog al controllerului SDRAM 2175.11.2 Mediul de testare al controllerului SDRAM 229

Anexa A MODELAREA SPICE A UNUI INVERSOR CMOSA.1 Modelul SPICE al tranzistoarelor MOS 239A.2 Ridicarea caracteristicii de sarcina IDS(VDS)

pentru tranzistorul NMOS 240A.3 Modelul SPICE al inversorului CMOS 244A.4 Determinarea caracteristicii de transfer si a parametrilor in-

versorului CMOS 245A.4.1 Nivelurile de tensiune 246A.4.2 Marginea de zgomot 247A.4.3 Timpul de propagare 247A.4.4 Consumul de putere 250A.4.5 Factorul de merit 251

Page 10: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

X Electronica digitala

Anexa B CUVINTE CHEIE REZERVATE ALE VERILOG HDL

Anexa C MEMENTO LIMBAJ VERILOG

Anexa D CONTINUT SIT CARTE

Page 11: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

Capitolul 1

INTRODUCERE

Aceasta parte a cartii nu se doreste a fi un manual complet al limbajului VerilogHDL,ci o sursa de ınvatare rapida si eficienta a descrierii circuitelor digitale. Cu bunastiinta, vor fi expuse doar acele caracteristici ale limbajului care sunt mai des folositela modelarea sistemelor digitale pentru sintetizabilitate.

Pe parcursul acestei parti apar urmatoarele semne care marcheaza pasaje cudiferite particularitati:

Vnµ´¶³

cod sursa Verilog;

Snµ´¶³

descrierea sintaxei unei specificatii Verilog;

Tnµ´¶³

paragraf care face referire la un modul de test existent pe situl de web al cartii.

Paragrafele de cod Verilog si referirea la numele variabilelor HDL sau la cuvintecheie vor fi marcate evidentiat prin scrierea acestora cu caractere tip typesetting. Deremarcat ca, ın aceste paragrafe de cod sursa, cuvintele ce contin caractere specificelimbii romane (a, a, ı, s, t) au fost ınlocuite cu caracterele de origine ale acestora (a,a, i, s, t). Motivul este acela ca Verilog nu suporta caracterele specific romanesti,nici macar sub forma de comentarii.

1.1 Ce este Verilog?

Un sistem digital se poate descrie fie schematic, fie textual. Datorita complexitatiisistemelor actuale, descrierea schematica nu mai permite gestionarea proiectelor mari.

In schimb, descrierea textuala are nenumarate avantaje, cel mai important fiindusurinta prelucrarii acestei descrieri de catre programele de calculator.

In prezent exista doua limbaje de descriere hardware (HDL = Hardware Descrip-tion Language) care acopera cea mai mare parte din proiectarea sistemelor digitale:

1

Page 12: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

2 CAPITOLUL 1. INTRODUCERE

Verilog si VHDL.Verilog este un limbaj de descriere hardware a carui denumire provine din con-

catenarea cuvintelor din limba engleza ”Very-logic” (foarte logic). VHDL este unlimbaj de descriere hardware a carui denumire provine din concatenarea literei ”V”(initiala abrevierii VHSIC = Very High Speed Integrated Circuits) si ”HDL”.

VHDL nu este o abreviere pentru ”Verilog HDL”. Verilog si VHDL sunt doualimbaje de descriere hardware diferite. Intre acestea exista multe asemanari dar existasi deosebiri.

In continuare, prin HDL se va face referire la limbajele de descriere hardware ıngeneral, incluzand atat Verilog, cat si VHDL.

Un limbaj de descriere hardware este un limbaj utilizat pentru descrierea unuisistem digital, ca de exemplu un calculator sau o componenta a acestuia. HDL nu esteun limbaj de programare pentru ca nu descrie programe rulate de un procesor. Codulsursa scris ın HDL nu trebuie numit ”program” (cu ıntelesul implicit de ”programpentru calculator”). Este recomandata denumirea codului sursa HDL ca ”model”, cuıntelesul de ”model al unui sistem hardware”.

Limbajele de descriere hardware ofera suportul pentru proiectarea circuitelor in-tegrate digitale. In HDL se poate descrie un sistem digital modelat la cel mai ınaltnivel, precizandu-se doar comportamentul abstract al acestuia. Mai detaliat, se poatedescrie ın HDL structura de registre a unui sistem digital si ecuatiile transferuluide informatii dintre registre. Acest nivel de descriere este denumit RTL (RegisterTransfer Level) si este destul de detaliat pentru a fi acceptat ca intrare de catreprograme de calculator care fac trecerea de la model la realizare fizica (sinteza).Dupa sinteza, descrierea sistemului digital implementat ıntr-o anumita tehnologie sepoate genera automat sub forma unui netlist HDL. Netlist (cuvant provenit din limbaengleza din concatenarea cuvintelor ”net”=legatura/retea si ”list”=lista) este denu-mirea unui model HDL particular: contine o descriere structurala a unor instantieride componente descrise ıntr-o biblioteca de componente specifice tehnologiei de re-alizare a circuitului integrat. Netlist-ul este generat automat de catre software. HDLofera posibilitatea descrierii unui sistem digital la nivel de porti logice si bistabile.Proiectantii de tehnologie folosesc tot HDL pentru a modela componentele primitiveale tehnologiei la nivel de sarme, tranzistoare, rezistoare.

Descrierea textuala a circuitelor electronice digitale ın HDL este folosita atat laproiectarea, cat si la sinteza, la verificarea functionala sau la analiza temporala aacestora.

Verilog este unul dintre cele doua cele mai folosite limbaje de descriere hardware.Parerile referitoare la avantajele si dezavantajele fiecaruia sunt foarte diverse. Sespune ca ”Verilog este mai usor de ınvatat” pentru ca este asa cum ıi spune numele”very logic”.

VHDL a fost standardizat ın 1987 sub numarul IEEE-1076. Ulterior, lipsa unortipuri de date general acceptate a fost rezolvata prin aparitia standardului IEEE-1164. VHDL este un limbaj a carui sintaxa seamana cu sintaxa limbajului ADA.Promovarea limbajului ca standard a fost facuta de catre Departamenul de Aparareal Statelor Unite.

Verilog HDL a avut o traiectorie diferita, el provenind din mediul industrial. Sin-taxa Verilog seamana cu sintaxa limbajului C.

Verilog a fost dezvoltat ca un limbaj de descriere proprietar de catre firma ameri-

Page 13: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

1.2. De ce HDL? 3

cana Gateway Design System Corporation ıntre 1983-1985.Succesul de care s-a bucurat simulatorul Verilog (Verilog-XL) produs de Gateway

Design Automation a determinat o crestere rapida a acestei firme. Ca efect, ın 1989,Cadence Design Systems (cea mai mare firma din domeniul productiei de softwarepentru suportul proiectarii de circuite integrate) a achizitionat atat firma GatewayDesign Automation, cat si limbajul Verilog HDL produs de catre aceasta.

In 1990, Cadence Design Systems a decis deschiderea limbajului Verilog HDL catrepublic. In 1991, se formeaza organizatia OVI (Open Verilog International) cu scopulde a promova si standardiza limbajul Verilog.

Verilog HDL este standardizat cu numarul IEEE-1364. In plus, acest standarddefineste o colectie de rutine software care permit interfatarea dintre Verilog si alteprograme (de obicei C). Colectia de rutine este cunoscuta sub numele de PLI (Pro-gramming Language Interface).

Standardizarea Verilog a determinat aparitia unor mici companii care ofereau si-mulatoare Verilog. Exista simulatoare care accepta descrieri mixte Verilog si VHDL.

1.2 De ce HDL?

Se pot remarca doua scopuri ale modelarii unui sistem digital:

• Realizarea sistemului cu cost minim ıntr-un timp scurt si

• Evitarea erorilor de proiectare.

Primul motiv nu mai are nevoie de nici un fel de comentariu. Viteza de crestereextrem de mare pentru domeniul circuitelor integrate este unanim recunoscuta. Oriceıntarziere a aparitiei unui produs nou pe piata poate aduce companiei producatoarepierderi ınsemnate.

Al doilea motiv nu este foarte usor de acceptat de catre cei mai familiarizati cudezvoltarea de produse software. Mai ın gluma, mai ın serios, se poate spune ca:”Hard-ul nu-i ca soft-ul”. O greseala gasita tardiv ın software, chiar dupa ce produsula fost livrat utilizatorului final poate fi usor remediata cu o noua versiune sau o”peticire” (”patch”, ın limba engleza). Noua versiune se poate distribui dintr-un sitde web, fara costuri prea mari pentru producatorul de software.

In general, ın hardware, greseala costa mult mai mult decat ın software. Pentru uncircuit dedicat pentru o aplicatie (ASIC = Application Specific Integrated Circuit),repararea unei greseli poate ınsemna refacerea integrala a circuitului si suportareaintegrala a costurilor extrem de mari de productie.

Versiunile ”alpha” sau ”beta” din productia de software sunt ınlocuite cu mii deore de verificare automata ın productia de hardware. Toate procedurile de verificareale circuitelor integrate contemporane se bazeaza pe existenta HDL si a modelelortextuale.

Derularea unui proiect pornind de la descrierea sa schematica presupune uti-lizarea unei metodologii de proiectare ”de jos ın sus” (”bottom-up”, ın limba engleza).Metodologia bottom-up presupune desenarea schemei modulelor elementare (cu sim-boluri de primitive existente ıntr-o biblioteca de tehnologie) si ulterior conectarea aces-tora pentru a forma sistemul. Este de neconceput aceasta abordare pentru proiectareaunui sistem mare, cum ar fi un procesor.

Page 14: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

4 CAPITOLUL 1. INTRODUCERE

Metodologia de proiectare a sistemelor digitale actuale, de mari dimensiuni este ometodologie ”de sus ın jos” (”top-down”, ın limba engleza). Metodologia top-downpresupune modelarea sistemului la nivel ınalt (comportamental) ınainte de a definidetaliile de implementare. Cateva din avantajele acestei metodologii sunt precizateın continuare:

• Sistemele digitale actuale nu mai pot fi stapanite prin descriere sche-matica. Limbajele HDL ofera suport pentru metodologia de proiectare top-down.

• Posibilitatea corectarii greselilor de conceptie ın faze foarte timpurii.Avand un model al ıntregului sistem, se poate evalua functionarea acestuia ınconexiune cu alte circuite. De exemplu, se poate simula functionarea unui ıntregprodus realizat sub forma de circuite integrate montate pe un cablaj imprimat,chiar daca unele componente nu sunt realizate.

• Multe sisteme actuale nu sunt exclusiv hardware, ci hardware - soft-ware. Existenta unui model de simulare al sistemului hardware ınainte caacesta sa fie realizat fizic, permite munca ın paralel a echipelor de dezvoltare desoftware si de hardware. Prin aceasta, dezvoltarea de software este suprapusa ıntimp peste dezvoltarea de hardware. Mai mult, se pot testa programele softwareımpreuna cu modelul de simulare hardware.

• Posibilitatea partajarii proiectarii si a lucrului ın echipa. Fiecare echipase poate concentra pe implementarea modulului ce i-a fost atribuit, avand tot-odata la dispozitie un model de simulare, de referinta, a ıntregului sistem.

• Independenta fata de tehnologia de implementare. De multe ori sedoreste conversia unui proiect dintr-o tehnologie ın alta. Motivele sunt di-verse: realizarea unui prototip cu dispozitive programabile ınainte de lansarea ınproductie ca un circuit specific sau realizarea aceluiasi produs ıntr-o tehnologiemai moderna sau mai ieftina. Conversia tehnologiei este posibila prin reuti-lizarea modelului HDL.

• Reutilizarea codului. Module cu o functie specifica pot fi utilizate de catreun proiectant ın mai multe produse sau chiar pot fi vandute ca module separate.De exemplu, proiectantul unui circuit cu acces USB va putea decide preluareaunui controller USB produs de alta firma, concentrandu-se pe aspectele specificeale circuitul sau.

In figura 1.1 este reprezentata grafic metodologia de proiectare ”top-down” a cir-cuitelor integrate digitale. Se remarca faptul ca descrierea textuala ın HDL esteprezenta ın toate etapele de proiectare.

• Specificatii. Uneori se includ portiuni de cod HDL ın specificatii pentru a seexemplifica functia unui modul.

• Modelarea RTL. Codul scris de proiectant se verifica prin simulare, iar ulteriorserveste ca intrare pentru programele de sinteza de hardware. Aceasta este etapaprincipala de proiectare a sistemului digital.

Page 15: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

1.2. De ce HDL? 5

Legenda:Specificatiide proiectare

ModelHDLRTL

Sintetizatorhardware

Netlist HDLla nivel de

poarta logica

Implementare

Bibiliotecade

componente

Bibliotecade

tehnologie

SimulatorHDL

SimulatorHDL

SimulatorHDL

Model HDLtemporal

Generatorde vectori

de test+

Monitorizare

Document

SoftwareEDA

Fisiercod HDL

Figura 1.1 Reprezentarea grafica a metodologiei de proiectare ”top-down” a circuitelorintegrate digitale. Pozitia HDL ın cadrul acestei metodologii.

• Generare de vectori de test. Modulul de proiectat trebuie testat ın con-junctie cu modele ale mediului exterior. Modelele care genereaza stimuli sedescriu tot ın HDL chiar daca nu ıntotdeauna vor fi sintetizate. CapabilitatileHDL ajuta proiectantul la realizarea unor generatoare de stimuli guvernate deanumite reguli sau chiar stimuli aleatorii. In plus, producatorii de circuite oferamodelele HDL ale acestora pentru a putea fi integrate ın simularea unor sistememari. Este cazul modelelor de memorie folosite la proiectarea controllerelor dememorie.

• Mediu de simulare. Testarea circuitului proiectat alaturi de modelele cir-cuitelor exterioare acestuia presupune crearea unui model HDL ce le include petoate acestea, cu precizarea conexiunilor. Forta unui mediu de simulare constasi ın posibilitatea configurarii acestuia, conform cerintelor beneficiarului (nu aleproiectantului).

• Module de monitorizare/verificare. Verificarea automata presupune e-xistenta unor module HDL care monitorizeaza aparitia unor conditii logice silanseaza mesaje de atentionare sau de eroare catre proiectant.

Page 16: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

6 CAPITOLUL 1. INTRODUCERE

• Netlist post-sinteza. Sintetizatorul converteste descrierea RTL ıntr-o des-criere structurala cu instantieri de componente din biblioteca de tehnologie.Proiectantul are obligatia de a verifica faptul ca netlistul are acelasi comporta-ment ca modelul RTL, prin simularea netlistului ın mediul de simulare ın carea validat modelul RTL.

• Biblioteci de componente specifice tehnologiei. Simularea netlistului pre-supune existenta descrierii HDL a fiecarei componente instantiate. Modelelecomponentelor sunt realizate de catre proiectantii de tehnologii ın diverse lim-baje de descriere hardware, suportate de metodologia aleasa de proiectant side catre programele EDA (EDA = Electronic Design Automation, totalitateaprogramelor ce ofera suport ın proiectarea circuitelor electronice).

• Model temporal cu parametrii actualizati conform implementarii.Post-implementare, dupa ce sunt cunoscute toate detaliile implementarii (pla-sare, rutare), este necesara o noua verificare, ınainte de a se transmite proiectulcatre fabricant. La acest nivel, este necesara cunoasterea ıntarzierilor atat aportilor logice si bistabilelor, cat si a sarmelor de interconectare a acestora.

• Documentare. Realizarea unui proiect presupune scrierea unei documentatiicare sa ınsoteasca produsul. La aceasta documentatie va face apel si proiec-tantul ın cazul aparitiei unor defecte sau a lansarii ın executie a unei versiunisuperioare. Codul HDL, ca documentare a proiectului, este o resursa valoroasapentru ca permite simularea unei situatii reale care nu a fost testata anterior.

1.3 Terminologia Verilog

Verilog, ca un limbaj de descriere hardware, are caracteristici conceptual diferite decele ale limbajelor de programare (software). Principalele caracteristici ale HDL suntaspectul temporal si concurenta evenimentelor.

1.3.1 Aspectul temporal

Orice componenta hardware are un timp de propagare. Transferul datelor ıntrediferite componente hardware se face prin sarme de conexiune care au si ele o a-numita ıntarziere. Valoarea si combinarea acestor ıntarzieri determina functionareasau nu a circuitului modelat, la frecventa necesara.

Variabilele (semnalele) Verilog modeleaza sarmele de interconexiune ale modulelor.Din acest motiv, specificatiile de atribuire de semnal pot modela si ıntarzierile. InVerilog, unitatile de timp sunt relative, raportate la unitatea fizica de timp specificataprin directiva ‘timescale.

Circuitele logice combinationale pot fi modelate tinand cont de ıntarzierile exis-tente. Ca exemplu, se prezinta modelul structurii interne a unui multiplexor, modelatcu porti logice cu ıntarzieri asociate.

// #<N> = <N> unitati de timpassign #1 s_n = ~s; // ~ simbolul operatorului logic NOTassign #2 w0 = i0 & s_n; // & simbolul operatorului logic AND

Page 17: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

1.3. Terminologia Verilog 7

assign #2 w1 = i1 & s;assign #2 y = w0 | w1; // | simbolul operatorului logic OR

1.3.2 Concurenta evenimentelor

Programele software sunt prin excelenta secventiale. Acest lucru este determinat defaptul ca procesoarele executa programe secventiale. Sistemele hardware sunt con-curente. Fiecare poarta logica ısi executa propria functie logica ın mod independentde existenta altor porti logice.

Un proiectant de software descrie ın codul sursa un algoritm secvential, ceea ce vagenera, ın final, un program secvential executat de un procesor.

Un proiectant de hardware descrie un comportament al unui sistem digital ce vagenera, ın final, o structura de porti si bistabile interconectate. Limbajele de descrierehardware au facilitati de gestiune a evenimentelor concurente.

Specificatiile existente ın corpul modulelor (cod sursa) Verilog sunt concurente(se executa toate la acelasi moment al timpului de simulare, iar ordinea acestora ıncodul sursa nu este relevanta).

De exemplu, portiunea de cod ce urmeaza este echivalenta (si ca rezultat alsimularii si ca hardware generat prin sinteza) cu structura modelata anterior.

assign #2 y = w0 | w1;assign #2 w0 = i0 & s_n;assign #1 s_n = ~s;assign #2 w1 = i1 & s;

Pentru a usura munca proiectantului de hardware (care este tentat sa aiba ogandire algoritmica secventiala), limbajul Verilog prevede existenta unei specificatiiconcurente care ınglobeaza specificatii secventiale. Specificatia always este o specifi-catie concurenta. Specificatiile ce apar ın corpul acesteia sunt specificatii secventiale(ordinea ın care apar acestea ın codul sursa este relevanta). Executia specificatieialways consta ın executarea secventiala a tuturor specificatiilor continute de aceastapana la sfarsit sau pana la aparitia unei specificatii de ıntarziere.

1.3.3 Modulul

Urmatorul paragraf prezinta traducerea capitolului 1, ”Prezentare generala” a docu-mentului initial editat de OVI (Open Verilog International) sub titlul de manual dereferinta al limbajului Verilog (LRM = Language Reference Manual), versiunea 1.0,noiembrie 1991.

Verilog HDL descrie un proiect hardware sau o parte de proiect. Descrierile proiec-telor ın Verilog HDL sunt modele Verilog. Verilog HDL este atat un limbaj comporta-mental, cat si structural. Modelele Verilog HDL pot descrie atat functia unui proiect,cat si componentele si conexiunile dintre componentele unui proiect. Modelele Verilogpot fi dezvoltate pe diferite nivele de abstractizare. Aceste nivele de abstractizare sitipurile de modele ce le corespund sunt urmatoarele:

Page 18: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

8 CAPITOLUL 1. INTRODUCERE

• algoritmic: un model care implementeaza un algoritm al proiectului prin con-structii de nivel ınalt ale limbajului;

• RTL: un model care descrie ”curgerea” datelor ıntre registre si modul de proce-sare a acestora;

• nivel de poarta: un model care descrie portile logice si conexiunile dintre portilogice ıntr-un proiect;

• nivel de comutare: un model care descrie tranzistoarele si nodurile de stocare(a informatiei) dintr-un dispozitiv si conexiunile dintre ele.

Blocul elementar de constructie ın Verilog HDL este modulul. Formatul modululuifaciliteaza proiectarea ”top-down” si ”bottom-up”. Un modul contine modelul unuiproiect sau a unei parti de proiect. Modulele pot ıncorpora alte module pentru a formaun model ierarhic care descrie cum se includ componentele unui proiect ın ansamblulproiectului. Constructiile Verilog HDL, asa cum sunt declaratiile si specificatiile, suntincluse ın module. Limbajul Verilog HDL comportamental este un limbaj structuratsi procedural, la fel ca limbajul de programare C.

Constructiile comportamentale ale limbajului sunt utilizate ın cadrul modeleloralgoritmice si RTL. Limbajul comportamental are urmatoarele capabilitati:

• proceduri structurate pentru executie secventiala sau concurenta;

• controlul explicit al timpului la care se activeaza o procedura, specificat atat deexpresii ce desemneaza ıntarzieri, cat si de schimbarile valorii care determinaevenimente;

• evenimente desemnate explicit sa determine activarea si dezactivarea actiunilorın cadrul altor proceduri;

• constructii procedurale pentru operatii conditionale, de decizie, de selectie saude iteratii;

• proceduri denumite task-uri care pot avea parametrii si durate non-zero;

• proceduri denumite functii care permit definirea unor noi operatori;

• operanzi aritmetici, logici, pe biti si de reducere pentru constructia de expresii.

Constructiile structurale ale Verilog HDL sunt utilizate pentru modelele la nivelde poarta si la nivel de comutare. Limbajul structural are urmatoarele capabilitati:

• un set complet de primitive combinationale;

• primitive pentru poarta de transmisiune si dispozitive rezistive;

• abilitatea de a modela structuri MOS.

In Verilog HDL, acuratetea modelarii structurale este ımbunatatita de specificatiide ıntarzieri prin primitive si precizari ale tariei porturilor de iesire. Valorile sem-nalelor pot avea diferite tarii si o gama completa de valori ambigue pentru a reducepesimismul conditiilor necunoscute.

Page 19: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

1.3. Terminologia Verilog 9

Definirea unui modul este inclusa ıntre cuvintele cheie module si endmodule. Iden-tificatorul ce urmeaza cuvantului cheie module reprezinta numele modulului. Se reco-manda utilizarea unor nume sugestive pentru comportamentul sau structura modu-lului. Optional, modulul poate contine o lista de porturi de intrare/iesire. Ordineaporturilor poate fi semnificativa la instantierea modulului. Din acest motiv, se reco-manda o asociere explicita ıntre porturi si sarme ın momentul instantierii unui modul.Identificatorii din lista de porturi trebuie declarati ca intrari, iesiri sau bidirectionaliın partea de definitii a modulului. Sintaxa completa a declaratiei unui modul esteprezentata ın continuare:

Snµ´¶³

<modul>::= module <nume_modul><lista_porturi>? ;

<articol_modul>*endmodule

<nume_modul>::=<IDENTIFICATOR>

<lista_porturi>::=(<port><,<port>>*)

<articol_modul>::=<declaratie_parametru>||=<declaratie_port_intrare>||=<declaratie_port_iesire>||=<declaratie_port_bidirectional>||=<declaratie_conexiune>||=<declaratie_conexiune_reg>||=<declaratie_timp>||=<declaratie_intreg>||=<declaratie_real>||=<declaratie_eveniment>||=<instantiere_poarta>||=<instantiere_primitiva>||=<instantiere_modul>||=<redefinire_parametru>||=<atribuire_continua>||=<bloc_specify>||=<specificatie_initial>||=<specificatie_always>||=<task>||=<functie>

<lista_porturi> este o lista de declaratii de nume de porturi despartite prinvirgula. Directia si dimensiunea porturilor este declarata ulterior ın corpul modulului.

In corpul modulului pot aparea urmatoarele articole:

Page 20: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

10 CAPITOLUL 1. INTRODUCERE

• <declaratie_parametru>: Parametrul este o constanta de modul care poateavea o valoare implicita ce poate fi modificata ın momentul instantierii modu-lului. Doua instante ale aceluiasi modul pot avea valori diferite ale unui para-metru.

Modificarea parametrului se poate face cu <asociere_parametru_valoare> saucu <redefinire_parametru>.

Exemple:

//Modificarea parametrului prin <asociere_parametru_valoare>sumator #(8) U1Sumator (...); // instanta de sumator pe 8 bitisumator #(4) U2Sumator (...); // instanta de sumator pe 4 biti

//Modificarea parametrului prin <redefinire_parametru>defparam U2Sumator.width = 16;sumator U2Sumator (...); // instanta de sumator pe 16 biti

• <declaratie_port_intrare>, <declaratie_port_iesire>,

<declaratie_port_bidirectional>: Declaratiile directiei si ale dimensiunilorporturilor.

Exemple:

input cpuClk_i; // intrare pe 1 bitinput reset_ni; // intrare pe 1 bitinput[15:0] cpuAddr_i; // bus de intrare pe 16 bitiinout[31:0] data_io; // bus de date bidirectional de 32 bitioutput rdy_o; // iesire pe 1 bit

De remarcat ca denumirea porturilor a fost aleasa astfel ıncat sa contina infor-matia referitoare la directia portului, informatie foarte utila la gestionarea unuicod de dimensiuni mari. Mai multe recomandari referitoare la scrierea coduluiVerilog se gasesc ın sectiunea 2.9.

• <declaratie_conexiune>, <declaratie_conexiune_reg>,

<declaratie_timp>, <declaratie_intreg>, <declaratie_real>: Declaratii-le de variabile Verilog modeleaza atat sarme fizice sau abstracte, cat si obiectefolosite la modelarea comportamentala de nivel ınalt (generatoare de vectori detest ce nu vor fi sintetizate). Descrierea tipurilor de date si a obiectelor Verilogeste prezentata ın sectiunea 2.4.

• <declaratie_eveniment>: Declarare de conditii (evenimente) care pot deter-mina o actiune. Evenimentele se declara prin cuvantul rezervat event.

• <instantiere_poarta>, <instantiere_primitiva>, <instantiere_modul>:

Instantierea unei porti logice definite ın limbaj, a unei primitive definite deutilizator sau a unui modul reprezinta mecanismul de descriere a structurii unuimodul. Sintaxa specificatiei de instantiere de modul este prezentata ın continu-area acestei sectiuni.

Page 21: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

1.3. Terminologia Verilog 11

• <redefinire_parametru>: Redefinirea explicita a unui parametru al unui mo-dul ın momentul instantierii acestuia se face folosind cuvantul cheie defparamurmat de numele instantei modulului, numele parametrului si valoarea acestuia.

• <atribuire_continua>: Atribuirea continua este introdusa prin cuvantul cheieassign si este prezentata ın sectiunea 2.6.

• <bloc_specify>: Timpii de propagare din interiorul unui modul pot fi declaratiıntr-un bloc dedicat, folosind grupul de cuvinte cheie specify si endspecify.

• <specificatie_initial>: Specificatia concurenta initial nu este sinteti-zabila. Ea este folosita pentru descrierea comportamentului modulelor caregenereaza vectori de test. Specificatia initial este descrisa ın sectiunile 2.6 si2.7.

• <specificatie_always>: Specificatia concurenta always implementeaza unmecanism de includere a uneia sau a mai multor specificatii secventiale ıntr-unbloc ce se executa concurent cu celalalte specificatii concurente. Specificatiaalways este descrisa ın sectiunile 2.6 si 2.7.

• <task>, <functie>: Un task este similar cu o procedura C: permite includereaunei sectiuni de cod ın diferite locuri ale descrierii modulului. O functie estesimilara cu un task, dar spre deosebire de acesta, functia returneaza o singuravaloare, nu poate contine ıntarzieri (se executa ıntr-un timp nul) si nu poateapela task-uri. Task-urile si functiile Verilog sunt descrise ın sectiunea 4.1.

Instantierea modulului ıntr-un alt modul permite crearea unei ierarhii ın structuraproiectului. Nu se pot defini module care sa se includa pe ele ınsele (imbricate). Odefinire de modul nu poate contine o alta definire de modul ıntre cuvintele sale cheiemodule si endmodule. Un modul include alt modul prin instantierea unei copii aacestuia. Procesul este similar cu plantarea unor capsule de circuite integrate pe oplaca. Acelasi tip de circuit poate fi plasat de mai multe ori pe un cablaj imprimat,eventual avand conectari diferite. Similar, un modul poate fi instantiat de mai multeori ın unul sau mai multe module diferite, instantele putand avea parametrii diferiti.

Specificatia <instantiere_modul> creeaza una sau mai multe instantieri (aparitii)ale modulului. De exemplu, un model de bistabil D se poate instantia de 16 ori pentrua genera un registru de 16 biti.

Sintaxa specificatiei de instantiere de modul este prezentata ın continuare:

Snµ´¶³

<instantiere_modul>::= <nume_modul> <asociere_parametru_valoare> ? <instanta_modul><,<instanta_modul>>* ;

<nume_modul>::= <IDENTIFIER>

<asociere_parametru_valoare>::= # ( <expresie> <,<expresie>>* )

Page 22: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

12 CAPITOLUL 1. INTRODUCERE

<instanta_modul>::= <nume_instanta> ( <lista_conexiuni_modul>? )

<nume_instanta>::= <IDENTIFICATOR>

<lista_conexiuni_modul>::= <conexiune_port_prin_pozitie> <,<conexiune_port_prin_pozitie>>*||= <conexiune_port_prin_nume> <,<conexiune_port_prin_nume>>*

<conexiune_port_prin_pozitie>::= <expresie>||= <NULL>

<conexiune_port_prin_nume>::= .<IDENTIFICATOR> ( <expresie> )

In continuare sunt prezentate cateva exemple de module Verilog care descriu cir-cuite digitale elementare.

• Modul vot majoritar cu trei intrari: descriere algoritmica a propagarii datelor.

Vnµ´¶³

module votMajoritar3Df (i1, // intrare de vot 1i2, // intrare de vot 2i3, // intrare de vot 3decizie // decizie in urma votului

);input i1, i2, i3;output decizie;

wire vot12;wire vot13;wire vot23;

assign vot12 = (i1 & i2); // operator ANDassign vot13 = (i1 & i3);assign vot23 = (i2 & i3);

assign decizie = vot12 | vot13 | vot23; // operator OR

endmodule

• Modul vot majoritar cu trei intrari: descriere cu porti logice definite ın limbaj.

Page 23: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

1.3. Terminologia Verilog 13

Vnµ´¶³

module votMajoritar3Gl (i1, // intrare de vot 1i2, // intrare de vot 2i3, // intrare de vot 3decizie // decizie in urma votului

);input i1, i2, i3;output decizie;

wire vot12;wire vot13;wire vot23;

and (vot12, i1, i2); // vot12 = i1 and i2and (vot13, i1, i3);and (vot23, i2, i3);or (decizie, vot12, vot13, vot23);

endmodule

Tnµ´¶³

La testarea celor doua module votMajoritar3Df si votMajoritar3Gl, ınmediul de testare testVotMajoritar, se observa aparitia glitch-urilor de hazardcombinational pe iesirile ambelor module testate. De remarcat si variatia vari-abilelor declarate pentru a monitoriza numarul de cazuri testate. Ca referinta,figura 1.2 prezinta formele de unda obtinute prin simulare.

Figura 1.2 Vot majoritar: forme de unda rezultate ın urma testarii.

• Numarator sincron reversibil cu presetare: descrierea comportamentala.

Vnµ´¶³

module upDnCounterPreset (clk, // intrare de ceasreset_n, // semnal de reset asincron

Page 24: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

14 CAPITOLUL 1. INTRODUCERE

upDn_n, // sens de numarare: 1=crescator, 0=descrescatorld, // semnal de presetaredi, // valoare presetataen, // validarea numarariicount // iesirea numaratorului

);

input clk;input reset_n;input upDn_n;input ld;input[3:0] di;input en;output[3:0] count;reg[3:0] count;

// ld en upDn_n clk | count*// -------------------------------// 1 x x ^ | di// 0 1 1 ^ | count + 1// 0 1 0 ^ | count - 1// 0 0 x ^ | count

always @(posedge clk or negedge reset_n) beginif (!reset_n) begin // reset asincron

count <= 4’b0;endelse begin

if (ld) begin // preset sincroncount <= di;

endelse beginif (en) begin // numarare validata

if (upDn_n) begin // numarare in sens crescatorcount <= count + 1;

endelse begin // numarare in sens descrescator

count <= count - 1;end

endend

endend

endmodule

Page 25: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

1.3. Terminologia Verilog 15

Tnµ´¶³

Ca referinta, figura 1.3 prezinta formele de unda obtinute prin simulare.

Figura 1.3 Numarator: forme de unda rezultate ın urma testarii.

• Sumator complet de 1 bit: descriere comportamentala cu operator aritmetic.

Vnµ´¶³

module add1C (a, // primul operandb, // al doilea operandci, // transport de intrares, // rezultatulco // transport de iesire

);

input a;input b;input ci;output s;output co;

assign {co, s} = a + b + ci; // suma celor 3 intrari,// reprezentata pe 2 biti,// este atribuita// concatenarii bitilor co si s

endmodule

• Sumator complet de 1 bit: descriere la nivel de porti logice.

Vnµ´¶³

module add1Gl (a, // primul operandb, // al doilea operandci, // transport de intrares, // rezultatulco // transport de iesire

Page 26: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

16 CAPITOLUL 1. INTRODUCERE

);

input a;input b;input ci;output s;output co;

wire c1;wire c2;wire c3;

xor sum (s, a, b, cin); // s = a xor b xor cin

and (c1, a, b); // c1 = a and b;and (c2, a, cin); // c2 = a and cin;and (c3, b, cin); // c3 = b and cin;or (co, c1, c2, c3); // co = c1 or c2 or c3;

endmodule

• Sumator de 4 biti: descriere structurala cu instantieri de sumatoare de 1 bit.

Vnµ´¶³

module add4St (a, // primul operandb, // al doilea operandci, // transport de intrares, // rezultatulco // transport de iesire

);

input[3:0] a;input[3:0] b;input ci;output[3:0] s;output co;

wire[2:0] cr; // transport intermediar intre biti

// instanta bit 0add1Gl add1Gl_0 (

.a (a[0] ),

.b (b[0] ),

.ci (ci ),

.s (s[0] ),

Page 27: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

1.3. Terminologia Verilog 17

.co (cr[0] ));

// instanta bit 1add1Gl i_add1Gl_1 (

.a (a[1] ),

.b (b[1] ),

.ci (cr[0] ),

.s (s[1] ),

.co (cr[1] ));

// instanta bit 2add1Gl i_add1Gl_2 (

.a (a[2] ),

.b (b[2] ),

.ci (cr[1] ),

.s (s[2] ),

.co (cr[2] ));

// instanta bit 3add1Gl i_add1Gl_3 (

.a (a[3] ),

.b (b[3] ),

.ci (cr[2] ),

.s (s[3] ),

.co (co ));endmodule

• Sumator de dimensiuni generice: descriere comportamentala parametrizabila.

Vnµ´¶³

module addxC (a, // primul operandb, // al doilea operandci, // transport de intrares, // rezultatulco // transport de iesire

);

parameter width = 8;// valoare implicita a parametrului// valoarea actuala poate fi schimbata la instantiere

Page 28: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

18 CAPITOLUL 1. INTRODUCERE

input[width-1:0] a;input[width-1:0] b;input ci;output[width-1:0] s;output co;

assign {co, s} = a + b + ci;

endmodule

• Multiplexor 2x1: descriere comportamentala.

Vnµ´¶³

module mux2x1C (i0, // intrare de date 0i1, // intrare de date 1s, // intrare de selectiey // iesire

);

input i0;input i1;input s;output y;

assign y = s ? i1 : i0;

endmodule

• Multiplexor 2x1: descriere cu porti logice definite ın limbaj.

Vnµ´¶³

module mux2x1Gl (i0, // intrare de date 0i1, // intrare de date 1s, // intrare de selectiey // iesire

);

input i0;input i1;input s;output y;

wire s_n;

Page 29: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

1.3. Terminologia Verilog 19

wire s0, s1;

not (s_n, s);nand (s0, i0, s_n); // s0 = not(i0 and s_n)nand (s1, i1, s);nand (y, s0, s1);

endmodule

• Multiplexor2x1: descriere cu primitive definite de utilizator.

Vnµ´¶³

module mux2x1tUdp (i0, // intrare de date 0i1, // intrare de date 1s, // intrare de selectiey // iesire

);

input i0;input i1;input s;output y;

mux2x1 (y, i0, i1, s);

endmodule

primitive mux2x1 (y, i0, i1, s);output y; // primul port este iesireainput i0;input i1;input s;

table// i0 i1 s : y aceasta linie este doar un comentariu

0 ? 0 : 0;1 ? 0 : 1;? 0 1 : 0;? 1 1 : 1;0 0 x : 0;1 1 x : 1;

endtableendprimitive

• Multiplexor 4x1: descriere structurala cu primitive mux2x1 definite de utiliza-tor.

Page 30: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

20 CAPITOLUL 1. INTRODUCERE

Vnµ´¶³

module mux4x1tUdp (i0, // intrare de date 0i1, // intrare de date 1i2, // intrare de date 2i3, // intrare de date 3s, // intrare de selectiey // iesire

);

input i0;input i1;input i2;input i3;input[1:0] s;output y;

wire mux1;wire mux0;

mux2x1 (mux1, i2, i3, s[1]);mux2x1 (mux0, i0, i1, s[1]);mux2x1 (y, mux0, mux1, s[0]);

endmodule

• Multiplexor: descriere cu poarta de transmisiune.

Vnµ´¶³

module mux2x1tTg (i0, // intrare de date 0i1, // intrare de date 1s, // intrare de selectiey // iesire

);

input i0;input i1;input s;output y;

wire s_n;

// not (iesire, intrare)not (s_n, s);

Page 31: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

1.4. Mediul de simulare a modelelor HDL 21

// cmos (iesire, intrare, controlN, comtrolP)cmos(y, i0, s_n, s);cmos(y, i1, s, s_n);

endmodule

1.4 Mediul de simulare a modelelor HDL

Testarea unui model de sistem digital se face ıntr-un mediu de simulare similar cu omasa de laborator.

Ca exemplu, se considera studierea ın laborator a comportamentului unei portilogice. Pe langa circuitul de studiat, pe masa de laborator exista si aparate elec-tronice: sursa de alimentare, sursa de semnal, osciloscop. Conectarea aparatelor laporturile circutului de studiat se face cu sarme. Ansamblul circuit de studiat-aparateeste un sistem ınchis (nu exista conectoare cu ceva din exteriorul mesei).

Similar, ıntr-un mediu de simulare sunt instantiate trei tipuri de module:

• modelul sistemului de studiat;

• modele de generatoare de stimuli (similare generatoarelor de semnal);

• modele de monitorizare si verificare (similare aparatelor de masura si control).

Toate aceste module sunt instantiate (incluse) ıntr-un modul fara porturi (similarmesei de lucru din laborator). Conexiunile se fac ıntre porturile sistemului de studiatsi porturile corespunzatoare ale generatoarelor de stimuli sau ıntre porturile sistemuluide studiat si porturile monitoarelor/verificatoarelor de conditii.

Figura 1.4 prezinta grafic structura unui mediu de simulare Verilog. Modeluldispozitivului de testat este stimulat prin semnale provenite de la generatorul devectori de test. Optional, acesta poate verifica iesirile sistemului si genera stimuliın consecinta. Pentru verificari automate, se recomanda includerea unuia sau a maimultor module responsabile pentru verificarea datelor, a protocolului de comunicatiesau a altor conditii logice complexe. Monitoarele au numai porturi de intrare si ge-nereaza mesaje de eroare sau de atentionare, fara a modifica starea ansamblului.

Modulele generatoare de vectori de test pot prelua din fisiere diverse date folositepentru determinarea valorilor semnalelor generate. Modulele de monitorizare a sem-nalelor si de verificare pot scrie ın fisiere externe date sub diferite formate. In plus,aceste module pot afisa sau scrie ın fisiere mesaje informative, de atentionare sau deeroare.

1.5 Comparatie Verilog-VHDL

Exista nenumarate comparatii ıntre Verilog si VHDL. In acest paragraf nu se faceo comparatie completa a celor doua limbaje de descriere hardware. In schimb, seprezinta doua sisteme digitale mici (o poarta si un bistabil) modelate ın cele doualimbaje.

Avantaje evidente ale Verilog HDL:

Page 32: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

22 CAPITOLUL 1. INTRODUCERE

Monitorizare

verificaresi

de test

Generator de vectori

Modulsintetizabil

testat

Mediu de testare

Figura 1.4 Mediu de simulare: dispozitiv de testat, generator de vectori, monitor.

• tipuri de date simple si eficiente;

• porti logice definite ın limbaj;

• cod mai concentrat.

Avantaje evidente ale VHDL:

• suport puternic pentru descriere de vectori de test si lucru cu fisiere;

• posibilitatea modelarii sistemelor analogice sau de comanda si control (motoareelectrice, senzori).

Exemplu: Bistabil DVHDL Verilogentity dff is module dff (d, clk, q);

port (d, clk: in bit; q: out bit); input d, clk;end dff; output q;

architecture basic of dff isbegin

process (clk) always @(posedge clk)begin

if (rising_edge(clk)) thenq <= d; q <= d;

end if;end process;

end basic; endmodule

Page 33: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

1.5. Comparatie Verilog-VHDL 23

Exemplu: Poarta AND cu doua intrariVHDL Verilogentity and2 is module and2 (a, b, y);

port (a, b: in bit; y: out bit); input a, b;end and2; output y;

architecture basic2 of and2 isbegin

y <= a and b; assign y = a & b;end basic2; endmodule

Page 34: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...
Page 35: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

Capitolul 2

FUNDAMENTELELIMBAJULUI VERILOGHDL

2.1 Conventii lexicale

Ca orice limbaj, Verilog are un numar de atomi lingvistici. Acesti atomi pot fi opera-tori, delimitatori, comentarii, numere, siruri, identificatori sau cuvinte cheie rezervate.Toate cuvintele cheie rezervate sunt scrise cu minuscule. Lista tuturor cuvintelor cheieeste prezentata ın anexa B. Limbajul Verilog (spre deosebire de VHDL) este un lim-baj ”case-sensitive”: literele minuscule au semnificatie diferita de literele majusculecorespunzatoare.

Delimitatorii de atomi lingvistici sunt caracterul ”spatiu”, caracterul ”tabulator”si caracterul ”linie noua”. Cu exceptia prezentei acestora ın siruri de caractere, acestecaractere sunt ignorate.

Verilog suporta doua feluri de comentarii:

• Comentarii pe o singura linie. Comentariul se ıntinde de la aparitia a douacaractere ”slash” (//) si pana la sfarsitul liniei (marcat de caracterul ”linienoua”).

• Comentarii pe mai multe linii. Comentariul se ıntinde ıntre marcherul de ınceput/* si marcherul de sfarsit */. Comentariile pe linii multiple nu pot fi incluseunele ın altele.

2.2 Structura codului Verilog

In Verilog exista o singura entitate lingvistica: modulul. In afara modulului nupot exista decat directive de compilare. In interiorul modulului pot aparea atatspecificatii, cat si directive de compilare. Includerea ıntr-un cod sursa Verilog a co-dului Verilog existent ıntr-un alt fisier se face prin directiva de compilare ‘include.

25

Page 36: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

26 CAPITOLUL 2. FUNDAMENTELE LIMBAJULUI VERILOG HDL

Includerea unui fisier ın altul se face static, la compilare si este echivalenta cu copiereafisierului inclus ın pozitia ın care apare directiva de includere de fisiere.

Modulul contine atat descrierea interfetei cu mediul exterior (alte module), cat sicomportamentul sau structura sa. Toate declaratiile facute ıntr-un modul sunt localeacelui modul. Ca o consecinta, nu exista obiecte (semnale) globale ca ıntr-un programsoftware. Semnalele declarate cu acelasi nume, dar ın module diferite, sunt semnalediferite.

Intr-un modul pot fi instantiate alte module pentru a crea o structura ierarhica.Spre deosebire de VHDL, ın Verilog modulul nu are o declaratie explicita si nici

nu contine regiuni explicite pentru declaratii. Semnalele trebuie declarate ınainte deprima referire la acestea, dar declaratia poate fi facuta oriunde ın corpul modulului.

Exista doua tipuri de ”subprograme” utilizate ın mod similar cu procedurile sifunctiile C. Definirea subprogramelor are rolul de a condensa codul Verilog ın cazulnecesitatii repetarii unor portiuni identice de cod. Exista doua tipuri de subprogramemarcate de cuvintele rezervate: task si function.

2.3 Setul de valori

Verilog are un set de valori simplu, definit ın limbaj.

• 0: valoare logica 0 sau conditie falsa;

• 1: valoare logica 1 sau conditie adevarata;

• x: valoare logica necunoscuta;

• z: stare de ınalta impedanta.

Valoarea z la intrarea unei porti logice este interpretata ca fiind x. Caracterele xsi z pot fi minuscule sau majuscule.

Exista trei tipuri de constante ın Verilog:

• Numere ıntregi;

• Numere reale;

• Siruri.

Pentru a usura interpretarea acestora, se pot utiliza caractere de subliniere (_)pentru a desparti caracterele ce desemneaza constante. Caracterul de subliniere nupoate fi primul caracter.

2.3.1 Numere ıntregi

Numerele ıntregi pot fi scrise ın forma implicita ca numere reprezentate ın baza 10sau ca valori exprimate ıntr-o baza de numeratie precizata explicit. Numerele ıntregisunt echivalente cu scrierea acestora ın binar. Numerele negative sunt reprezentatesub forma de complement fata de 2.

Sintaxa reprezentarii numerelor ıntregi este:

Snµ´¶³

Page 37: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

2.3. Setul de valori 27

[dimensiune] ’<baza_de_numeratie> <valoare>

Un numar ın format cu baza explicita este totdeauna considerat pozitiv. Dacadimensiunea nu este precizata se considera o valoare implicita dependenta de imple-mentarea simulatorului (de obicei 32 de biti).

Bazele de numeratie acceptate sunt:

• baza 2: desemnata de litera b sau litera B;

• baza 8: desemnata de litera o sau litera O;

• baza 10: desemnata de litera d sau litera D;

• baza 16: desemnata de litera h sau litera H.

Exemple:

13 numarul 13 exprimat ın baza 10 (ın binar 1101)-13 numarul -13 exprimat ın baza 10 (ın binar, pe 4 biti 1011,

iar pe 5 biti 10011)4’b1010 numarul 10 exprimat ın binar pe 4 biti12’o327 numar exprimat pe 12 biti ın baza 816’hBEEF numar exprimat pe 16 biti ın baza 168’d-3 numar exprimat ilegal (valoarea nu poate fi negativa)-8’d3 numar exprimat legal ca fiind complementul fata de 2 al numarului

pozitiv 3, reprezentat pe 8 biti (echivalent cu 8’b1111_1101)16 ’h DEAD forma legala cu spatii ıntre dimensiune si caracterul ’

si ıntre baza de numeratie si valoare4’ b0010 forma ilegala cu spatii ıntre caracterul ’ si baza de numeratiewidth’b1010 forma ilegala, dimensiunea nu poate fi un parametru sau o expresie’b1010 forma legala, dimensiunea poate lipsi (numarul este reprezentat

pe numarul maxim de biti, ın acest caz 4)’hFF numar exprimat ın baza 16, reprezentat pe 8 biti8’b101 numar exprimat ın baza 2, reprezentat pe 8 biti ca

8’b000001018’b0000_0101 numar echivalent cu forma anterioara (caracterele _ sunt ignorate)3’b0110_0101 numar echivalent cu 3’b101 (caracterele din stanga sunt trunchiate

daca valoarea are mai multi biti decat dimensiunea precizata explicit)8’b0_11_0_0101 folosire legala a caracterului de subliniere pentru delimitare8’b_0110_0101 folosire ilegala a caracterului de subliniere la ınceputul valorii8’d260 numar echivalent cu 4 ın baza 10 (provenit din trunchierea

caracterului cel mai semnificativ al reprezentarii ın binar9’b1_0000_0100.)

8’bx valoare nedefinita extinsa pe 8 biti xxxxxxxx4’bz valoare z extinsa pe 4 biti zzzz

2.3.2 Numere reale

Numerele reale pot fi reprezentate sub doua forme:

Page 38: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

28 CAPITOLUL 2. FUNDAMENTELE LIMBAJULUI VERILOG HDL

• Numere zecimale (cu virgula). Exemple: 3.14, -0.268, 11.1512

• Numere ın format stiintific (cu exponent). Exemple: 3.1415E2 (314,15), 1.0E3(1000,0), 5E-3 (0,005), 1_234.567_89 (1234,56789), 5.3E-3. Forma: 5. esteilegala deoarece dupa punctul zecimal trebuie sa apara cel putin o cifra.

Numerele reale nu sunt sintetizabile. Numerele reale sunt automat convertite la nu-mere ıntregi prin rotunjire.

2.3.3 Siruri

Un sir este format dintr-o secventa de caractere incluse ıntre ghilimele (” ”). Fiecarecaracter este reprezentat pe 8 biti si este tratat ca un ıntreg pozitiv. De exemplu,pentru a stoca mesajul "WAIT" este necesara definirea unei variabile de 32 de biti.

parameter nrChar = 4;reg[nrChar*8-1:0] mesaj;...mesaj <= "WAIT";

Cateva caractere de control pot fi introduse ın siruri daca sunt precedate de ca-racterul backslash (\).

\n trece la linie noua (CR)\t tabulator (TAB)\\ caracterul \\" caracterul apostrof dublu (")

2.4 Tipuri de date si obiecte

Verilog are doua grupe de tipuri de date:

• Tipul net: Acest tip de date modeleaza o conexiune fizica ıntre elementele struc-turale. Valoarea unei date de acest tip este determinata de sursa sa, care poatefi o specificatie de atribuire continua (assign) sau o instantiere de componenta.Daca nu exista nici o sursa (driver de semnal), atunci data de tip net pastreazavaloarea implicita z. Cel mai folosit tip din aceasta categorie este tipul wire.

• Tipul register: Acest tip de date modeleaza un element abstract de stocare adatelor. Valorile obiectelor de acest tip pot fi atribuite din interiorul specifica-tiilor always si initial. Valoarea implicita a acestui tip de date este x.

Sarmele de conexiune modelate ın Verilog pot fi de tip net sau de tip register.Diferenta dintre cele doua tipuri consta ın modul ın care se actualizeaza valoareaobiectelor de acest tip. O sarma de tip net are valoarea continuu atribuita decatre driverul ei. O sarma de tip register ısi pastreaza valoarea pana laurmatoarea atribuire a unei noi valori. Este absolut incorecta afirmatiaconform careia obiectele de tip register modeleaza registre formate dinbistabile. Ca exemplu, se prezinta ın continuare doua modele de porti logice, mode-late cu cele doua tipuri de date.

Page 39: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

2.4. Tipuri de date si obiecte 29

wire outGate1; // declara un obiect de tip net (wire)reg outGate2; // declara un obiect de tip register (reg)

assign outGate1 = a & b; // iesirea outGate1 este continuu evaluata// conform expresiei (a AND b)

always @(a or b) // iesirea outGate2 este evaluata conformoutGate2 <= a & b; // expresiei (a AND b) doar cand exista o

// modificare a semnalului a sau// a semnalului b

Cu alte cuvinte, semnalul de tip wire modeleaza o sarma obisnuita careia trebuiesa i se atribuie tot timpul o valoare. Semnalul de tip reg modeleaza o sarma maispeciala (nu un registru) capabila sa ısi pastreze valoarea ıntre doua actualizarisuccesive. Aceasta proprietate a sarmelor de tip reg le face folositoare la modelareaelementelor de memorare din sistemele digitale (bistabile).

Datele de tip net pot fi declarate cu mai multe cuvinte cheie, ın functie de com-portamentul acestora:

wire Tip folosit cel mai frecvent pentru declararea de sarme. Corespundemodelului unei sarme fizice.

tri Tip identic ın sintaxa si semantica cu wire, este folosit pentru semnalareaposibilelor surse multiple pentru un semnal.

wor Tip de sarma ce modeleaza conexiunea ”OR cablat”.

trior Tip identic ın sintaxa si semantica cu wor.

wand Tip de sarma ce modeleaza conexiunea ”AND cablat”.

triand Tip identic ın sintaxa si semantica cu wand.

trireg Tip de sarma ce modeleaza o sarma cu ıncarcare capacitiva, capabila saretina ultima valoare dupa ce sursa semnalului a intrat ın stare de ınaltaimpedanta.

tri0 Tip ce modeleaza sarme cu surse multiple care iau valoarea 0 ın cazulın care toate sursele semnalului au intrat ın stare de ınalta impedanta.

tri1 Tip ce modeleaza sarme cu surse multiple care iau valoarea 1 ın cazul ıncare toate sursele semnalului au intrat ın stare de ınalta impedanta.

supply0 Tip utilizat pentru modelarea conexiunii la masa, valoare logica permanent 0.

supply1 Tip utilizat pentru modelarea conexiunii la sursa de alimentare, valoarelogica permanent 1.

Page 40: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

30 CAPITOLUL 2. FUNDAMENTELE LIMBAJULUI VERILOG HDL

In Verilog este posibila nedeclararea unei sarme de tip net. In acest caz, declaratiaimplicita este de tip wire de 1 bit. Se recomanda neutilizarea acestei reguli Verilogsi declararea explicita a tuturor sarmelor.

Datele de tip register pot fi declarate cu mai multe cuvinte cheie, ın functie decomportamentul acestora:

reg Tip folosit cel mai frecvent pentru declararea de sarme ”cu memorie”.Este folosit pentru modelarea iesirilor de bistabile.

integer Tip folosit exclusiv la modelarea la nivel ınalt (nu pentru sinteza) fiindechivalent cu tipul reg pe 32 de biti.

time Tip folosit exclusiv la modelarea la nivel ınalt pentru stocarea simanipularea valorilor ce semnifica timp.

real Tip folosit exclusiv la modelarea la nivel ınalt pentru stocarea simanipularea valorilor ce semnifica numere reale.

realtime Tip identic ın sintaxa si semantica cu tipul real.

Atat sarmele de tip net, cat si cele de tip reg pot fi extinse pe una sau doua dimen-siuni. Extinderea pe o dimensiune modeleaza un bus. Extinderea pe doua dimensiunimodeleaza o matrice de date. Verilog nu ofera suport pentru structuri de date de maimult de doua dimensiuni. Dimensiunea vectorilor se precizeaza la declararea sarmeiıntre cuvantul cheie ce desemneaza tipul de sarma si numele acesteia.

parameter width_p = 16;wire [7:0] dataBus; // bus de 8 bitireg[width_p-1:0] shReg; // bus de dimensiune parametrizabila

assign dataBus = 8’hAB; // atribuire catre tot bus-ulassign dataBus[0] = 1’b0; // atribuire catre un membru al bus-uluiassign dataBus[2:0] = 3’b101; // atribuire catre o portiune din bus

// registru de deplasare in inel de dimensiuni generice// valoarea viitoare se obtine din valoarea curenta// deplasata cu un bit la stanga si// transferul MSb pe pozitia LSbalways @(posedge ck)

shReg <= {shReg[width_p-2:0], shReg[width_p-1]};

Desi nu este impusa nici o restrictie, se recomanda utilizarea indexarii vectorilorın sens descrescator, de la un numar maxim pana la 0 (nu pana la 1).

Dimensiunea matricilor se precizeaza la declararea sarmei: latimea se declara ıntrecuvantul cheie ce desemneaza tipul de sarma si numele acesteia, iar adancimea sedeclara dupa numele semnalului.

parameter width_p = 16;parameter deep_p = 8;

Page 41: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

2.4. Tipuri de date si obiecte 31

reg[15:0] regFile[255:0];// declaratie de matrice bidimensionala// ce poate corespunde unui set de// 256 registre de cate 16 biti

wire[15:0] reg178;wire zeroFlag;

reg[width_p-1:0] mem[deep_p-1:0];// matrice de memorie bidimensionala// de dimensiuni parametrizabile

wire[width_p-1:0] mem_0; // vector corespunzator locatiei// de la adresa 0

assign mem_0 = mem[0]; // atribuirea unui membru al matricii// bidimensionale catre un vector

assign reg178 = regFile[178]; // accesarea registrului de la// adresa 178

assign zeroFlag = reg178[2]; // accesarea bitului 2 din registrul de// la adresa 178

Exemplul urmator prezinta folosirea declaratiilor de tip wire si reg ın cazulmodelarii structurale a unui bistabil T implementat cu un bistabil D si o poartaXOR.

Prima versiune de modelare descrie bistabilul D cu o specificatie always. Din acestmotiv, sarma qt_o (asociata portului de iesire cu acelasi nume) a fost declarata detip reg. Comportamentul sarmei d (interna modulului) a fost descris cu o specificatiecontinua assign. Din acest motiv, sarma d a fost declarata de tip wire.

Vnµ´¶³

module tVer1 (reset_ni, // reset asincron activ in 0ck_i, // semnal de ceast_i, // intrarea bistabilului Tqt_o // iesirea bistabilului T

);

input reset_ni;input ck_i;input t_i;output qt_o;

// iesire declarata ca regreg qt_o;// sarma interioara declarata ca wirewire d;

Page 42: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

32 CAPITOLUL 2. FUNDAMENTELE LIMBAJULUI VERILOG HDL

assign d = t_i ^ qt_o; // operator XOR

always @(posedge ck_i or negedge reset_ni) beginif (!reset_ni) begin

qt_o <= 1’b0;endelse begin

qt_o <= d;end

end

endmodule

A doua versiune de modelare ıncapsuleaza descrierea bistabilul D ıntr-un moduldenumit dff. In interiorul acestui modul, portul de iesire qd_o a fost declarat regdeoarece a fost atribuit din specificatie always. In schimb, la instantierea moduluidff ın modulul tffVer2, portul sau de iesire qd_o este conectat la portul de iesireqt_o al modulului tffVer2 cu o sarma obisnuita de tip wire.

Vnµ´¶³

module dff (reset_ni, // reset asincron activ in 0ck_i, // semnal de ceasd_i, // intrarea bistabilului Dqd_o // iesirea bistabilului D

);

input reset_ni;input ck_i;input d_i;output qd_o;

reg qd_o; // port de iesire de tip reg, atribuit in always

always @(posedge ck_i or negedge reset_ni) beginif (!reset_ni) begin

qd_o <= 1’b0;endelse begin

qd_o <= d_i;end

end

endmodule

module tVer2 (

Page 43: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

2.4. Tipuri de date si obiecte 33

reset_ni, // reset asincron activ in 0ck_i, // semnal de ceast_i, // intrarea bistabilului Tqt_o // iesirea bistabilului T

);

input reset_ni;input ck_i;input t_i;output qt_o;

// declararea sarmei d (interna modulului)wire d;

assign d = t_i ^ qt_o;

// instantierea bistabilului Ddff i_dff(

.reset_ni (reset_ni ),

.ck_i (ck_i ),

.d_i (d ), // asociere dintre portul de intrare d_i// si sarma d

.qd_o (qt_o ) // asociere dintre portul de iesire qd_o// si sarma qt_o (conectata la iesirea// modulului tVer2)

);

endmodule

A treia versiune de modelare ıncapsuleaza toata descrierea ıntr-o singura specifi-catie always. Sarma conectata pe intrarea bistabilului nu mai este declarata explicit.Aceasta versiune este cea mai folosita la proiectarea RTL pentru modelarea unuibistabil T si are avantajul ca ascunde structura interna pentru a descrie doar com-portamentul.

Vnµ´¶³

module tVer3 (reset_ni, // reset asincron activ in 0ck_i, // semnal de ceast_i, // intrarea bistabilului Tqt_o // iesirea bistabilului T

);

input reset_ni;input ck_i;input t_i;output qt_o;

Page 44: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

34 CAPITOLUL 2. FUNDAMENTELE LIMBAJULUI VERILOG HDL

// declaratia iesiri de tip regreg qt_o;

always @(posedge ck_i or negedge reset_ni) beginif (!reset_ni) begin

qt_o <= 1’b0;endelse begin

qt_o <= t_i ^ qt_o;end

end

endmodule

Tnµ´¶³

In scop de testare, cele trei versiuni de modelare au fost incluse ıntr-unmediu unic de simulare.

2.5 Operatori

Verilog are trei tipuri de operatori: cu unul, doi sau trei operanzi. Operatorii unariapar ın fata operandului, operatorii binari apar ıntre cei doi operanzi, iar operatoriiternari separa cei trei operanzi.

a = ~b; // ~ este operator unar (complementare logica)c = d & e; // & este operator binar (functie logica AND)f = g ? h : i; // ?: este operator ternar

// (conditie, functie multiplexor)// daca g=1, f=h, altfel f=i

Tabelul 2.1 prezinta operatorii Verilog ın ordinea precedentei acestora.

2.5.1 Operatori aritmetici

Operatorii aritmetici sunt:

• + plus (unar si binar);

• - minus (unar si binar);

• * multiplicare;

• / ımpartire;

• % modulo.

Operatorii + si - sunt sintetizabili. Operatorul * este sintetizat ca un circuit combi-national de catre unele sintetizatoare. Operatorii / si % se recomanda a nu se folosiın cod ce urmeaza a fi sintetizat.

Page 45: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

2.5. Operatori 35

Operator Descriere+ Operator unar pentru numar pozitiv- Operator unar pentru numar negativ! Operator unar pentru negare logica~ Operator unar pentru negare pe biti& Operator de reducere AND (aplicat unui vector produce un bit)~& Operator de reducere NAND^ Operator de reducere XOR~^ Operator de reducere XNOR| Operator de reducere OR~| Operator de reducere NOR* Operator binar de multiplicare/ Operator binar de ımpartire% Operator binar modulo+ Operator binar de adunare- Operator binar de scadere<< Operator binar de deplasare stanga>> Operator binar de deplasare dreapta< Operator binar de comparare ”mai mic”<= Operator binar de comparare ”mai mic sau egal”> Operator binar de comparare ”mai mare”>= Operator binar de comparare ”mai mare sau egal”== Operator binar de egalitate logica!= Operator binar de inegalitate logica=== Operator binar de egalitate cu selectie!== Operator binar de inegalitate cu selectie& Operator binar logica AND pe biti

(aplicat unor operanzi vectori produce un vector)^ Operator binar logica XOR pe biti~^ Operator binar logica XNOR pe biti| Operator binar logica OR pe biti&& Operator binar AND logic

(aplicat unor expresii, produce o valoare de adevar a unei conditii)|| Operator binar OR logic?: Operator ternar conditional

Tabelul 2.1Operatorii Verilog ın ordinea precedentei acestora.

Page 46: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

36 CAPITOLUL 2. FUNDAMENTELE LIMBAJULUI VERILOG HDL

Dimensiunea rezultatului operatiilor aritmetice depinde de dimensiunea celui maimare operand si de dimensiunea si tipul obiectului destinatie. Daca se atribuie unuiobiect un rezultat pe mai putini biti, atunci rezultatul se extinde cu zerouri. In cazulobiectului destinatie de tip ıntreg, rezultatul ıezultatul se extinde si extinde bitul desemn (0 pentru numere pozitive si 1 pentru numere negative). Daca se atribuie unuiobiect un rezultat pe mai multi biti atunci, rezultatul se trunchiaza la numarul debiti ai obiectului destinatie.

Exemple:

module testOpAritm();

reg[3:0] opA, opB, opC;reg[4:0] opD;reg[5:0] opE;reg[7:0] opF;integer opG;reg[7:0] opH;

initial beginopA = 4’b1110; // 14opB = 4’b1000; // 8opH = -9; // -9

opC = opA + opB; // suma evaluata pe 4 biti$display("Binar: %b + %b = %b, Zecimal: %0d + %0d = %0d",

opA, opB, opC, opA, opB, opC);

opD = opA + opB; // suma evaluata pe 5 biti$display("Binar: %b + %b = %b, Zecimal: %0d + %0d = %0d",

opA, opB, opD, opA, opB, opD);

opE = opA + opB; // suma evaluata pe 6 biti$display("Binar: %b + %b = %b, Zecimal: %0d + %0d = %0d",

opA, opB, opE, opA, opB, opE);

opF = opA * opB; // multiplicare evaluata la 8 biti$display("Binar: %b * %b = %b, Zecimal: %0d * %0d = %0d",

opA, opB, opF, opA, opB, opF);

opC = opB - opA; // diferenta evaluata pe 4 biti$display("Binar: %b - %b = %b, Zecimal: %0d - %0d = %0d",

opB, opA, opC, opB, opA, opC);

opD = opB - opA; // diferenta evaluata pe 5 biti$display("Binar: %b - %b = %b, Zecimal: %0d - %0d = %0d",

opB, opA, opD, opB, opA, opD);

opE = opB - opA; // diferenta evaluata pe 6 biti

Page 47: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

2.5. Operatori 37

$display("Binar: %b - %b = %b, Zecimal: %0d - %0d = %0d",opB, opA, opE, opB, opA, opE);

opG = opB - opA; // diferenta evaluata ca numere intregi$display("Binar: %b - %b = %b, Zecimal: %0d - %0d = %0d",

opB, opA, opG, opB, opA, opG);

opC = opA / opB; // impartire$display("Binar: %b / %b = %b, Zecimal: %0d / %0d = %0d",

opA, opB, opC, opA, opB, opC);

opC = opA % opB; // modulo$display("Binar: %b mod %b = %b, Zecimal: %0d mod %0d = %0d",

opA, opB, opC, opA, opB, opC);

$display("-9 reprezentat pe 8 biti. Binar: %b, Zecimal: %0d",opH, opH);

opF = opB + opH; // scadere cu numere "negative".// Rezultat asteptat -1

$display("Binar: %b - %b = %b, Zecimal: %0d - %0d = %0d",opB, opH, opF, opB, opH, opF);

opH = opF + 3; // adunare cu numere "negative".// Rezultat asteptat +2

$display("Binar: %b + %b = %b", opF, 3, opH);$display("Zecimal: %0d + %0d = %0d", opF, 3, opH);

end

endmodule

In urma simularii, se obtine urmatorul text:

# Binar: 1110 + 1000 = 0110, Zecimal: 14 + 8 = 6# Binar: 1110 + 1000 = 10110, Zecimal: 14 + 8 = 22# Binar: 1110 + 1000 = 010110, Zecimal: 14 + 8 = 22# Binar: 1110 * 1000 = 01110000, Zecimal: 14 * 8 = 112# Binar: 1000 - 1110 = 1010, Zecimal: 8 - 14 = 10# Binar: 1000 - 1110 = 11010, Zecimal: 8 - 14 = 26# Binar: 1000 - 1110 = 111010, Zecimal: 8 - 14 = 58# Binar: 1000 - 1110 = 11111111111111111111111111111010,

Zecimal: 8 - 14 = -6# Binar: 1110 / 1000 = 0001, Zecimal: 14 / 8 = 1# Binar: 1110 mod 1000 = 0110, Zecimal: 14 mod 8 = 6# -9 reprezentat pe 8 biti. Binar: 11110111, Zecimal: 247# Binar: 1000 - 11110111 = 11111111, Zecimal: 8 - 247 = 255# Binar: 11111111 + 00000000000000000000000000000011 = 00000010

Page 48: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

38 CAPITOLUL 2. FUNDAMENTELE LIMBAJULUI VERILOG HDL

# Zecimal: 255 + 3 = 2

In cadrul operatiilor aritmetice obiectele de tip net, obiectele de tip reg si nu-merele ıntregi ın format cu baza de numeratie sunt considerate numere pozitive farasemn. Sunt considerate numere ıntregi cu semn obiectele de tip integer si numereıntregi ın format zecimal. Numerele negative sunt reprezentate ın binar ın complementfata de 2. Daca un bit al unui operand este x atunci rezultatul operatiei aritmeticeeste x.

2.5.2 Operatori relationali

Operatorii relationali sunt:

• > mai mare;

• < mai mic;

• >= mai mare sau egal;

• <= mai mic sau egal.

Rezultatul unui operator relational este ”adevarat” (1) sau ”fals” (0).Exemple:

15 > 12 fals (0)

15 > 8’hx nedefinit (x)

’b1000 >= ’b011110 fals (0)

3 >= 3 adevarat (1)

2.5.3 Operatori de egalitate

Operatorii de egalitate sunt:

• == egalitate logica;

• != inegalitate logica;

• === egalitate cu selectie;

• !== inegalitate cu selectie.

Rezultatul unui operator de egalitate este ”adevarat” (1) sau ”fals” (0).Exemple:

Page 49: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

2.5. Operatori 39

opA = ’b10x0opB = ’b10x0opC = 16’BExFopD = 16’BEEF

opA == opB fals (0)

opA === opB adevarat (1)

2’b11 === 8’b3 adevarat (1)

opC != opD nedefinit (x)

opC !== opD adevarat (1)

2.5.4 Operatori logici

Operatorii logici sunt:

• && AND logic;

• || OR logic;

• ! negarea unara.

Rezultatul unui operator logic este reprezentat pe un bit: 0, 1 sau x (indecis). Oper-anzii vectori sunt evaluati ca 0 daca au toate valorile 0, altfel sunt evaluati ca 1.

Exemple:

sigA = 1’b0sigB = 1’b1busC = 4’b1010 evaluat ca 1busD = 4’b1001 evaluat ca 1busE = 4’b0000 evaluat ca 0sigF = 1’bx evaluat ca x

sigA && sigB fals (0)

sigA || sigB adevarat (1)

!sigA adevarat (1)

busC && busD adevarat (1)

busC || busD adevarat (1)

!busC fals (0)

Page 50: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

40 CAPITOLUL 2. FUNDAMENTELE LIMBAJULUI VERILOG HDL

!busE adevarat (1)

!sigF indecis (x)

2.5.5 Operatori logici pe vectori

Operatorii logici pe vectori sunt:

• ~ negare bit cu bit;

• & AND pe biti;

• | OR pe biti;

• ^ XOR pe biti;

• ~^ XNOR pe biti.

Operatorii logici pe vectori opereaza ”bit cu bit”. Rezultatul unui operator pe vectoreste tot un vector, avand dimensiunea operanzilor. Tabelele functiilor implementatede operatorii logici sunt prezentate ın tabelul 2.2.

& (and) 0 1 x z | (or) 0 1 x z0 0 0 0 0 0 0 1 x x1 0 1 x x 1 1 1 1 1x 0 x x x x x 1 x xz 0 x x x z x 1 x x

^ (xor) 0 1 x z ~^ (xnor) 0 1 x z0 0 1 x x 0 1 0 x x1 1 0 x x 1 0 1 x xx x x x x x x x x xz x x x x z x x x x

~ (not) 0 1 x z1 0 x x

Tabelul 2.2Tabelul functiilor implementate de operatorii logici.

Exemple:

sigA = 1’b0sigB = 1’b1busC = 4’b1010busD = 4’b1001

Page 51: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

2.5. Operatori 41

busE = 4’b0000sigF = 1’bx

sigA & sigB 1’b0

sigA | sigB 1’b1

~sigA 1’b1

busC & busD 4’b1000

busC | busD 4’b1011

~busC 4’b0101

~busE 4’b1111

~sigF 1’bx

sigA & sigF 1’b0

sigB & sigF 1’bx

2.5.6 Operatori de reducere

Operatorii de reducere sunt:

• & AND ıntre toti bitii vectorului;

• ~& inversul operatorului &;

• | OR ıntre toti bitii vectorului;

• ~| inversul operatorului |;

• ^ XOR ıntre toti bitii vectorului;

• ~^ inversul operatorului ^.

Operatorii de reducere se aplica unui operand vector si produc rezultat pe un bit.Acesti operatori sunt foarte utili ın exprimarea unor functii pe vectori de dimensiuneparametrizabila.

Exemple:

busA = 4’b1010busB = 4’b1011

&busA evaluat ca 0

|busA evaluat ca 1

Page 52: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

42 CAPITOLUL 2. FUNDAMENTELE LIMBAJULUI VERILOG HDL

^busA evaluat ca 0

^busB evaluat ca 1

Operatorul de reducere ^ poate fi folosit pentru a verifica daca un bit dintr-un busare valoare x:

busC = 4’b10x0

^busC evaluat ca x

Aceasta observatie poate fi folosita ın specificatii de verificare a coerentei datelorde pe un bus:

if (^busC === 1’bx)$display("Valoare necunoscuta pe busC = %b", busC);

O alta aplicatie a operatorilor de reducere consta ın compararea valorii unui vec-tor cu valoarea ıntreaga 0 (toti bitii egali cu 0) sau verificarea ajungerii la capatuldomeniului de reprezentare a numerelor pozitive (toti bitii egali cu 1).

&busC 1 daca toti bitii sunt egali cu 1

~|busC 1 daca toti bitii sunt egali cu 0 (echivalent cu busC === ’b0)

2.5.7 Operatori de deplasare

Operatorii de deplasare sunt:

• << deplasare stanga;

• >> deplasare dreapta.

Operatorii de deplasare produc deplasarea bitilor operandului din stanga cu numarulde pozitii precizat ın dreapta, ın directia precizata de operator.

Exemple:

reg[7:0] busA;...busA = 8’b1001_1100

...busA >> 2 evaluat ca 8’b0010_0111

busA << 2 evaluat ca 8’b0111_0000

Page 53: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

2.5. Operatori 43

Operatorii de deplasare sunt foarte folositi pentru a descrie operatii de ınmultiresi ımpartire cu numere puteri ale lui 2 sau descrierea exponentierii ın binar.

1 << 3 1 deplasat stanga cu 3 biti, echivalent cu ”2 la puterea 3”,echivalent cu 4’b1000

parameter power_p = 7;1 << power_p echivalent cu ”2 la puterea 7”, 8’b10000000

opA << opB echivalent cu ”opA ınmultit cu 2 la puterea opB”

opA >> opB echivalent cu ”opA ımpartit la 2 la puterea opB”

Acest operator este utilizat si la modelarea unui decodificator:

input[3:0] dcd_i;output[7:0] dcd_o;// rezultatul este un vector de 8 biti avand un singur bit 1,// pe pozitia cu index egal cu dcd_iassign dcd_o = (1’b1 << dcd_i);

2.5.8 Operator conditional

Exista un singur operator conditional:

• <conditie> ? <expresie1> : <expresie0>

In cazul conditiei adevarate, operatorul ıntoarce valoarea <expresie1>. Altfel, o-peratorul ıntoarce valoarea <expresie0>. Comportamentul este similar cu cel alcircuitului multiplexor. Exemple:

assign y = sel ? i1 : i0;

2.5.9 Operatori de concatenare si replicare

Concatenarea este operatia de alaturare a bitilor ıntr-un bus. Doua sau mai multeexpresii care semnifica biti se pot alatura pentru a forma o valoare reprezentata pemai multi biti. Operatorii de concatenare sunt caracterele acolade: { si }. O anumitaexpresie poate fi replicata de un numar de ori ın cadrul concatenarii.

Exemple:

// initializarea cu un patternreg[127:0] reg128;reg128 <= {4{32’hDEAD_BEEF}}; // de 4 ori cate 32 de biti// echivalent cu 128’hDEAD_BEEF_DEAD_BEEF_DEAD_BEEF_DEAD_BEEF

// registrul cu deplasare stangareg[31:0] leftShReg;leftShReg <= {leftShReg[30:0], 1’b0};

Page 54: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

44 CAPITOLUL 2. FUNDAMENTELE LIMBAJULUI VERILOG HDL

// registrul cu deplasare in inelreg[31:0] inelReg;inelReg <= {inelReg[30:0], inelReg[31]};

// extindere de semn a vectorilor cu// semnificatie de numere intregi (cu semn)wire[7:0] sign8;wire[15:0] sign16;assign sign16 = {{8{sign8[7]}}, sign8};// sign8 = 8’b0001_1111 (pozitiv) => sign16 = 16’b0000_0000_0001_1111// sign8 = 8’b1001_1111 (negativ) => sign16 = 16’b1111_1111_1001_1111

Operatorii de concatenare au cateva limitari:

• In sirul de concatenare nu sunt admise constante cu dimensiuni neprecizate(ilegal {busA, 5}, dar legal {busA, 4’d5})

• Numarul de repetari nu poate fi decat o constanta (ilegal {num{2’b10}}, darlegal {3{2’b10}}).

2.6 Specificatii concurente

Specificatiile concurente se executa ın paralel, indiferent de pozitia ın care apar ıncodul sursa. Fiecare specificatie concurenta are semnificatia proprie, independentde celelalte specificatii concurente. Fiecare specificatie concurenta este executataasincron fata de celelalte specificatii concurente. Un task nu se poate apela ıntr-ospecificatie concurenta.

Exista trei tipuri de specificatii concurente:

• specificatia assign (numita si specificatia de atribuire continua);

• specificatia initial (constructie lexicala procedurala executata o singura data);

• specificatia always (constructie lexicala procedurala executata la infinit).

Specificatia assign se poate considera ca este forma cea mai simpla de a modelacircuite logice combinationale. Sintaxa specificatiei assign este urmatoarea:

Snµ´¶³

<atribuire_continua>::= assign <tarie_driver>? <intarziere>? <lista_de_atribuiri>

<tarie_driver>::= ( <STRENGTH0> , <STRENGTH1> )||= ( <STRENGTH1> , <STRENGTH0> )

<intarziere>

Page 55: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

2.6. Specificatii concurente 45

::= # <numar>||= # <identificator>||= # (<expresie_mintypmax><,<expresie_mintypmax>>?<,

<expresie_mintypmax>>?)

<lista_de_atribuiri>::= <atribuire> <,<atribuire>>*

<atribuire>::= <nume_semnal> = <expresie>

<STRENGTH0>::= supply0 || strong0 || pull0 || weak0 || highz0

<STRENGTH1>::= supply1 || strong1 || pull1 || weak1 || highz1

<expresie_mintypmax>::= <expresie>||= <expresie1> : <expresie2> : <expresie3>

Specificatia este introdusa de cuvantul rezervat assign. Precizarea tariei surseieste optionala si se face sub forma unui cuplu de cuvinte cheie ce precizeaza taria stariide 0 si a starii de 1. Precizarea ıntazierii cu care se face atribuirea este optionala.Intarzierea este precedata de simbolul # si are valoarea absoluta determinata de di-rectiva ‘timescale. Intarzierea poate fi un numar, un identificator care are asociatao valoare numerica sau un triplet de valori ale ıntarzierii minime, tipice si maximedespartite prin caracterul ”doua puncte” (:).

Lista de atribuiri contine una sau mai multe atribuiri de semnale. O atribuire desemnal este formata din numele semnalului caruia i se atribuie o valoare, simbolul deatribuire = si o expresie din care, ın urma evaluarii, rezulta o valoare similara cu ceaa semnalului atribuit.

Exemple de atribuiri continue:

assign (pull0, strong1) #2 dst = src;// atribuie semnalului dst valoarea src// cu intarziere de 2 unitati de timp,// taria semnalului dst fiind "pull0" in// stare 0 si "strong1" in stare 1

assign #delay dst = src; // atribuie semnalului dst valoarea src// cu o intarziere precizata de variabila// delay

assign #(1:2:3) dst = src; // atribuie semnalului dst valoarea src// cu intarzierea:// 1 unitate de timp (minim)// 2 unitate de timp (tipic)// 3 unitate de timp (maxim)

Page 56: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

46 CAPITOLUL 2. FUNDAMENTELE LIMBAJULUI VERILOG HDL

Specificatia initial este o specificatie concurenta care include una sau maimulte specificatii procedurale (secventiale). Specificatia initial se executa o singuradata. Executia acesteia ıncepe la timpul 0. In cadrul specificatiilor procedurale se potinclude si specificatii de temporizare. Odata executata ultima specificatie secventiala,specificatia concurenta initial ısi ınceteaza efectul. De mentionat ca, specificatiainitial nu este sintetizabila (nu poate descrie un comportament de hardware real),ea fiind ignorata de catre toate programele de sinteza. Specificatia initial estefolosita exclusiv pentru modelarea vectorilor de test. Sintaxa specificatiei initialeste urmatoarea:

Snµ´¶³

<specificatie_initial>::=initial <specificatie_secventiala>

Specificatia always este o specificatie concurenta, care include una sau mai multespecificatii procedurale (secventiale), similar cu specificatia initial. Diferenta dintreacestea consta ın faptul ca specificatia always se executa la infinit. Executia acesteiaıncepe la timpul 0. Dupa executia ultimei specificatii secventiale se reia executiaacestora de la ınceput, cu prima specificatie aflata dupa cuvantul cheie always. Incadrul specificatilor procedurale se pot include si specificatii de temporizare. In plus,specificatia always contine o conditie care determina reluarea executiei specificatiilor.Sintaxa specificatiei always este urmatoarea:

Snµ´¶³

<specificatie_always>::=always <specificatie_secventiala>

Prin natura sa, specificatia always este repetitiva. Din acest motiv, este obliga-torie controlarea temporizarii repetarii acesteia. Daca o specificatie always nu areprevazut un mecanism de temporizare, desi nu este eroare de sintaxa, simularea va fiblocata la timpul 0 datorita unei bucle infinite cu ıntarziere nula.

Codul urmator modeleaza un inversor ideal al carui iesire este conectata la intrare.Evident, acest circuit ”oscileaza pe frecventa infinit”.

always clk = ~clk;

Precizarea unui timp dupa care se repeta specificatia conduce la un mod foarteuzual de modelare a unui generator de semnal periodic, de ceas:

always #5 clk = ~clk;

Semnalul clk va avea un comportament periodic similar cu cel al unui semnal deceas cu perioada 10ns (semnalul ısi complementeaza starea la fiecare 5ns).

Detalierea specificatiilor secventiale ce pot aparea ın campul<specificatie_secventiala> este facuta ın sectiunea 2.7.

Page 57: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

2.7. Specificatii secventiale 47

2.7 Specificatii secventiale

Specificatiile secventiale (procedurale) sunt specificatii ce pot aparea doar ın corpulspecificatiilor concurente initial sau always. Aceste specificatii se executa strict ınordinea ın care apar ın codul sursa. Mai multe specificatii secventiale pot fi grupateıntr-un bloc ce se comporta ca o singura specificatie prin delimitarea sa prin cuvintelecheie begin si end.

Constructiile HDL concurente permit descrierea hardware la un nivel relativ de-taliat. Modelarea unui circuit digital la nivel de porti logice si atribuiri continue estefoarte apropiata de structura fizica a circuitului. In schimb, acest tip de constructiinu permit un nivel suficient de abstractizare necesar descrierii sistemelor complexe demari dimensiuni.

Sintaxa specificatiilor secventiale este prezentata ın continuare:

Snµ´¶³

<specificatie_secventiala>::=<atribuire_blocanta>;||= <atribuire_neblocanta>;||= if (<conditie>) <specificatie_secventiala>||= if (<conditie>) <specificatie_secventiala>

else <specificatie_secventiala>||= case (<expresie>) <articol_case>+ endcase||= casez (<expresie>) <articol_case>+ endcase||= casex (<expresie>) <articol_case>+ endcase||= forever <specificatie_secventiala>||= repeat (<expresie>) <specificatie_secventiala>||= while (<expresie>) <specificatie_secventiala>||= for (<atribuire>; <expresie>; <atribuire>)

<specificatie_secventiala>||= <control_intarziere> <specificatie_secventiala>||= <control_eveniment> <specificatie_secventiala>||= wait (<expresie>) <specificatie_secventiala>||= -> <nume_eveniment>;||= <bloc_secvential>||= <bloc_paralel>||= <activare_task>||= <activare_task_sistem>||= disable <nume_task>;||= disable <nume_bloc>;||= force <atribuire>;||= release <net>;

2.7.1 Specificatii de atribuire secventiale

Atribuirile secventiale se deosebesc de atribuirile continue prin modul lor de actiune.Atribuirile continue (realizate prin specificatia assign) atribuie valori variabilelor

de tip net similar modului ın care iesirea unei porti logice determina valoarea logica

Page 58: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

48 CAPITOLUL 2. FUNDAMENTELE LIMBAJULUI VERILOG HDL

a sarmei asociate. Expresia din partea dreapta a simbolului de atribuire (=) poate fiinterpretata ca un circuit combinational sursa pentru semnal.

In schimb, atribuirile secventiale nu modifica instantaneu valoarea unei variabileci ”programeaza” modificarea valorii acesteia. Acest mecanism poate fi ınteles caplasarea valorii ıntr-un registru a carui iesire devine ”vizibila” doar la momentul detimp planificat. Atribuirea ın sine are durata zero, dar ”registrul” mentine valoareapana la o noua modificare a acesteia, chiar daca sursa ce a generat valoarea estedezactivata.

Atribuirile secventiale pot fi interpretate ca ”atribuiri declansate cu ıntarziere”.Evenimentul de declansare apare cand simularea executiei modelului HDL ajunge laacea specificatie. Momentul la care se evalueaza o atribuire secventiala poate fi con-trolat prin specificatii de control al evenimentelor, specificatii de control al timpului,specificatii conditionale (if, case) sau specificatii de iteratii.

Exista doua tipuri de atribuiri secventiale:

• Atribuiri secventiale blocante (atriburi cu simbolul =) si

• Atribuiri secventiale neblocante (atriburi cu simbolul <=).

Distinctia dintre cele doua tipuri de atribuiri este usurata daca se asociaza aces-tora conceptele VHDL de ”variabila” si de ”semnal”. In VHDL, variabila este unobiect ce are asociata o valoare posibil de modificat instantaneu printr-o atribuirespecifica. Variabila este un obiect abstract, folosit doar ca obiect de stocare tem-porara a unei valori, pe parcursul descrierii unui algoritm secvential. Semnalul ınVHDL este un obiect ce are asociat atat o valoare instantanee, cat si un ”driverde semnal” (”signal driver”, ın limba engleza). Driverul de semnal este o multimede cupluri valoare-timp (timpul avand valori crescatoare), care modeleaza forma deunda planificata (programata) pentru acel semnal. O atribuire de semnal VHDL numodifica instantaneu valoarea acestuia, ci adauga o ınregistrare la driverul acestuia.Odata cu scurgerea timpului de simulare, fiecare semnal ısi actualizeaza valoarea dacaın driver exista o ınregistrare planificata la timpul curent de simulare.

VHDL precizeaza reguli explicite referitoare la gestiunea ınregistrarilor din driverulunui semnal, ın functie de momentele de aparitie si de timpii relativi asociati acestora.Aceleasi concepte pot fi aplicate, desi nu sunt explicit enuntate, si atribuirilor blocantesi neblocante existente ın Verilog.

• Atribuiri secventiale blocante. O atribuire secventiala blocanta are sintaxaprezentata ın continuare. Se remarca simbolul de atribuire =.

Snµ´¶³

<semnal> = <control_timp> <expresie>

O atribuire blocanta este similara ca si actiune cu variabilele VHDL. Modificareavalorii unui semnal printr-o atribuire blocanta se face imediat, ın momentulexecutiei acesteia, ınainte de executia specificatiilor secventiale care ıi urmeazaıntr-un bloc secvential.

Campul <semnal> din stanga operatorului = poate desemna un singur semnal,o portiune dintr-un vector sau o concatenare de semnale.

Page 59: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

2.7. Specificatii secventiale 49

Campul <control_timp> este optional si poate consta dintr-un control temporal(#2) sau control de eveniment (@(posedge clk)). In lipsa unui control temporalse considera conditia ındeplinita la momentul executarii atribuirii blocante.

Operatorul = este similar cu cel folosit la atribuirile concurente.

• Atribuiri secventiale neblocante. O atribuire secventiala neblocanta aresintaxa prezentata ın continuare. Se remarca simbolul de atribuire <=.

Snµ´¶³

<semnal> <= <control_timp> <expresie>

Atribuirile secventiale neblocante permit programarea unor atribuiri unui sem-nal, fara a opri (bloca) fluxul de executie a specificatilor secventiale ce ıi urmea-za.

Campul <semnal> din stanga operatorului <= poate desemna un singur semnal,o portiune dintr-un vector sau o concatenare de semnale.Campul <control_timp> este optional si poate consta dintr-un control temporal(#2) sau control de eveniment (@(posedge clk)). In lipsa unui control temporalse considera conditia ındeplinita la momentul executarii atribuirii blocante.

Operatorul <= este similar cu operatorul relational ”mai mic sau egal”. Dacaoperatorul <= apare ıntr-o expresie, simulatorul ıl interpreteaza ca operatorrelational. Daca operatorul <= apare ıntr-o constructie de atribuire secventiala,simulatorul ıl interpreteaza ca operator de atribuire secventiala neblocanta.

Simulatorul evalueaza atribuirile neblocante ın doua etape.

– In prima etapa, simulatorul evalueaza expresia din dreapta simbolului <=.Simultan, se evalueaza controlul temporal. Ca efect, se planifica o schim-bare a valorii semnalului la valoarea si momentul de timp determinate.Fara a schimba valoarea curenta a semnalului, simulatorul ısi continuaexecutarea specificatiilor secventiale.

– La sfarsitul evenimentelor asociate timpului curent de simulare, ınainte de aincrementa timpul de simulare, simulatorul verifica planificarile existentesi actualizeaza valorile semnalelor ce au planificari la timpul curent desimulare. Apoi timpul de simulare este incrementat.

Exemplul care urmeaza prezinta diferentele dintre cele doua tipuri de atribuirisecventiale.

Snµ´¶³

module blockingNonblocking ();

reg a, b, c, d, e, f;

initial

Page 60: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

50 CAPITOLUL 2. FUNDAMENTELE LIMBAJULUI VERILOG HDL

begin// valori initialea = 1’b0;b = 1’b0;c = 1’b0;// modificari ale valorilor cu atribuiri blocantea = #10 1’b1;b = #2 1’b1;c = #4 1’b1;#50a = #10 1’b0;b = #2 1’b0;c = #4 1’b0;

end

initialbegin

// valori initialed <= 1’b0;e <= 1’b0;f <= 1’b0;// modificari ale valorilor cu atribuiri neblocanted <= #10 1’b1;e <= #2 1’b1;f <= #4 1’b1;#50d <= #10 1’b0;e <= #2 1’b0;f <= #4 1’b0;

end

// monitorizarea modificarilorinitialbegin

$monitor("%M %t a=%b, b=%b, c=%b, d=%b, e=%b, f=%b",$time, a, b, c, d, e, f);

#100$display("%M %t NOTE: Simularea s-a sfarsit.", $time);$stop;

endendmodule

Mesajele generate sunt:

# blockingNonblocking 0 a=0, b=0, c=0, d=0, e=0, f=0# blockingNonblocking 2 a=0, b=0, c=0, d=0, e=1, f=0# blockingNonblocking 4 a=0, b=0, c=0, d=0, e=1, f=1# blockingNonblocking 10 a=1, b=0, c=0, d=1, e=1, f=1

Page 61: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

2.7. Specificatii secventiale 51

# blockingNonblocking 12 a=1, b=1, c=0, d=1, e=1, f=1# blockingNonblocking 16 a=1, b=1, c=1, d=1, e=1, f=1# blockingNonblocking 52 a=1, b=1, c=1, d=1, e=0, f=1# blockingNonblocking 54 a=1, b=1, c=1, d=1, e=0, f=0# blockingNonblocking 60 a=1, b=1, c=1, d=0, e=0, f=0# blockingNonblocking 76 a=0, b=1, c=1, d=0, e=0, f=0# blockingNonblocking 78 a=0, b=0, c=1, d=0, e=0, f=0# blockingNonblocking 82 a=0, b=0, c=0, d=0, e=0, f=0# blockingNonblocking 100 NOTA: Simularea s-a sfarsit.

Formele de unda ale semnalelor sunt prezentate ın figura 2.1. Se remarca faptulca semnalele c, d, e, care au fost atribuite cu specificatii neblocante, ısi modificavalorile la timpul 0ns (respectiv 50ns) plus ıntarzierea planificata (10ns, 2nssi 4ns). In acest caz, ıntarzierile sunt relative la acelasi moment de timp. Inschimb, semnalele care au fost atribuite cu specificatii neblocante, ısi modificavalorile la timpi ce trebuie ınsumati. a ısi modifica valoarea la 10ns dupa timpulcurent, b la 2ns dupa modificarea lui a, iar c la ınca 4ns dupa schimbareasemnalului b.

Figura 2.1 Forme de unda pentru exemplificarea atribuirilor secventiale blocante si neblo-cante.

In codul RTL, se recomanda evitarea folosirii specificatiilor de atribuire blocantesi folosirea exclusiva a celor neblocante. Unele sintetizatoare nu accepta specificatiialways ın care apar ambele tipuri de specificatii, generand mesaje de atentionarereferitoare la posibilitatea comportamentului diferit al modelului la nivel de poartalogica generat fata de codul sursa RTL.

Pentru exemplificarea acestei recomandari, este prezentat cazul a doua specificatiialways, una modeland specificatii de atribuire blocante, iar alta modeland specificatiide atribuire neblocante.

Specificatia always este o specificatie concurenta. Din acest motiv, ordinea ın careapar diverse specificatii always ın codul sursa nu ar trebui sa aiba vreo importanta.Totusi, datorita naturii secventiale a parcurgerii fisierului sursa, specificatiile alwayssunt evaluate secvential de catre simulator (chiar daca la acelasi ”timp de simulare”).Utilizarea ın acelasi modul a atribuirilor blocante si neblocante genereaza compor-tamente diferite ale unui cod sursa, ın functie de ordinea specificatiilor concurente(always) ın fisierul sursa. Comportamentul evidentiat depinde de simulator, dar esteevident ca nici un proiectant nu doreste scrierea unui cod care sa se comporte diferitın functie de simulatorul utilizat.

Page 62: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

52 CAPITOLUL 2. FUNDAMENTELE LIMBAJULUI VERILOG HDL

Tnµ´¶³

// atribuire blocanta plasata inaintea celei neblocantealways @(posedge clk) sigBloc_B1 = sigBloc_B1 + 1;always @(posedge clk) sigNebloc_B1 <= sigBloc_B1;

// atribuire neblocanta plasata inaintea celei blocantealways @(posedge clk) sigNebloc_B2 <= sigBloc_B2;always @(posedge clk) sigBloc_B2 = sigBloc_B2 + 1;

Sa presupunem cazul initial, cand toate semnalele au valoarea 0.In primul caz, specificatia always cu atribuire blocanta apare ın fisierul sursa

ınaintea celei ce foloseste atribuire neblocanta. Semnalul sigBloc_B1 ısi va actualizavaloarea imediat (sigBloc_B1=1). Semnalul sigNebloc_B1 ısi planifica schimbareavalorii ın sigBloc_B1=1, dar schimbarea efectiva se va petrece la sfarsitul cicluluicurent de simulare.

In al doilea caz, specificatia always cu atribuire blocanta apare ın fisierul sursadupa cea care foloseste atribuire neblocanta. Semnalul sigNebloc_B2 ısi planificaschimbarea valorii ın sigBloc_B2=0, dar schimbarea efectiva se va petrece la sfarsitulciclului curent de simulare. In schimb, semnalul sigBloc_B2 ısi va actualiza valoareaimediat (sigBloc_B2=1).

Ca efect, dupa primul front activ al semnalului de ceas, valorile celor patru semnalevor fi:

sigBloc_B1 = 1sigNebloc_B1 = 1sigNebloc_B2 = 0sigBloc_B2 = 1

Se recomanda rularea testului pe un simulator Verilog ”pas-cu-pas” si observareaordinii efective ın care se executa specificatiile always (specificatii concurente dinpunct de vedere al limbajului HDL). A se observa momentul cand se avanseaza timpulde simulare ın raport cu ordinea de executie a specificatiilor always).

Pentru a se facilita ıntelegerea, se reia codul cu comentarii referitoare la executiainitiala, la primul front pozitiv al semnalului de ceas.

// atribuire blocanta plasata inaintea celei neblocante// aici sigBloc_B1 = 0, sigNebloc_B1 = 0

always @(posedge clk) sigBloc_B1 = sigBloc_B1 + 1;// aici sigBloc_B1 = 1, sigNebloc_B1 = 0// sigBloc_B1 si-a modificat deja valoarea

always @(posedge clk) sigNebloc_B1 <= sigBloc_B1;// aici sigBloc_B1 = 1, sigNebloc_B1 = 0// s-a planificat o modificare a valorii sigNebloc_B1 (1, 0ns)// noua valoare va deveni valoare curenta doar la terminarea// ciclului curent de simulare

Page 63: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

2.7. Specificatii secventiale 53

// atribuire neblocanta plasata inaintea celei blocantealways @(posedge clk) sigNebloc_B2 <= sigBloc_B2;// aici sigBloc_B2 = 0, sigNebloc_B2 = 0// s-a planificat o modificare a valorii sigNebloc_B1 (0, 0ns)// noua valoare va deveni valoare curenta doar la terminarea// ciclului curent de simulare

always @(posedge clk) sigBloc_B2 = sigBloc_B2 + 1;// aici sigBloc_B2 = 1, sigNebloc_B2 = 0// sigBloc_B2 si-a modificat valoarea

// inainte de a se relua executia specificatiilor always,// se actualizeaza semnalele pe baza atribuirilor planificate:// sigBloc_B1 = 1, sigNebloc_B1 = 1// sigBloc_B2 = 1, sigNebloc_B2 = 0// apoi se avanseaza ciclul de simulare si se continua simularea

Se remarca faptul ca unele sintetizatoare nu fac distinctie ıntre simbolurile de atribuiresecventiale ceea ce conduce la sintetizarea defectuoasa. La simularea netlistului post-sinteza se va observa un comportament diferit de cel al surselor RTL. Structura ge-nerata de catre sintetizator este prezentata ın figura 2.2.

Figura 2.2 Structura generata de catre sintetizator pentru exemplul cu specificatii blocantesi neblocante.

Tnµ´¶³

Simularea comparativa a modulului RTL si a celui produs dupa sintezaevidentiaza eroarea ın comportamentul celor doua modele. Figura 2.3 prezinta formelede unda ale celor doua module (RTL si la nivel de poarta logica) instantiate ın acelasimediu de test.

2.7.2 Specificatii conditionale

Sintaxa specificatiilor conditionale (if) este urmatoarea:

Page 64: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

54 CAPITOLUL 2. FUNDAMENTELE LIMBAJULUI VERILOG HDL

Figura 2.3 Forme de unda la simularea comparativa RTL - netlist post-sinteza.

Snµ´¶³

if (<conditie>) begin<specificatii_secventiale1>

end[else begin

<specificatii_secventiale0>end]

Executia specificatiei if consta ın evaluarea conditiei urmata de executarea unuigrup de specificatii, ın functie de valoarea de adevar a acesteia. Un caz particu-lar, dar foarte ıntalnit, este cel al specificatiei conditionale ın care, indiferent devaloarea de adevar a conditiei, se atribuie valori aceluiasi semnal. In acest caz,specificatia if modeleaza comportamentul unui multiplexor: conditia reprezinta cir-cuitul combinational de generare a intrarii de selectie. De exemplu, sintetizatorulproduce structura din figura 2.4 pornind de la codul sursa urmator:

if (a_i && b_i) begin // selectia este AND intre doua intrariy_o <= c_i ^ d_i;

endelse begin

y_i <= e_i | f_i;end

Specificatiile conditionale pot fi incluse unele ın altele. In acest caz, se recomandafolosirea delimitatorilor begin si end pentru evitarea ambiguitatilor (carui if ıi co-respunde else?). Alternativa else este optionala.

Exemplul urmator prezinta folosirea specificatiilor conditionale pentru modelareaunui registru cu functie completa. Tabelul de functionare este descris ın continuare:

// nr. |reset clk en ld cnt sh up lf | out++// ------------------------------------------------// 1 | 0 X X X X X X X | 0// 2 | 1 ^ 0 X X X X X | out// 3 | 1 ^ 1 1 X X X X | data// 4 | 1 ^ 1 0 1 X 1 X | out+1// 5 | 1 ^ 1 0 1 X 0 X | out-1// 6 | 1 ^ 1 0 0 1 X 1 | out<<1// 7 | 1 ^ 1 0 0 1 X 0 | out>>1// 8 | 1 ^ 1 0 0 0 X X | out

Page 65: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

2.7. Specificatii secventiale 55

Figura 2.4 Structura de multiplexor plus logica sintetizata din specificatia conditionala.

Codul Verilog ce implementeaza aceasta functie prezinta specificatii conditionalemultiple, incluse unele ın altele, unele cu alternativa else.

always @(posedge clk_i or negedge reset_ni) beginif (!reset_ni) begin

registru_o <= 8’b0; // linia nr. 1endelse begin

if (enable_i) begin // linia nr. 3|4|5|6|7|8if (load_i) begin

registru_o <= data_i; // linia nr. 3endelse begin

if (count_i) beginif (up_i) begin // linia nr. 4|5

registru_o <= registru_o + 1; // linia nr. 4endelse begin

registru_o <= registru_o - 1; // linia nr. 5end

endelse begin // linia nr. 6|7

if (sh_i) beginif (left_i) beginregistru_o <= registru_o << 1; // linia nr. 6

endelse beginregistru_o <= registru_o >> 1; // linia nr. 7

endend // linia nr. 8 ("if (sh_i)" nu are "else")

end

Page 66: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

56 CAPITOLUL 2. FUNDAMENTELE LIMBAJULUI VERILOG HDL

endend // linia nr.2 ("if (enable_i)" nu are "else")

endend

2.7.3 Specificatii de selectie

Specificatiile de selectie permit evaluarea unei expresii si deciderea pe baza valoriiacesteia a specificatiilor ce urmeaza a se executa. Sintaxa specificatiilor case esteurmatoarea:

Snµ´¶³

case (<expresie>)valoare{, valoare}: <specificatii_secventiale>[default: <specificatii_secventiale>]endcase

Specificatiile alternative casex si casez permit existenta valorilor x si z ın ex-presiile valorilor. Acestea sunt cazuri care trebuie folosite cu grija deoarece ascundpotentiale pericole la sinteza.

Executia specificatiei case ıncepe cu evaluarea expresiei. Valoarea evaluata secompara secvential, ıncepand cu prima valoare ce apare ın lista. Daca se gasesteo identitate, se executa specificatiile secventiale ce ıi corespund si apoi se ıncheieexecutia specificatiei case. Ca o consecinta, daca doua valori sunt egale, se executagrupul de specificatii asociat primei aparitii a acelei valori. Daca valoarea la care a fostevaluata expresia nu a fost gasita, se executa specificatiile care apar dupa cuvantulrezervat default. Folosirea default nu este obligatorie. Se recomanda folosireaacesteia pentru evitarea buclelor nedorite ce pot aparea ın circuitele combinationalemodelate incorect.

Ca exemplu, este prezentata modelarea unei unitati logico-aritmetice.

// opcod-uri asociate operatiilor‘define ADD 3’b000 // suma operanzilor‘define SUB 3’b001 // diferenta operanzilor‘define XOR 3’b010 // XOR pe biti intre operanzi‘define AND 3’b011 // AND pe biti intre operanzi‘define PASS_L 3’b100 // trece operand stanga‘define NEG_L 3’b101 // trece operand stanga negat bit cu bit

module caseEx (func_i, // functieleftOp_i, // operand stangarightOp_i, // operand dreaptarez_o // rezultat

);

input[2:0] func_i;

Page 67: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

2.7. Specificatii secventiale 57

input[7:0] leftOp_i;input[7:0] rightOp_i;output[7:0] rez_o;reg[7:0] rez_o;

always @(func_i or leftOp_i or rightOp_i) begincase (func_i)‘ADD : rez_o <= leftOp_i + rightOp_i;‘SUB : rez_o <= leftOp_i - rightOp_i;‘XOR : rez_o <= leftOp_i ^ rightOp_i;‘AND : rez_o <= leftOp_i & rightOp_i;‘PASS_L : rez_o <= leftOp_i;‘NEG_L : rez_o <= ~leftOp_i;default : rez_o <= 8’b0;endcase

end

endmodule

2.7.4 Specificatii de iteratii

Exista patru tipuri de specificatii pentru iteratii. Sintaxa acestora este prezentata ıncontinuare.

Snµ´¶³

forever<specificatii_secventiale>

repeat (<expresie>)<specificatii_secventiale>

while (<expresie>)<specificatii_secventiale>

for (<atribuire_initiala>; <expresie>; <atribuire_pas>)<specificatii_secventiale>

Specificatia forever se executa pana la aparitia unei specificatii disable. Pentrua nu se repeta la acelasi moment al simularii, specificatia forever trebuie sa includaun control temporal. Cu acesta specificatie se poate modela un semnal de ceas, dupacum urmeaza:

reg clk;initial begin

clk <= 1’b0;#5 forever // primul front la 5ns

#10 clk <= ~clk; // complementeaza la fiecare 10nsend

Page 68: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

58 CAPITOLUL 2. FUNDAMENTELE LIMBAJULUI VERILOG HDL

Specificatia repeat se executa de numarul de ori precizat de o expresie. Catevaexemple sunt prezentate ın continuare.

// deplaseaza stanga cu 5 pozitiirepeat (5)

shReg <= shReg << 1;

// asteapta scurgerea a nrPerioade de ceasrepeat (nrPerioade)

@(posedge clk);

Specificatia while se executa atata timp cat expresia evaluata este adevarata.Aceasta specificatie este foarte utilizata pentru modelarea actiunilor de asteptare saude sincronizare ıntre procese. De exemplu, modelul de nivel ınalt al unui procesorfolosit pentru generarea unor stimuli pentru un sistem hardware comandat, includeproceduri (definite ca task-uri) de scriere, de citire si de pauza (nici o actiune). Oprocedura software de ”polling” impune scrierea unui registru care determina executiaunei comenzi urmata de citirea unui registru de stare pana cand un anumit bit estegasit setat. Acesta este semnalul ca actiunea initiata a fost terminata si ca procesorulpoate initia noi comenzi.

‘define ADS_COMANDA 8’h20‘define ADS_INDICATORI 8’h20

write(‘ADS_INDICATORI, 16’h0000);// anuleaza starea indicatorilor

write(‘ADS_COMANDA, 16’h0001);// bit0=1 semnifica "lanseaza comanda..."

break(2); // asteapta 2 perioade de ceasread(‘ADS_INDICATORI); // citeste adresa registrului de indicatoriwhile (mpuData_i[15]) // testeaza bit15 al datelor citite

// bit15=1 semnifica "comanda terminata"read(‘ADS_INDICATORI); // continua citirea indicatorilor

// pana cand actiunea este terminata// (bit15=1)

break(2);// executa alte actiuni...

Specificatia for se executa de un numar precizat de ori. In plus fata de specificatiarepeat, aceasta specificatie permite accesarea de catre specificatiile secventiale a in-dexului iteratiei. Indexul trebuie explicit declarat ca integer. Indexul are o valoareinitiala si se modifica la fiecare iteratie conform atribuire_pas. La fiecare iteratiese verifica starea de adevar a unui expresii ın care intra indexul.

Specificatia for este folosita frecvent atat la initializarea matricilor ce modeleazastructuri de memorie, cat si la modelarea diversilor algoritmi ce necesita controluliteratiilor.

parameter adsDim_p = 10; // latimea bus-ului de adrese

Page 69: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

2.7. Specificatii secventiale 59

parameter dataDim_p = 16; // latimea bus-ului de date

// declaratie de memorie de dimensiune parametrizabila// 2^adsDim_p x dataDim_p// implicit de dimensiune 2^10 x 16// (spatiu de adrese intre 0 si 1023)

reg[dataDim_p-1:0] memory[(1<<adsDim_p)-1 : 0];integer init_mirror; // index pentru specificatia "for"

// initializare memorieinitial begin

for (init_mirror = 0; // valoare initialainit_mirror < (1<<adsDim_p); // conditieinit_mirror = init_mirror + 1); // actualizare index

beginif (init_mirror == 0) begin// plasarea unui "marcher" la o anumita adresamemorie[init_mirror] <= 16’hDEAD_BEEF;

endelse begin// intializarea datei cu valoarea adreseimemorie[init_mirror] <= init_mirror;

endend

end

Desi nu este cel mai indicat mod de descriere, operatiile efectuate la adunareanumerelor binare pot fi exprimate cu o specificatie for, dupa cum urmeaza:

parameter width_p = 4;

integer i;reg tmp; // transport temporaralways @(a_i or b_i or ci_i) begin

tmp = ci_i;for (i = 0; i < width_p; i = i + 1) begin

s_o[i] = a_i[i] ^ b_i[i] ^ tmp;tmp = (a_i[i] & b_i[i]) | (a_i[i] & tmp) | (b_i[i] & tmp);

endco_o = tmp;

end

2.7.5 Specificatii de control temporal

Unei specificatii secventiale i se poate asocia un mecanism de control al temporizarii.

• Controlul ıntarzierii;

Page 70: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

60 CAPITOLUL 2. FUNDAMENTELE LIMBAJULUI VERILOG HDL

• Controlul evenimentelor.

Controlul ıntarzierii consta din specificarea unui interval de timp ıntre mo-mentul aparitiei specificatiei si momentul executarii efective a acesteia. O ıntarzierea executiei specificatiei secventiale este marcata ın cod prin precedarea acesteia desimbolul # si de un numar ce reprezinta numarul de unitati de timp cu care va fiıntarziata executia.

Snµ´¶³

#<intarziere> <specificatie_secventiala>

Specificatia ce are asociata o ıntarziere trebuie ınteleasa ca ”asteapta ıntarziereaimpusa ınainte de executia specificatiei asociate”.

Exemplu:

Snµ´¶³

initial begin#5 semnal = 1; // specificatia 1#6 semnal = 2; // specificatia 2#2 semnal = 3; // specificatia 3end

Specificatia initial ısi ıncepe executia la timpul 0. La acel moment, semnal nuprimeste nici o valoare, deci va avea valoarea x. Dupa 5 unitati de timp se executaspecificatia 1, iar semnal va lua valoarea 1. Dupa ınca 6 unitati de timp (deci la 11unitati de la ınceputul simularii) semnal ia valoarea 2. Dupa ınca 2 unitati de timp(deci la 13 unitati de la ınceputul simularii) semnal ia valoarea 3, pe care o pastreazapana la sfarsitul simularii.

Specificarea ıntarzierii se poate face chiar ın lipsa unei specificatii asociate. In acestcaz, semnificatia este ”asteapta ıntarzierea impusa ınainte de executia urmatoareispecificatii”.

Snµ´¶³

#<intarziere> ;

Un caz particular, dar nu lipsit de utilitate practica, ıl reprezinta ıntarzierea ex-plicita cu 0 unitati de timp:

#0 ;

Semnificatia acesteia este: ”nu se avanseaza timpul de simulare pana la terminareatuturor evenimentelor programate a avea loc la acest moment de timp”. De exemplu,urmatoarele cupluri de specificatii au comportamente diferite:

// atribuire blocanta plasata inaintea celei neblocantealways @(posedge clk) sigBloc_B1 = sigBloc_B1 + 1;always @(posedge clk) sigNebloc_B1 <= sigBloc_B1;

Page 71: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

2.7. Specificatii secventiale 61

// atribuire blocanta plasata inaintea celei neblocante// cu intarziere zero explicitaalways @(posedge clk) #0 sigBloc_B1 = sigBloc_B1 + 1;always @(posedge clk) sigNebloc_B1 <= sigBloc_B1;

Controlul evenimentelor consta din specificarea unei conditii bazate pe sem-nale care determina executia specificatiei asociate. Evenimentele pot fi controlate defronturi de semnale sau de niveluri de semnale. Controlul evenimentului asociat uneispecificatii secventiale determina ıntarzierea executiei specificatiei pana la ındeplinireaconditiei impuse.

Controlul evenimentelor pe baza de fronturi poate actiona pe frontul pozitiv, pecel negativ sau pe ambele. Fronturile se precizeaza prin cuvintele rezervate posedgesi negedge. Lipsa unuia din aceste cuvinte semnifica ”ambele fronturi”.

Fronturile sunt asociate evenimentelor prezentate ın tabelul 2.3.

Front negativ Front pozitiv1 -> x 0 -> x1 -> z 0 -> x1 -> 0 0 -> 1x -> 0 x -> 1z -> 0 z -> 1

Tabelul 2.3Asocierea fronturilor unui semnal cu evenimentele acestuia.

Snµ´¶³

@ <eveniment> <specificatie_secventiala>

Exemple:

@(posegde clk) semnal <= semnal + 1;@(posedge clk or negedge reset_n) semnal <= 8’b0;@(semnalA or semnalB) semnal <= ’bz;

In exemplul anterior, cuvantul rezervat or nu reprezinta un operator logic ci un”liant” pentru o conditie cu semnale multiple.

Urmatorul modul implementeaza un generator parametrizabil pentru semnale deceas si de reset (sincronizat cu semnalul de ceas).

Vnµ´¶³

‘timescale 1ns/1ps

module clkreset_noGen(clk_o, // semnal de ceas

Page 72: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

62 CAPITOLUL 2. FUNDAMENTELE LIMBAJULUI VERILOG HDL

reset_no // semnal de reset activ in 0);// perioada de ceasparameter tCkPer_p = 10; // implicit frecventa de 100 MHzparameter phaseCk_p = 0; // faza initiala a ceasuluiparameter phaseRst_p = 4; // faza activarii reset-ului

// masurata in perioade de ceasparameter resetWidth_p = 3; // latimea semnalului de reset masurata

// in perioade de ceas

output clk_o;output reset_no;reg clk_o;reg reset_no;

// generare semnal de ceasinitial begin

// valoare initialaclk_o <= 1’b0;// asteapta intarzierea determinata de faza initiala#(phaseCk_p);// complementeaza la fiecare semi-perioadaforever #(tCkPer_p/2) clk_o <= ~clk_o;

end

// generare semnal de reset activ in 0initial begin

reset_no <= 1’b1;// asteapta activarea reset-uluirepeat(phaseRst_p) @(posedge clk_o);// activeaza resetreset_no <= 1’b0;// asteapta dezactivarea reset-uluirepeat(resetWidth_p) @(posedge clk_o);// dezactiveaza resetreset_no <= 1’b1;

end

endmodule

Controlul evenimentelor pe baza de niveluri implementeaza un mecanism de ın-tarziere a executiei unei specificatii pana la ındeplinirea unei conditii complexe. Dacala aparitia specificatiei, conditia este deja adevarata, executia specificatiei asociateıntarzierii are loc imediat. Altfel, executia specificatiei asociate este amanata pana laındeplinirea conditiei impuse.

Snµ´¶³

Page 73: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

2.8. Directive de compilare 63

wait (<expresie>) <specificatie_secventiala>

Exemple:

wait (counter > 22) counter = 0;wait (rdy) data = intReg;wait (reset_ni);

2.8 Directive de compilare

Directivele de compilare nu descriu sisteme hardware, ci transmit simulatorului a-numite informatii utilizate ın procesul de simulare. La compilarea unei directive decompilare, efectul acesteia ramane pana la terminarea procesului de compilare, carepoate contine chiar mai multe fisiere. Directivele de compilare se identifica ın cod princuvintele cheie rezervate precedate de caracterul (‘). Efectul unor directive de com-pilare poate fi ıntrerupt de directive de compilare complementare. Lista directivelorde compilare Verilog este prezentata ın continuare:

• ‘define si ‘undefine: utilizate pentru substitutie de texte, similar cu utilizareadirectivei C #define. O substitutie impusa cu ‘define este valabila pana laaparitia directivei ‘undefine sau pana la compilarea tuturor fisierelor.

• ‘ifdef, ‘ifndef, ‘else, ‘endif: utilizate pentru compilari conditionate.

• ‘default_nettype: utilizata pentru stabilirea tipului de sarma implicit, ıncazul nedeclararii acestora. In lipsa acestei directive, sarma implicita este detip wire pe 1 bit.

• ‘include: utilizata pentru includerea ”in-line” a textului dintr-un fisier ın codulsursa, ın locul aparitiei directivei.

• ‘resetall: utilizata pentru anularea tuturor directivelor de compilare ante-rioare.

• ‘timescale: utilizata pentru asocierea unei valori absolute unitatii de timpVerilog.

• ‘unconnected_drive, ‘nounconnected_drive: utilizata pentru asocierea im-plicita a porturilor de intrare neconectate cu valori logice 0 sau 1.

• ‘cell_define, ‘endcell_define: utilizata pentru declararea unui modul cacelula posibil de accesat din rutine PLI.

2.8.1 ‘define si ‘undefine

Directiva de compilare‘define este utilizata pentru substitutia de texte. Alternativ,ea poate fi utilizata pentru a controla compilarea conditionata a unor portiuni de cod.

Exemple:

Page 74: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

64 CAPITOLUL 2. FUNDAMENTELE LIMBAJULUI VERILOG HDL

‘define WIDTH 32 // definire latime busreg[‘WIDTH-1:0] dataBus; // declarare bus de latime configurabila

// definire adrese relative pentru un set de registre‘define SDRAM_MODE_ADDR 8’h00...‘define WR_ADDR 8’h08

reg[3:0] sdramMode; // registru de mod al controlerului SDRAMreg[15:0] wrAddr; // registru pentru adresa de scriere

// scriere registrealways @(posedge mpuClk_i or posedge mpuReset_ni) begin

if (mpuReset_ni) beginsdramMode <= 4’b110_0;

endelse begin

//incarca sdramMode din bitii de date 6, 5, 4 si 0if (load && (mpuAddr_i == ‘SDRAM_MODE_ADDR)) beginsdramMode <= {mpuData_i[6:4], mpuData_i[0]};

endend

end

always @(posedge mpuClk_i or posedge mpuReset_ni) beginif (mpuReset_ni) begin

wrAddr <= 16’b0;endelse begin

if (load && (mpuAddr_i == ‘WR_ADDR)) beginwrAddr <= mpuData_i;

endend

end

// citire registrealways @(posedge mpuClk_i or posedge mpuReset_ni) begin

if (mpuReset_ni) beginmpuData_o <= 16’b0;

endelse begin

case (mpuAddr_i)‘SDRAM_MODE_ADDR:

mpuData_o <= {9’b0, sdramMode[3:1], 3’b0, sdramMode[0]};...‘WR_ADDR: mpuData_o <= wrAddr;...

Page 75: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

2.8. Directive de compilare 65

default: mpuData_o <= 16’hDEAD; // adresa neimplementataendcase

endend

2.8.2 ‘ifdef, ‘ifndef, ‘else, ‘endif

Aceste directive de compilare sunt utilizate pentru compilari conditionate. De e-xemplu, ın cazul ın care sistemul va fi implementat ca ASIC, dar se va face ınainteun prototip de validare implementat pe FPGA, anumite module specifice tehnologiei(memorii, circuite PLL, circuite aritmetice specifice) vor trebui ınlocuite. Este ınsade dorit a se mentine un singur set de fisiere sursa. Folosind directive de compilarese poate face un numar minim de schimbari pentru a configura un singur cod sursaspecific pentru fiecare tehnologie. Portiunea de cod de mai jos va fi inclusa ıntr-unfisier separat, (inclus ın codul sursa cu directiva ‘include) si semnalat ca fiind modulde alegere a tehnologiei pe care se va face implementarea:

‘define FPGA_tech // decomentati linia ce corespunde tehnologiei//‘define ASIC_tech

In codul sursa, componentele specifice tehnologiei se vor instantia conditionat dedefinirea sau nu a tehnologiei corespunzatoare:

‘ifdef FPGA_tech// instanta de PLL specifica tehnologiei FPGApllBlk UpllBlk (

.inClk (ddrClk ),

.shClk (shClk ),

.clk ( ),

.resyncClk (resyncClk ),

.SDR_CK (SDR_CK ),

.SDR_CK_N (SDR_CK_N ));‘endif

‘ifdef ASIC_tech// declaratii de sarme nefolositewire nc0, nc1;// instanta de DLL specifica tehnologiei ASICASIC_DLL UASIC_DLL(

.CLK (ddrClk ),

.DQS (1’b0 ),

.RST (~ddrReset_n ),

.CLK360 ({resyncClk, SDR_CK} ),

.CLK270 ({shClk,nc0} ), // iesirea este pe 2 biti, dar

.CLK180 ({SDR_CK_N, nc1} ), // numai unul este folosit

.CLK90 ( ));‘endif

Page 76: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

66 CAPITOLUL 2. FUNDAMENTELE LIMBAJULUI VERILOG HDL

Evitarea unor re-definiri succesive ın cazul includerii unui fisier ın mai multe surse sepoate face prin folosirea directivei ‘ifndef sau a directivelor ‘ifdef si ’else.

‘ifndef WIDTH‘ifdef WIDE_MODE

‘define WIDTH 16‘else

‘define WIDTH 8‘endif

‘endif

2.8.3 ‘include

Directiva ‘include este utilizata pentru includerea ”in-line” a textului dintr-un fisierın codul sursa, ın locul aparitiei directivei. Textul ce apare ın fisierul inclus poatecontine orice specificatii Verilog, nu neaparat un modul ıntreg. Aceasta directiva sepoate apela atat din afara, cat si ın interiorul descrierii unui modul.

Este recomandata mentinerea ıntr-un fisier separat a directivelor de definire. Demulte ori se doreste doar compilarea unui fisier, iar includerea fisierului de definitiiın fiecare fisier sursa ar determina o eroare de redefinire. Redefinirile multiple pot fievitate daca ın fisierul inclus, ınainte de sectiunea de definiri, se verifica daca definirilenu au fost deja facute (ca efect al includerii ıntr-un fisier sursa compilat anterior).

Continutul unui fisier (incl.h) este prezentat ın continuare:

‘ifndef DEFINED_ONCE // indicator care daca a fost definit// determina saltul peste sectiunea de// definiri

‘define DEFINED_ONCE 1 // la prima includere se defineste// indicatorulastfel incat la urmatoarele// includeri sa se gaseasca falsa// conditia de intrare in aceasta

// sectiune

‘define GAIN_ADDRESS 6 // definiri‘define OFFSET_ADDRESS 7...

‘endif

In unul sau mai multe fisiere sursa poate fi inclus fisierul incl.h astfel:

‘include "incl.h"

2.8.4 ‘timescale

In Verilog toate ıntarzierile sunt exprimate ın unitati de timp. Directiva ‘timescaleeste utilizata pentru asocierea unei valori absolute unitatii de timp Verilog.

Snµ´¶³

Page 77: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

2.9. ”Stil si calitate” 67

‘timescale <unitate_timp> / <precizie>

Directiva ‘timescale specifica unitatea de masura a timpului pentru ıntarzieri siprecizia ıntarzierilor mentionate ın toate modulele, pana la aparitia unei alte asemeneadirective. Este recomandat ca toate fisierele apartinand unui proiect sa contina aceeasidirectiva ‘timescale.

<unitate_timp> precizeaza valoarea absoluta a unitatii de timp.<precizie> specifica precizia cu care se vor rotunji valorile fractionale.Exemplu:

‘timescale 1ns / 100ps

Directiva stabileste valoarea absoluta a unitatii de timp la 1ns si precizia de ro-tunjire a valorilor ce reprezinta timp la 100ps.

assign #3.14 A = B & C // intarziere 3.1 nsassign #3.1 A = B & C // intarziere 3.1 nsassign #3 A = B & C // intarziere 3 ns

2.9 ”Stil si calitate”

Acest paragraf ısi propune sa prezinte recomandarile autorilor referitoare la modul descriere a codului Verilog. Nerespectarea acestor recomandari nu ınseamna ca este uncod scris gresit. Dar, orice firma impune tuturor proiectantilor un anumit ”stil” alcodului sursa ın scopul usurarii ıntelegerii ulterioare a acestuia. Regulile mentionateın continuare vor fi folosite la scrierea codului sursa prezentat ın aceasta carte.

• Numele identificatorilor. Modul de alegere a numelor pentru obiectele Ve-rilog este un semn al maturitatii si al experientei inginerului. In experintadidactica, autorii au ıntalnit multe module scrise foarte bine de catre studenti,dar cu nume care nu sugereaza nici pe departe ce modeleaza acele module. Numede module ca: test, lab_meu, raspuns_paul, sx2005 sau altele similare, nu daunici cea mai mica indicatie asupra comportamentului sau structurii modululuiVerilog.

Este de dorit ca numele identificatorilor sa fie sugestive pentru rolul acestoraın cadrul modelului Verilog. De exemplu, identificatorul counter nu sugereazaprea multe despre rolul pe care ıl are numaratorul modelat ın cadrul sistemului.Nici counter16 nu aduce prea multa informatie pentru ca, oricum, numarul debiti al numaratorului se poate vedea din declaratia acestuia(reg[15:0] counter16;). O denumire mai sugestiva ar fi rdAddr (adresa decitire a unei memorii) sau pulseCounter (un numarator al unor pulsuri) saudelayCntr (un numarator folosit pentru contorizarea unei ıntarzieri). Cu totulnerecomandate sunt denumirile derutante, care sugereaza ceva diferit de ceea cemodeleaza de fapt. De exemplu, denumirea counter asociata iesirii unui circuitcombinational.

De multe ori nu este usor de exprimat cu putine litere semnificatia unui semnal.Nu trebuie totusi exagerat cu denumiri extrem de lungi de genul ”numelor deindieni”: adresa_de_citire_a_memoriei_fifo_din_blocul_de_receptie. O

Page 78: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

68 CAPITOLUL 2. FUNDAMENTELE LIMBAJULUI VERILOG HDL

denumire mai potrivita, cu prescurtarea unor cuvinte, ar fi: rd_ads_rec. Seiveste problema delimitarii portiunilor de litere.

Nu este la fel ca un semnal sa fie denumit rdadsrec sau rd_ads_rec saurdAdsRec. Evident, prima forma este nerecomandata. Cea de-a doua formapresupune separarea atomilor ce prescurteaza cuvinte diferite prin caracterul desubliniere (_). Este o decizie buna, ınsa determina artificial lungirea numelor.Acest lucru scade productivitatea scriitorului de cod si determina ca liniile decod sa fie uneori prea lungi. A treia forma, denumita ın jargon inCaps, pre-supune folosirea majusculelor pe post de delimitatori. In acest caz, numeleidentificatorilor este scurtat la minim. Cu putin exercitiu, aceasta forma devinefoarte intuitiva pentru cititorul unui cod scris de altcineva.

Se remarca faptul ca Verilog face distinctie ıntre numele identificatorilor scrisecu litere mari si mici. De exemplu, urmatorii identificatori desemneaza obiectediferite: rdadsrec, rdAdsRec, RdAdsRec, rdadsRec. Evident, aparitia unorasemenea nume poate fi o greseala de tastare si va fi imediat semnalata laanaliza sintactica a codului Verilog. Dar daca proiectantul a declarat cu intentieun semnal cu numele rdadsRec si altul cu numele rdAdsRec atunci o eroare detastare nu mai este semnalata ca eroare de sintaxa si va fi mai greu de depistat.

• Numele porturilor si ale parametrilor. O atentie particulara trebuie acor-data alegerii numelor pentru porturi si parametrii deoarece acestea reprezintaimaginea exterioara a modulului proiectat. Semnalele au vizibilitate doar ın in-teriorul modulului. Denumirile porturilor si ale parametrilor vor fi ınsa vazutesi vor trebui ıntelese, de catre alti ingineri care folosesc (instantiaza) acel modul.In plus, este foarte util pentru un scriitor de cod Verilog sa stie imediat dacaun identificator reprezinta un parametru, un port de intrare, un port de iesiresau un semnal intern acelui modul. De exemplu, se va putea imediat con-stata o eroare ıntr-o specificatie de genul assign width_p = 1’b0 daca seva stii ca identificatorul width_p este de fapt un parametru caruia nu i sepoate atribui o valoare folosind specificatia assign. Sau, o specificatie de genulassign data_o = data_i va sugera imediat ca este vorba nu doar de o simplaatribuire de semnale, ci de modelarea unei sarme care trece prin modul fara nicio prelucrare (daca data_o este port de iesire, iar data_i este port de intrare).Asemenea tip de conexiune (”feed-through”, ın limba engleza) nu este ilegal,dar trebuie folosit cu atentie.

Pentru usoara identificare a obiectului denumit, se recomanda stabilirea unorconventii de denumire a porturilor si a parametrilor. Codul prezentat ın acestacarte se conformeaza urmatoarelor reguli:

– Porturile de intrare au nume sufixate cu caracterele _i (daca este intrareactiva ın 1) si _ni (daca este intrare activa ın 0). Exemple: data_i,reset_ni, flag_i, rdRq_i, rdAddr_i.

– Porturile de iesire au nume sufixate cu caracterele _o (daca este iesireactiva ın 1) si _no (daca este iesire activa ın 0). Exemple: data_o, stat_o,rdRq_o, rdAddr_o, ras_no, cas_no, cs_no.

– Porturile bidirectionale au nume sufixate cu caracterele _io. Exemple:data_io, cpuData_io.

Page 79: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

2.9. ”Stil si calitate” 69

– Parametrii au nume sufixate cu caracterele _p. Exemple: width_p,length_p, messageOn_p.

Semnalele interne, fiind cu vizibilitate locala si fiind atat citite, cat si atribuite ıninteriorul modulelor, nu vor avea nici un sufix. Se recomanda evitarea terminariinumelor identificatorilor cu caracterul de subliniere (_) deoarce multe programeEDA ıl folosesc pentru a delimina portiuni de caractere la formarea automataa numelor. Acest lucru poate produce nu doar confuzie, dar si erori foarte greude gasit ın netlistul obtinut prin sinteza.

Un caz particular ıl constituie identificatorii definiti ın directive de compilare‘define. Directiva ‘define implementeaza un mecanism de substituire de textsi este similara cu directiva #define din limbajul C. Directiva ‘define poatesa apara si ın afara specificatiilor de module si are vizibilitate asupra tuturorfisierelor sursa ce se compileaza ın continuare. Pentru a identifica mai usordenumirile macro-urilor asociate prin aceasta directiva se recomanda folosireamajusculelor pentru numele acestora.

// coduri de comenzi‘define CMD_IDLE 3’h0‘define CMD_WRITE 3’h1‘define CMD_READ 3’h2‘define CMD_BCAST 3’h7//Adresa de start a setului de registre‘define REGS_START_ADDRESS 16’h2000//Adresele relative ale registrelor‘define ADDR_CH_CNTRL 8’h00‘define ADDR_CH1_CNTRL 8’h02‘define ADDR_CH2_CNTRL 8’h03

• Folosirea delimitatorilor begin si end. Desi folosirea acestor demitatorinu este necesara daca se include o singura specificatie, este o buna practica ase folosi acestia ın toate cazurile. Ca rezultat, se obtine un cod cu un aspectuniform, usor de urmarit si de corectat sintactic. Pentru a alinia cuvintele cheiece apartin aceleiasi specificatii (if, else) si a specificatiilor secventiale dintr-unbloc se recomanda folosirea a doua caractere spatiu sau a caracterului tabulator.Recomandarea este exemplificata prin urmatoarea portiune de cod.

always @(posedge cpuClk_i) beginif (!cpuReset_ni) begin

outRange <= 1’b0;startOp <= 1’b0;

endelse begin

if (devSel && (cpuAddr_i == ‘ADDR_STATUS)) beginoutRange <= cpuD_i[0];startOp <= cpuD_i[1];

end

Page 80: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

70 CAPITOLUL 2. FUNDAMENTELE LIMBAJULUI VERILOG HDL

else beginif (setOutRange) begin

outRange <= 1’b1;endif (resetStartOp) begin

startOp <= 1’b0;end

endend

endend

Fara respectarea acestei recomandari, aceeasi portiune poate fi scrisa, (perfectlegal) dupa cum urmeaza:

always @(posedge cpuClk_i)if (!cpuReset_ni) begin

outRange <= 1’b0;startOp <= 1’b0;

endelse

if (devSel && (cpuAddr_i == ‘ADDR_STATUS)) beginoutRange <= cpuD_i[0];startOp <= cpuD_i[1];

endelse begin

if (setOutRange)outRange <= 1’b1;

if (resetStartOp)startOp <= 1’b0;

end

Desi cele doua portiuni de cod sunt echivalente, ın exemplul recomandat seremarca usurinta cu care se verifica ınchiderea tuturor delimitatorilor begin cudelimitatori end corespunzatori ca numar.

Ca test, se propune gasirea erorii existente ın codul urmator. Care delimitatorbegin nu are corepondent end?

always @(posedge cpuClk_i) beginif (!cpuReset_ni) begin

outRange <= 1’b0;startOp <= 1’b0;

endelse begin

if (devSel && (cpuAddr_i == ‘ADDR_STATUS)) beginoutRange <= cpuD_i[0];startOp <= cpuD_i[1];

Page 81: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

2.9. ”Stil si calitate” 71

endelse begin

if (setOutRange) beginoutRange <= 1’b1;

endif (resetStartOp)

startOp <= 1’b0;end

end

Un alt argument ın favoarea respectarii acestei recomandari este eliminareaambiguitatii ramurilor else ın cazul unor specificatii if imbricate.

always @(posedge clk_i)if (!reset_ni)

rdAddr <= 1’b0;else

if (en) // primul ifif (ld) // al doilea if

rdAddr <= 1’b0;else // carui if apartine acest else?if (inc)

rdAddr <= rdAddr + 1;

Codul recomandat este urmatorul:

always @(posedge clk_i) beginif (!reset_ni) begin

rdAddr <= 1’b0;endelse begin

if (en) beginif (ld) begin

rdAddr <= 1’b0;endelse begin

if (inc) beginrdAddr <= rdAddr + 1;

endend

endend

O alternativa de scriere mai condensata, ın cazul specificatiilor always careatribuie valori doar unui semnal este prezentata ın continuare:

always @(posedge cpuClk_i)if (!cpuReset_ni) outRange <= 1’b0; else

Page 82: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

72 CAPITOLUL 2. FUNDAMENTELE LIMBAJULUI VERILOG HDL

if (devSel && (cpuAddr_i == ‘ADDR_STATUS))outRange <= cpuD_i[0]; else

if (setOutRange) outRange <= 1’b1;

always @(posedge cpuClk_i)if (!cpuReset_ni) startOp <= 1’b0; elseif (devSel && (cpuAddr_i == ‘ADDR_STATUS))

startOp <= cpuD_i[1]; elseif (resetStartOp) startOp <= 1’b0;

• Existenta unui antet al fisierului. Este recomandata existenta unor informa-tii la ınceputul fiecarui fisier sursa, marcate ca fiind comentarii ın Verilog. Formagrafica a acestui antet (”header”, ın limba engleza) nu este importanta. Inschimb, este important ca antetul sa fie simplu, dar sa contina toate informatiilerelevante necesare:

– Numele proiectului din care face parte fisierul;

– Numele autorului;

– Numele fisierului (pentru a aparea ın cazul imprimarii codului sursa);

– Scurta descriere a modulului descris ın acel fisier;

– Tabelul modificarilor asupra codului (cu siguranta codul va fi modificat ıntimp pentru a adauga noi caracteristici sau a rezolva defectele observate).

Ca exemplu, ın continuare se prezinta formatul antetul utilizat pentru fisierelece ınsotesc aceasta carte.

/************************************************************* Proiect: Carte "Electronica digitala"* Autor: Dan NICULA (DN)* Email: [email protected]* Nume fisier: upDnCounter.v* Descriere: Numarator reversibil* Revizii:* Data Autor Modificari* Aug 20, 2005 DN Versiune initiala* Aug 27, 2005 DN Adaugat optiune de preset sincron*************************************************************/

De remarcat ca, ın antetul propus, nu s-au adaugat caracterele * si la sfarsitulfiecarei linii. Desi ar parea frumos, adaugarea de texte ulterior ar impune re-alinierea caracterelor *, ceea ce ar consuma un timp pretios.

• Comentarii. Este recomandata adaugarea comentariilor ın cod simultan cuscrierea codului, nu ulterior. Exista doua feluri de comentarii:

– comentarii pe linii multiple, referitoare la blocuri mari de cod si

– comentarii pe un singur rand sau la sfarsitul randului, referitoare la oanumita expresie sau specificatie.

Page 83: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

2.9. ”Stil si calitate” 73

Comentariile trebuie sa aiba urmatoarele caracteristici:

– sa fie scurte;

– sa fie relevante;

– sa fie plasate ınaintea portiunii de cod la care se face referire.

Lista porturilor unui modul se recomanda a fi scrisa cate un singur port pe unrand. In acest fel, se poate scrie ın dreptul fiecarui port o scurta descriere, casi comentariu.

module add1C (a, // primul operandb, // al doilea operandci, // transport de intrares, // rezultatulco // transport de iesire

);

Comentariile trebuie sa fie relevante pentru specificatia sau identificatorul lacare face referire. De exemplu, urmatoarele comentarii nu sunt foarte relevante:

always @(posedge clk or negedge reset_n)if (!reset_n) rd_addr <= 16’b0; else // reseteaza rd_addrif (updt_cnt) rd_addr <= rd_addr + 1; // incrementeza rd_addr

Este evident (din specificatia existenta pe acelasi rand cu comentariul)ca rd_addr se incrementeaza. Este evidenta si conditia de incrementare a acestuiregistru. Ce nu este evident, si ar trebui sa fie precizat printr-un comentariu, estesemnificatia registrului rd_addr ın cadrul sistemului. De exemplu, ın continuarese prezinta acelasi cod cu comentarii considerate relevante:

// rd_addr: adresa de citire a memoriei de stocare// a datelor acceptatealways @(posedge clk or negedge reset_n)

if (!reset_n) rd_addr <= 16’b0; else// updt_cnt: semnal generat de blocul de receptieif (updt_cnt) rd_addr <= rd_addr + 1;

• Asocierea explicita a porturilor cu semnalele, la instantierea unuimodul. Alternativa asocierii prin pozitie nu este recomandata deoarece poategenera erori nu numai ın cazul asocierii gresite, ci si ın cazul adaugarii saueliminarii unor porturi ale modulului. In plus, este recomandata plasarea pe olinie de cod a unui singur cuplu port-semnal actual cu posibilitatea de a adaugaun comentariu la sfarsitul liniei. In cazul prezentat ın continuare, asociereadintre porturi si semnale se face prin pozitie. Va fi greu de gasit greseala pentruca, ın anumite cazuri, raspunsul este corect chiar daca au fost facute conexiunigresite.

Page 84: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

74 CAPITOLUL 2. FUNDAMENTELE LIMBAJULUI VERILOG HDL

add1C U0_add1C( a[0], b[0], 1’b0, sU1[0], coU1);add1C U1_add1C( a[1], b[1], coU1, coU2, sU2[1]);

Daca pentru unele porturi denumirea semnalelor asociata este sugestiva, pentrua vedea ce port este conectat la masa (asociat cu 1’b0) trebuie sa se deschidaun alt fisier si sa se verifice ordinea porturilor la declararea modulului add1C.

Modul recomandat de instantierea unui modul este ca ın exemplul urmator:

add1C U2_add1C(.a (a[2] ),.b (b[2] ),.ci (coU2 ), // transport provenit de la U2_add1C.s (sU3[2] ),.co (coU3 ) // transportul se propaga la U4_add1C

);

• Continutul unui fisier sursa. Se recomanda ca un fisier sa contina descriereaunui singur modul. In plus, daca numele fisierului este identic cu numele mo-dulului descris ın acel fisier, cautarea descrierii unui modul este mult usurata.Exceptie de la aceasta recomandare o fac fisierele ce contin descrierea unor”biblioteci de componente”. In acest caz, mai multe descrieri de module suntincluse ın acelasi fisier si sunt compilate printr-o singura comanda. Este totalneinspirata includerea a doua module cu cod Verilog ın acelasi fisier deoarececautarea celui de-al doilea modul (a carui ınceput se afla undeva prin mijloculfisierului) va fi foarte anevoioasa. Uneori, se recomanda includerea unor fisierecu directiva de compilare ‘include. Este cazul plasarii unor parametri posibilde configurat separat de codul sursa ce nu trebuie modificat. Aceste fisierese recomanda a fi denumite cu alta extensie decat .v pentru a nu fi selectatealaturi de fisierele ce contin declaratii de module. Extensia acestor fisiere nueste impusa, dar se recomanda a fi .h.

Se recomanda pastrarea fisierelor sursa Verilog ın directoare distincte, ın functiede rolul lor. In folderul src se vor pastra fisierele Verilog ce descriu sistemulproiectat, fisiere care ın final se vor sintetiza. Fisierele care modeleaza mediul desimulare, vor fi plasate ıntr-un alt folder, denumit sim. Fisierele ce contin datereferitoare la sinteza (constrangeri de timp, asocieri de pini) vor fi plasate ıntr-unfolder separat denumit syn. Aceasta ”ordine” a fisierelor permite altor membriiai echipei de proiectare un acces rapid la fisiere. Totodata, fisierele generatede diverse produse software vor fi plasate automat ın folderele corespunzatoare:folderul sim fisiere generate la simulare si folderul syn fisiere generate la sinteza.

• Transmiterea parametrilor cu directive defparam. Functionarea sau struc-tura unui modul poate fi modificata prin folosirea unor parametri. Parametriireprezinta constante pentru instantierea modulelor si au valori implicite, pre-cizate ın cadrul declaratiei de module. Valorile implicite ale parametrilor pot fimodificate ın momentul instantierii modulelor sau prin directive de compilaredefparam. A doua metoda, daca este suportata de programele de sinteza, arecateva avantaje. Avantajul principal consta ın faptul ca se pot schimba numai

Page 85: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

2.9. ”Stil si calitate” 75

anumite valori ale parametrilor, fara a se cunoaste ordinea definirii acestora ınmodule. In plus, folosirea directivei defparam produce o mai buna documentarea codului sursa. In continuare sunt prezentate doua exemple de transmitere aparametrilor.

– Transmiterea parametrilor la instantierea modulelor:

wire[7:0] a;wire[7:0] b;wire[7:0] s1;wire[7:0] s2;wire[3:0] s3;wire co1, c02, c03;

// sumator pe 8 bitiaddxC #(8) Sum1(

.a (a ),

.b (b ),

.ci (1’b0 ),

.s (s1 ),

.co (co1 ));

– Transmiterea parametrilor cu directive defparam:

defparam Sum2.width = 8;defparam Sum3.width = 4;

// sumator pe 8 bitiaddxC Sum2(

.a (a ),

.b (b ),

.ci (1’b0 ),

.s (s2 ),

.co (co2 ));// sumator pe 4 bitiaddxC Sum3(

.a (a[3:0] ),

.b (b[3:0] ),

.ci (1’b0 ),

.s (s3 ),

.co (co3 ));

• Declararea sarmelor la ınceputul modulului. Declararea variabilelor caremodeleaza sarme (wire si reg) se poate face oriunde ın cod. Singura conditieeste ca declaratia sa preceada prima referire la sarma respectiva. Totusi, esterecomandata plasarea grupata, imediat dupa declararea porturilor, a tuturordeclaratiilor de sarme. Nerespectarea aceastei reguli ar putea determina ca, la

Page 86: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

76 CAPITOLUL 2. FUNDAMENTELE LIMBAJULUI VERILOG HDL

mutarea unor specificatii, declaratia unor sarme sa ramana mai jos producandinutile erori de sintaxa.

Verilog permite declararea implicita a unui tip de sarma, de obicei sarma de tipwire de un bit. Se recomanda totusi declararea explicita a tuturor sarmelor sitotodata adaugarea unui mic comentariu despre semnificatia acestora.

• Scrierea a maxim 80 de caractere pe o linie de cod. Desi ın marea ma-joritate a timpului codul sursa este vizualizat pe monitor, uneori este utila im-primarea acestuia pe hartie. Pentru a evita consumarea timpului cu formatareacodului astfel ıncat sa se tipareasca ın ıntregime, este de preferat scrierea codu-lui cu nu mai mult de 80 de caractere pe linie. In Verilog, o specificatie poate fiscrisa pe mai multe linii, fara a fi necesara o delimitare explicita.

• Nefolosirea constantelor numerice ın cod. Se recomanda evitarea folosiriiconstantelor numerice ın codul sursa. O constanta folosita direct ın cod estefoarte putin ”vizibila” la depanarea codului. In schimb, daca marimile con-stante se asociaza unui identificator cu o denumire sugestiv aleasa, acestea potfi usor localizate ın cod. Actualizarea valorii constante ıntr-un singur loc seva propaga automat ın cod, ın cazul apelarii acestei valori de catre mai multespecificatii. Declararea constantelor se face prin directiva de compilare ‘define.Se recomanda folosirea majusculelor pentru identificatorii ce definesc constante.

// Numar de biti de adresa si de date‘define ADDR_BIT_NO 8‘define DATA_BIT_NO 8// Adresele relative ale registrelor‘define ADDR_CH_CNTRL 8’h00‘define ADDR_CH1_CNTRL 8’h02‘define ADDR_CH2_CNTRL 8’h03...output[DATA_BIT_NO-1:0] cpuData_o;reg[DATA_BIT_NO-1:0] cpuData_o;...reg[DATA_BIT_NO-1:0] devCtrl;reg[DATA_BIT_NO-1:0] devCh1Ctrl;reg[DATA_BIT_NO-1:0] devCh2Ctrl;...// scrierea registrului de control de catre CPUassign wrCtrl = devSel_i &

(cpuAddr_i[ADDR_BIT_NO-1:0] == ‘ADDR_CH_CNTRL);always @(posedge cpuClk_i)

if (!cpuReset_ni) devCtrl <= ’b0; elseif (wrCtrl) devCtrl <= cpuData_i;

// citirea registrelor de catre CPUalways @(posedge cpuClk_i)

if (!cpuReset_ni) cpuData_o <= ’b0; elsecase (cpuAddr_i[ADDR_BIT_NO-1:0])

Page 87: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

2.9. ”Stil si calitate” 77

‘ADDR_CH_CNTRL : cpuData_o <= devCtrl;‘ADDR_CH1_CNTRL: cpuData_o <= devCh1Ctrl;‘ADDR_CH2_CNTRL: cpuData_o <= devCh2Ctrl;...

endcase

Se remarca faptul ca modificarea spatiului de adrese sau chiar a numarului debiti de adrese sau de date, se poate face prin modificarea valorilor definite, faramodificari ın codul sursa.

Page 88: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...
Page 89: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

Capitolul 3

MODELAREACIRCUITELORELEMENTARE

Acest capitol prezinta modalitatea uzuala de modelare a blocurilor digitale ın vedereasintetizabilitatii. Alte modalitati de modelare, a bibliotecilor de componente primitivesau a mediilor de testare, sunt considerate notiuni avansate si sunt tratate separatın capitolul 4. Altfel spus, se prezinta ın acest capitol modelarea ”RTL” a diverselorstructuri ıntalnite ın circuitele integrate digitale.

3.1 Circuite combinationale

Portile logice si circuitele logice ın general se pot modela individual cu specificatiide atribuire continua (assign) sau cu specificatii de atribuire procedurale (always).Alternativ, circuitele logice secventiale pot fi modelate ın cadrul specificatiilor alwayscare descriu simultan registrele si logica ce determina starea lor viitoare (cazuri prezen-tate ın sectiunile 3.7 si 3.8).

3.1.1 Modelarea circuitelor logice cu assign

Circuitul logic combinational caracterizat de functia AOI (And-Or-Invert)F = A.B + C.D poate fi descris astfel:

wire A, B, C, D;wire F; // iesirea se declara ca wireassign F = ~(A&B | C&D); // se folosesc regulile de precedenta ale

// operatorilor

Modelarea cu assign are avantajul unei descrieri concise, foarte apropiata de re-alizarea fizica si foarte intuitiva. Semnalele care apar ın stanga sunt iesirile, iarsemnalele care apar ın dreapta simbolului de atribuire (=) sunt intrarile circuituluicombinational.

79

Page 90: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

80 CAPITOLUL 3. MODELAREA CIRCUITELOR ELEMENTARE

Un lucru important la modelarea pentru sintetizabilitate este constientizarea nu-marului de intrari ale unui circuit combinational.

wire[7:0] aBus; // semnale de 8 bitiwire[7:0] bBus;wire G, H, I, J, K;assign G = (aBus == 8’h78); // 8 intrari, functia este 1 daca

// intrarea este egala cu 8’h78assign H = (aBus == bBus); // 16 intrari, functia este 1 daca

// intrarea aBus (8 biti) este egala cu// intrarea bBus (8 biti)

assign I = (|aBus); // 8 biti, OR pe biti,// echivalent cu (aBus != 0)

assign J = (~|(aBus~^bBus)); // 16 biti, echivalent cu (aBus==bBus)assign K = (aBus[0] & &bBus); // 7 biti, AND intre toti bitii

// semnalului bBus si bitul [0]// al semnalului aBus,// echivalent cu &{aBus[0], bBus}

3.1.2 Modelarea circuitelor logice cu always

Modelarea circuitelor logice cu specificatii always are avantajul posibilitatii folosiriispecificatiilor secventiale (if, case) pentru definirea unor functii mai complexe. Insa,modelarea circuitelor logice cu specificatii procedurale necesita o atentie sporita de-oarece contine o redundanta. Lista de senzitivitati a specificatiei always trebuiesa contina toate semnalele ce apar ın dreapta simbolurilor de atribuire procedurala.Neaparitia unui semnal de intrare ın lista de descriere a evenimentului asociat speci-ficatiei always poate determina aparitia unui latch ın urma sintezei. Daca vectorii detest sunt bine alesi, defectul se poate pune ın evidenta si la nivel RTL.

Circuitul logic combinational caracterizat de functia AOI (And-Or-Invert) F =A.B + C.D poate fi descris astfel:

wire A, B, C, D;reg L; // iesirea se declara ca regalways @(A or B or C or D) // cuvantul or este doar "liantul"

// pentru lista de senzitivitati// (nu semnifica operatorul logic OR)

L <= ~(A&B | C&D);

Cum se sintetizeaza urmatoarea specificatie?

always @(A or B or C) // lipseste intrarea DM <= ~(A&B | C&D);

Se observa ca iesirea M nu se re-evalueaza daca se modifica intrarea D deoarece aceastanu este prezenta in lista de senzitivitati. Sintetizatoarele actuale recunosc o potentialagreseala si emit mesaje de atentionare ca:

@W:Incomplete sensitivity list - assuming completeness@W:Referenced variable D is not in sensitivity list

Page 91: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

3.2. Circuite de multiplexare 81

WARNING:

The signals <D> are missing in the sensitivity list of always block.

Unul din motivele cele mai frecvente pentru modelarea circuitelor combinationa-le cu specificatie always este cazul modelarii multiplexoarelor cu multe intrari deselectie, cu specificatie secventiala case. Trebuie acordata atentie existentei specifi-catiei default. Altfel, circuitul rezultat din sinteza va contine un latch. Se remarcafaptul ca lista intrarilor contine atat intrarile de date, cat si intrarea de selectie.

wire[1:0] sel;wire i0, i1, i2, i3;reg mux;always @(sel or i0 or i1 or i2 or i3)

case (sel)2’b00: mux <= i0;2’b01: mux <= i1;2’b10: mux <= i2;default: mux <= i3;endcase

Figura 3.1 prezinta structurile hardware sintetizate din codul prezentat ın aceastasectiune.

3.2 Circuite de multiplexare

Circuitul multiplexor 2:1 poate fi modelat cu operatorul conditional: daca selectiaeste 1, la iesire se propaga intrarea de date 1, altfel la iesire se propaga intrarea dedate 0.

wire muxassign mux = sel ? i1 : i0;

Alternativa secventiala permite utilizarea specificatiei if:

reg mux;always @(sel or i0 or i1)

if (sel)mux <= i0;

elsemux <= i1;

Circuitele de multiplexare cu numar mai mare de intrari de selectie pot fi modelatecu specificatia case, asa cum a fost prezentat ın sectiunea 3.1.

3.3 Codificator/decodificator

Modelarea codificatoarelor se poate face folosind specificatia case, pornind de latabelul de adevar al acestor functii: codificarea ın binar a indexului bitului egal cu 1

Page 92: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

82 CAPITOLUL 3. MODELAREA CIRCUITELOR ELEMENTARE

Figura 3.1 Structuri obtinute prin sinteza modelelor de circuite combinationale prezentateın sectiunea 3.1.

Page 93: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

3.3. Codificator/decodificator 83

ın vectorul de intrare. Circuitul codificator descris ın exemplul urmator presupuneexistenta unui singur bit egal cu 1 ıntre cei 8 biti de intrare.

always @(A)case(A)8’b1000_0000: Y <= 3’b111; // 78’b0100_0000: Y <= 3’b110; // 68’b0010_0000: Y <= 3’b101; // 58’b0001_0000: Y <= 3’b100; // 48’b0000_1000: Y <= 3’b011; // 38’b0000_0100: Y <= 3’b010; // 28’b0000_0010: Y <= 3’b001; // 18’b0000_0001: Y <= 3’b000; // 0default: Y <= 3’bx; // nici o intrare activa

// sau mai mult de o intrare activaendcase

In cazul acceptarii la intrare a mai multor biti egali cu 1, circuitul codificatortrebuie sa impuna o prioritate. Modelarea prioritatilor se poate face cu specificatiacasex. Spre deosebire de specificatia case, specificatia casex accepta descriereaintrarilor indiferente (”don’t care”, ın limba engleza). De remarcat ca, ın cazul ın careexpresia de selectie corespunde mai multor optiuni casex, este executata specificatiace corespunde primei coincidente dintre variabila de selectie si expresiile listate.

always @(A)casex(A)8’b1xxx_xxxx: Y <= 3’b111; // 78’b01xx_xxxx: Y <= 3’b110; // 68’b001x_xxxx: Y <= 3’b101; // 58’b0001_xxxx: Y <= 3’b100; // 48’b0000_1xxx: Y <= 3’b011; // 38’b0000_01xx: Y <= 3’b010; // 28’b0000_001x: Y <= 3’b001; // 18’b0000_0001: Y <= 3’b000; // 0default: Y <= 3’bx; // nici o intrare activaendcase

In continuare este prezentat modelul unui circuit codificator cu prioritate cu intraresi iesire de validare.

Tnµ´¶³

Vnµ´¶³

module encoder(A_i, // intrarea codificatoruluiE_i, // validare intrareY_o, // iesirea codificatoruluiE_o // validare iesire);

Page 94: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

84 CAPITOLUL 3. MODELAREA CIRCUITELOR ELEMENTARE

input[7:0] A_i; // intrare de dateinput E_i; // intrare de validareoutput[2:0] Y_o;output E_o;

reg[2:0] Y_o;reg E_o;

always @(A_i or E_i) // intrari codificatorif (E_i) begin

casex(A_i)8’b1xxx_xxxx: {E_o, Y_o} <= 4’b1_111; // 78’b01xx_xxxx: {E_o, Y_o} <= 4’b1_110; // 68’b001x_xxxx: {E_o, Y_o} <= 4’b1_101; // 58’b0001_xxxx: {E_o, Y_o} <= 4’b1_100; // 48’b0000_1xxx: {E_o, Y_o} <= 4’b1_011; // 38’b0000_01xx: {E_o, Y_o} <= 4’b1_010; // 28’b0000_001x: {E_o, Y_o} <= 4’b1_001; // 18’b0000_0001: {E_o, Y_o} <= 4’b1_000; // 0default: {E_o, Y_o} <= 4’b0_000; // nici o intrare activaendcase

endelse begin // circuit nevalidat la intrare

{E_o, Y_o} <= 4’b0_000;end

endmodule

Circuitul decodificator se poate descrie folosind operatorul de deplasare stanga,pornind de la interpretarea functiei decodificatorului: deplaseaza spre stanga un bit 1pe iesire cu numarul de pozitii precizat la intrare.

wire[2:0] A;wire[7:0] Y;assign Y = (1’b1 << A);

Se observa ca daca A=3’b000, atunci Y=8’b0000_0001.Daca A=3’b001, atunci Y=(8’b0000_0001 << 1)=8’b0000_0010.Daca A=3’b111, atunci Y=(8’b0000_0001 << 7)=8’b1000_0000.Urmatorul model prezinta un circuit decodificator cu intrare de validare.

module decoder(A_i, // intrarea decodificatoruluiE_i, // validare intrareY_o // iesirea decodificatorului);

input[2:0] A_i;

Page 95: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

3.4. Latch D 85

input E_i;output[7:0] Y_o;

reg[7:0] Y_o;

always @(A_i or E_i) // intrari codificatorif (E_i) Y_o <= (1’b1 << A_i); else

Y_o <= 8’b0; // circuit nevalidat la intrare

endmodule

3.4 Latch D

Circuitele latch trebuie modelate cu un semnal de mentinere a starii. O atentiedeosebita trebuie acordata modelarii nedorite a unor structuri de tip latch. Urmatorulcod Verilog modeleaza un circuit multiplexor, similar celui prezentat ın figura 3.2.

always @(sel or in0 or in1 or in2 or in3)case (sel)2’b00 : y <= in0;2’b01 : y <= in1;2’b10 : y <= in2;2’b11 : y <= in3;endcase

Figura 3.2 Multiplexor 4:1.

O linie lipsa ın codul anterior, determina aparitia dupa sinteza a unui latch nedorit,prezentat ın figura 3.3.

Page 96: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

86 CAPITOLUL 3. MODELAREA CIRCUITELOR ELEMENTARE

always @(sel or in0 or in1 or in2 or in3)case (sel)2’b00 : y <= in0;2’b01 : y <= in1;2’b10 : y <= in2;

//2’b11 : y <= in3; // optiune lipsaendcase

Figura 3.3 Latch nedorit aparut ın urma unei specificatii case incomplete.

Modelul circuitului latch elementar este prezentat ın continuare. Se observa faptulca latch-ul re-evalueaza iesirea conditionat de semnalul de ceas si de semnalul dedate. Daca semnalul de ceas este 1, atunci iesirea copiaza intrarea. Altfel, iesirea nueste re-evaluata si, ın consecinta, valoarea acesteia este pastrata (conform definitieisemnalului de tip reg).

// latch Dalways @(clk or d)if (clk)

q <= d;

3.5 Bistabil D/RS

Bistabilul este circuitul elementar pe care se bazeaza sistemele secventiale. Modelareaacestuia se face cu specificatie always pornind de la descrierea functionarii acestuia: ınmomentele determinate de frontul pozitiv al semnalului de ceas, bistabilul memoreazaintrarea.

// bistabil Dalways @(posedge clk)

q <= d;

Se observa ca specificatia q <= d; se executa numai ın momentele aparitiei unuifront pozitiv de ceas (@(posedge clk)). Valoarea initiala a bistabilului, ınainte deprimul front activ, este neprecizata, fiind x ın modelul de simulare. Pentru a modelaun semnal de reset asincron, modelul trebuie modificat astfel:

Page 97: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

3.5. Bistabil D/RS 87

// bistabil D cu reset asincron activ highalways @(posedge clk or posedge reset)if (reset) q <= 1’b0; else

q <= d;

Se observa ca modificarea valorii bistabilului q este posibila la activarea semnalu-lui de reset, indiferent de semnalul de ceas. Daca semnalul de reset este inactiv(reset=0), modelul se reduce la cel al unui bistabil D elementar. Bistabilele cu set sireset asincrone se recomanda a fi evitate ın proiectare. La modelarea acestora trebuieobservata necesitatea prioritatii tratarii intrarilor asincrone.

Bistabilele cu intrari de set si/sau reset sincrone sunt cazuri particulare de circuitesecventiale si se modeleaza corespunzator.

// bistabil D cu reset sincron activ highalways @(posedge clk) // reset sincron => nu apare in lista// clk resetSync | q+ // de senzitivitati (descrierea// --------------------- // evenimentului de declansare a// ^ 1 | 0 // specificatiei always)// ^ 0 | d

if (resetSync) q <= 1’b0; elseq <= d;

// bistabil D cu reset sincron activ low// clk resetSync | q+// ---------------------// ^ 0 | 0// ^ 1 | dalways @(posedge clk)

if (~resetSync_n) q <= 1’b0; elseq <= d;

// bistabil D cu set si reset sincron active low// clk setSync_n resetSync_n | q+// --------------------------------// ^ 0 x | 1// ^ 1 0 | 0// ^ 1 1 | dalways @(posedge clk)

if (~setSync_n) q <= 1’b1; else // set prioritarif (~resetSync_n) q <= 1’b0; else

q <= d;

// bistabil D cu set si reset sincron active low si// reset asincron activ low// resetAsync_n clk setSync_n resetSync_n | q+// ----------------------------------------------// 0 x x x | 0// 1 ^ 0 x | 1

Page 98: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

88 CAPITOLUL 3. MODELAREA CIRCUITELOR ELEMENTARE

// 1 ^ 1 0 | 0// 1 ^ 1 1 | dalways @(posedge clk or negedge resetAsync_n)

if (~resetAsync_n) q <= 1’b0; else // reset asincron// (exista in lista de

// descriere a evenimentului)if (~setSync_n) q <= 1’b1; else // set prioritarif (~resetSync_n) q <= 1’b0; else

q <= d;

// bistabil D cu set si reset sincron active low si// reset asincron activ low// resetAsync_n clk setSync_n resetSync_n | q+// ----------------------------------------------// 0 x x x | 0// 1 ^ 0 x | 1// 1 ^ 1 0 | 0// 1 ^ 1 1 | q (pastreaza starea)always @(posedge clk or negedge resetAsync_n)

if (~resetAsync_n) q <= 1’b0; else // reset asincronif (~setSync_n) q <= 1’b1; else // set prioritarif (~resetSync_n) q <= 1’b0; // nu exista ’else’,

// pastreaza starea

3.6 Bistabil T/JK

Bistabilul T se modeleaza similar cu bistabilul D, considerand descrierea functionariiacestuia: daca ın momentul unui front activ al semnalului de ceas intrarea este egalacu 1, atunci bistabilul T ısi complementeaza starea, altfel bistabilul T ısi pastreazastarea.

// clk t | q+// ------------// ^ 1 | ~q// ^ 0 | q // implicitalways @(posedge clk)

if (t) q <= ~q;

Se remarca faptul ca bistabilul T porneste din starea x si are doar posibilitateade a-si complementa starea. Ca o consecinta, modelul anterior va prezenta tot tim-pul q=x. Pentru initializarea bistabilului T este necesara modelarea unei conditii deresetare, sincrona sau asincrona.

// bistabil T cu reset asincron activ low// reset_n clk t | q+// --------------------// 0 x x | 0

Page 99: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

3.7. Numaratoare sincrone 89

// 1 ^ 1 | ~q// 1 ^ 0 | q // implicitalways @(posedge clk or negedge reset_n)

if (~reset_n) q <= 1’b0; elseif (t) q <= ~q;

// bistabil T cu reset sincron activ low// clk reset_n t | q+// --------------------// ^ 0 x | 0// ^ 1 1 | ~q// ^ 1 0 | q // implicitalways @(posedge clk)

if (~reset_n) q <= 1’b0; elseif (t) q <= ~q;

Bistabilul JK are un model dedus din tabelul de functionare a acestuia, lasandimplicit cazul cand iesirea se pastreaza.

// bistabil JK cu reset asincron activ low// reset_n clk j k | q+// -----------------------// 0 x x x | 0// 1 ^ 0 0 | q // implicit// 1 ^ 0 1 | 0// 1 ^ 1 0 | 1// 1 ^ 1 1 | ~qalways @(posedge clk or negedge reset_n)

if (~reset_n)q <= 1’b0;

elsecase({j,k})2’b01 : q <= 1’b0;2’b10 : q <= 1’b1;2’b11 : q <= ~q;default: ; // nu atribuie nimic, pastreaza valoareaendcase

3.7 Numaratoare sincrone

Numaratoarele sunt circuite foarte des folosite ın circuitele integrate digitale. Modelulunui numarator poate fi descris similar cu cel al unui registru cu particularizarea caintrarea provine dintr-un circuit combinational de incrementare a iesirii.

reg[7:0] count;always @(posedge clk or negedge reset_n)

if (~reset_n)count <= 8’b0; // initializarea asincrona a numaratorului

Page 100: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

90 CAPITOLUL 3. MODELAREA CIRCUITELOR ELEMENTARE

elsecount <= count + 1; // starea viitoare este (starea curenta + 1)

Un numarator cu facilitati de numarare ın sens crescator si ın sens descrescatoreste prezentat ın continuare. In plus, a fost prevazuta o intrare suplimentara devalidare a numararii.

// numarator in sens crescator/descrescator si validare a numararii// reset_n clk en up | count+// ----------------------------// 0 x x x | 0// 1 ^ 0 x | count (pastreaza starea)// 1 ^ 1 1 | count+1 (numara in sens crescator)// 1 ^ 1 0 | count-1 (numara in sens descrescator)reg[7:0] count;always @(posedge clk or negedge reset_n)

if (~reset_n) begincount <= 8’b0; // initializarea asincrona a numaratorului

endelse begin

if (en) beginif (up) begin

count <= count + 1; // starea viitoare este// (starea curenta + 1)

endelse begin

count <= count - 1; // starea viitoare este// (starea curenta - 1)

endend // daca en=0, pastreaza starea

end

De remarcat faptul ca numararea se face ın binar pe numarul de biti pe carea fost declarat semnalul count. Dupa 8’b1111_1111 urmeaza ın sens crescator8’b0000_0000.

Ca exemplu, este prezentat ın continuare modelul unui numarator ın binar ın senscrescator sau descrescator, cu modificare dinamica a valorii de terminare a numararii.Caracteristicile numaratorului sunt:

• Latime parametrizabila;

• Indicator de terminare a numararii pentru comparare cu valoarea impusa;

• Valoare de terminare a numararii implementata ca intrare ın numarator;

• Control al sensului de numarare;

• Reset asincron;

• Semnal de ıncarcare sincrona.

Page 101: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

3.7. Numaratoare sincrone 91

Figura 3.4 Simbolul bloc al numaratorului.

Simbolul bloc al numaratorului este prezentat ın figura 3.4.Descrierea porturilor este prezentata ın tabelul 3.1:Descrierea functionarii numaratorului este realizata prin tabelul 3.2.Cand valoarea numaratorului este egala cu valoarea de la portul count_to, sem-

nalul tercnt (”terminal count”, ın limba engleza) este activat. Semnalul tercntpoate fi conectat la intrarea load printr-un inversor pentru a initializa sincron numa-ratorul la valoarea predefinita de la portul data.

Numaratorul are un numar de biti parametrizabil (width) si 2width stari, de la000...0, pana la 111...1. Numaratorul este activ pe frontul crescator al semnaluluide ceas clk.

Semnalul reset implementeaza aducerea asincrona la zero a numaratorului.Intrarea count_to are width biti. Cand iesirea numaratorului ajunge la count_to,

iesirea tercnt devine 1 pentru o perioada de ceas.Intrarea up_dn controleaza daca numaratorul numara ın sens crescator

(up_dn = 1) sau ın sens descrescator (up_dn = 0), ıncepand cu urmatorul front activde ceas.

Numaratorul este ıncarcat cu valoarea data prin aplicarea valorii logice 0 pe in-trarea load. Operatia de ıncarcare este sincrona cu frontul pozitiv al semnalului deceas.

Intrarea de validare, cen este activa ın 1. Cand cen = 1, numararea este activata.Cand cen = 0, numararea este inhibata, valoarea count ramanand neschimbata.

Modelul Verilog este prezentat ın continuare:

Tnµ´¶³

Vnµ´¶³

module counter(data,count_to,

Page 102: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

92 CAPITOLUL 3. MODELAREA CIRCUITELOR ELEMENTARE

Port Dimensiune Directie Functiedata width intrare data de ıncarcare

count_to width intrare limita numarariiup_dn 1 intrare 1 = numarare ın sens crescator,

0 = numarare ın sens descrescatorload 1 intrare semnal de ıncarcare, activ ın 0cen 1 intrare validare numarare, activ ın 1clk 1 intrare semnal de ceas

reset 1 intrare reset asincron, activ ın 1count width iesire iesirea numaratoruluitercnt 1 iesire indicator de terminare a numararii,

activ ın 1

Tabelul 3.1Descrierea porturilor numaratorului.

reset load cen up_dn Functie0 x x x initializeaza1 0 x x ıncarca1 1 0 x pastreaza starea1 1 1 0 numara ın sens descrescator1 1 1 1 numara ın sens crescator

Tabelul 3.2Descrierea functionarii numaratorului.

up_dn,load,cen,clk,reset,count,tercnt);

parameter width = 8; // valoare implicita a numarului de biti

input[width-1 : 0] data;input[width-1 : 0] count_to;input up_dn;input load;input cen;input clk;input reset;output[width-1 : 0] count;

Page 103: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

3.7. Numaratoare sincrone 93

output tercnt;

reg[width-1 : 0] count;

always @(posedge clk or posedge reset)if (reset) begin

count <= ’b0; // initializare asincronaendelse begin

if (load) begincount <= data; // incarcare sincrona

endelse beginif (cen) begin

if (up_dn) begincount <= count + 1; // numarare in sens crescator

endelse begin

count <= count - 1; // numarare in sens descrescatorend

endend

end

// indicator de terminare numarareassign tercnt = (count == count_to);

endmodule

Figura 3.5 prezinta o aplicatie a numaratorului pentru width=5.

Figura 3.5 Aplicatie a numaratorului pentru width=5.

Formele de unda ale numaratorului sunt prezentate ın figura 3.6.Schema provenita din sinteza codului Verilog ce descrie numaratorul este prezen-

tata ın figura 3.7.

Page 104: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

94 CAPITOLUL 3. MODELAREA CIRCUITELOR ELEMENTARE

Figura 3.6 Formele de unda ale numaratorului.

Figura 3.7 Numarator: structura sintetizata.

3.8 Automate secventiale sincrone

Automatele secventiale sincrone sunt circuite esentiale pentru descrierea partii decontrol a unui sistem digital. In functie de necesitati, automatele se pot proiectade tip Mealy sau Moore. Codarea starilor este foarte importanta pentru frecventamaxima de functionare a automatului proiectat. Pentru frecvente mari, se recomandacodificarea starilor cu un bit pentru fiecare stare (”one-hot”, ın limba engleza). Aceststil de codificare este foarte utilizat deoarece asigura obtinerea unei frecvente de lucrumari chiar daca numarul de bistabile de stare este mai mare decat cel minim. In con-tinuare se prezinta diverse descrieri de automate si modelele Verilog asociate.

Automatele sincrone pot fi modelate ın Verilog folosind specificatia case inclusa ıncorpul unei specificatii always. Informatia de stare va fi stocata ıntr-un registru. Incadrul fiecarei ramuri a specificatiei case va fi descris comportamentul automatuluipentru starea respectiva.

3.8.1 Semi-automat descris cu o singura specificatie

Figura 3.8 prezinta graful de tranzitii al unui semi-automat. Codul Verilog, prezintacodificarea starilor modelata cu parametru. Acest lucru permite ulterior o modificarerapida a codurilor starilor, fara a fi necesara revizuirea ıntregului cod sursa. In cazulunor decizii mai complexe, se pot utiliza specificatii if, operatori conditionali ?: sauchiar specificatii case cu selectia pe baza de intrari. Structura rezultata din sintezaeste prezentata ın figura 3.9.

Vnµ´¶³

module semiAutomat(

Page 105: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

3.8. Automate secventiale sincrone 95

Figura 3.8 Graf de tranzitii al unui semi-automat.

clk_i, // intrare de ceasreset_ni, // intrare de reseta_i, // intrare a semi-automatuluistare_o // starea semi-automatului);

input clk_i;input reset_ni;input a_i;output[1:0] stare_o;

//definirea codurilor starilor automatuluiparameter s0_p = 2’b00;parameter s1_p = 2’b01;parameter s2_p = 2’b10;parameter s3_p = 2’b11;

//registrul de starereg[1:0] stare_o;

//modelarea tranzitiilor

Page 106: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

96 CAPITOLUL 3. MODELAREA CIRCUITELOR ELEMENTARE

always @(posedge clk_i or negedge reset_ni)if (~reset_ni) begin

stare_o <= s0_p; // stare initialaendelse begin

case (stare_o)s0_p: if (a_i) begin

stare_o <= s0_p;endelse beginstare_o <= s1_p;

ends1_p: stare_o <= a_i ? s0_p : s2_p;s2_p: stare_o <= s3_p;s3_p: stare_o <= s0_p;default: stare_o <= s0_p;endcase

end

endmodule

3.8.2 Modelarea iesirilor automatelor

In functie de cum sunt proiectate iesirile, automatele pot fi clasificate ın:

• Mealy: iesirile depind de atat de starea curenta, cat si de intrarile automatului;

• Moore: iesirile depind exclusiv de starea curenta a automatului.

In functie de latenta iesirilor, automatele pot fi clasificate ın:

• Automate imediate: iesirile depind combinational de starea curenta;

• Automate cu ıntarziere: iesirile depind cu o ıntarziere de un ceas fata destarea curenta.

Cele patru moduri de modelare a iesirilor sunt exemplificate ın continuare.

wire mealyImediat1_o;reg mealyImediat2_o;wire mooreImediat_o;reg mealyIntarziere_o;reg mooreIntarziere_o;

assign mealyImediat1_o = ((stare_o == s1_p) & a_i) |((stare_o == s3_p) & ~a_i);

always @(stare_o or a_i)case (stare_o)

Page 107: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

3.8. Automate secventiale sincrone 97

Figura 3.9 Structura sintetizata a semi-automatului.

s0_p: if (a_i) beginmealyImediat2_o <= 1’b1;

endelse beginmealyImediat2_o <= 1’b0;

ends1_p: mealyImediat2_o <= 1’b0;s2_p: mealyImediat2_o <= 1’b0;s3_p: mealyImediat2_o <= ~a_i;default: mealyImediat2_o <= 1’b0;endcase

always @(posedge clk_i or negedge reset_ni)if (~reset_ni) begin

mealyIntarziere_o <= 1’b0;end

Page 108: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

98 CAPITOLUL 3. MODELAREA CIRCUITELOR ELEMENTARE

else beginmealyIntarziere_o <= ((stare_o == s1_p) & a_i) |

((stare_o == s3_p) & ~a_i);end

assign mooreImediat_o = (stare_o == s1_p) |(stare_o == s2_p) |(stare_o == s3_p);

always @(posedge clk_i or negedge reset_ni)if (~reset_ni) begin

mooreIntarziere_o <= 1’b0;endelse begin

mooreIntarziere_o <= (stare_o == s1_p) |(stare_o == s2_p) |(stare_o == s3_p);

end

3.8.3 Modelarea automatelor ca registru de stare si circuitcombinational

O alternativa de modelare a automatelor consta ın modelarea structurilor elementarece compun automatul: registru de stare si circuite logice combinationale. In acestcaz, exista o declaratie explicita a unui registru de stare ınsotit de o specificatie caredetermina schimbarea starii ın momentul frontului activ al semnalului de ceas.

Tnµ´¶³

Vnµ´¶³

module semafor (clk_i,reset_ni,senzor_i,rosu_o,galben_o,verde_o

);

input clk_i;input reset_ni;input senzor_i;output rosu_o;output galben_o;output verde_o;

// codificarea starilorparameter wait_p = 2’b00;

Page 109: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

3.8. Automate secventiale sincrone 99

parameter start_p = 2’b01;parameter run_p = 2’b10;

reg[1:0] stareCurenta;reg[1:0] stareViitoare;reg rosu_o;reg galben_o;reg verde_o;

// registru de starealways @(posedge clk_i or negedge reset_ni)if (~reset_ni) stareCurenta <= wait_p; else

stareCurenta <= stareViitoare;

// circuit combinational pentru stare viitoare si iesirialways @(stareCurenta or senzor_i) begin

case (stareCurenta)wait_p: begin

rosu_o <= 1’b1;galben_o <= 1’b0;verde_o <= 1’b0;if (senzor_i) beginstareViitoare <= start_p;

endelse beginstareViitoare <= wait_p;

endend

start_p: beginrosu_o <= 1’b1;galben_o <= 1’b1;verde_o <= 1’b0;stareViitoare <= run_p;

endrun_p: begin

rosu_o <= 1’b0;galben_o <= 1’b0;verde_o <= 1’b1;if (senzor_i) beginstareViitoare <= run_p;

endelse beginstareViitoare <= wait_p;

endend

default: beginrosu_o <= 1’b1;

Page 110: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

100 CAPITOLUL 3. MODELAREA CIRCUITELOR ELEMENTARE

galben_o <= 1’b0;verde_o <= 1’b0;stareViitoare <= wait_p;

endendcase

endendmodule

3.8.4 Automat cu stari codificate ”one-hot”

O alternativa foarte utilizata este codificarea starilor cu un bit pentru fiecare stare.Ca o consecinta, modelarea se poate face la nivel de bistabil. In acest caz, structurade automat nu mai este asa de evidenta. Modelarea ”one-hot” a semaforului esteprezentata ın continuare. Se observa definirea unui bistabil (cu nume propriu) pentrufiecare stare. Starea initiala este stabilita prin proiectarea valorilor primite de bista-bilele de stare la reset. Bineınteles, totdeauna va exista un singur bistabil cu valoare1. Structura rezultata din sinteza este prezentata ın figura 3.10.

Figura 3.10 Structura rezultata din sinteza pentru automatul modelat ”one-hot”.

Vnµ´¶³

module semaforOneHot (clk_i,reset_ni,senzor_i,rosu_o,galben_o,verde_o

);

input clk_i;input reset_ni;input senzor_i;output rosu_o;output galben_o;output verde_o;

Page 111: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

3.8. Automate secventiale sincrone 101

// declarare bistabile de starereg wait_st; // 1=automat in starea waitreg start_st; // 1=automat in starea startreg run_st; // 1=automat in starea run

// bistabile de starealways @(posedge clk_i or negedge reset_ni)if (~reset_ni) wait_st <= 1’b1; else // stare initiala

wait_st <= (wait_st & ~senzor_i) |(run_st & ~senzor_i);

always @(posedge clk_i or negedge reset_ni)if (~reset_ni) start_st <= 1’b0; else

start_st <= (wait_st & senzor_i);always @(posedge clk_i or negedge reset_ni)if (~reset_ni) run_st <= 1’b0; else // stare initiala

run_st <= start_st |(run_st & senzor_i);

// iesiri imediateassign rosu_o = wait_st | start_st;assign galben_o = start_st;assign verde_o = run_st;

// verificare: doar o singura stare activa la un moment datalways @(posedge clk_i)if ((wait_st + start_st + run_st) != 1’b1) begin

$display("%M %t EROARE: Stare FSM eronata (wait=%b, start=%b, run=%b)",

$time, wait_st, start_st, run_st);$stop;

endendmodule

Page 112: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...
Page 113: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

Capitolul 4

NOTIUNI AVANSATE DEVERILOG

4.1 Task-uri si functii

Task-urile si functiile permit executia unor proceduri ın mai multe locuri ale descrieriihardware. De asemenea, ele permit partajarea unor descrieri de dimensiuni mari ınproceduri mai mici, mai usor de citit si de depanat ın codul sursa. Atat task-urile,cat si functiile pot lucra cu argumente de tip intrare, iesire sau bidirectionale.

Diferentele ıntre task-uri si functii sunt urmatoarele:

• O functie se executa la un singur moment al simularii. Un task poate continespecificatii de control temporal.

• O functie trebuie sa aiba cel putin un parametru de intrare. Un task poate aveazero sau mai multe argumente de orice tip.

• O functie ıntoarce o valoare. Un task nu ıntoarce o valoare.

• O functie este utilizata ca un operand ıntr-o expresie. Un task ıntoarce o valoareıntr-un argument de iesire.

Task-urile si functiile pot fi folosite atat pentru modelarea modulelor sintetizabile,cat si pentru modelarea modulelor folosite ın mediul de testare.

Tnµ´¶³

De exemplu, se pot defini o functie si un task pentru calculul valorii negatea unei marimi ıntregi. Un task ıntoarce rezultatul ıntr-un argument de iesire. Apelulunui task va fi:

negare(valoareInitiala, valoareNegata);

Task-ul va primi parametrul de intrare valoareInitiala va determina valoareanegata si o va atribui parametrului de iesire valoareNegata. O functie care va faceacelasi lucru va ıntoarce direct valoarea negata. Apelul functiei va fi:

103

Page 114: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

104 CAPITOLUL 4. NOTIUNI AVANSATE DE VERILOG

valoareNegata = negare(valoareInitiala);

Snµ´¶³

Sintaxa definirii unui task este urmatoarea:

<task> ::= task <nume_task>;<declaratii_task><specificatii>endtask

<declaratii_task> ::= <declaratii_parametrii>||= <declaratii_intrari>||= <declaratii_iesiri>||= <declaratii_bidirectionale>||= <declaratii_reg>||= <declaratii_timp>||= <declaratii_intregi>||= <declaratii_reali>||= <declaratii_evenimente>

Ca exemplu, sunt prezentate task-urile ce modeleaza citirea si scrierea unui set deregistre printr-o interfata de catre un procesor. Aceste task-uri nu sunt sintetizabi-le. Ele modeleaza comportamentul unui procesor care furnizeaza stimuli circuituluiproiectat pentru sintetizabilitate.

task write;// parametrii formali ai task-uluiinput[15:0] addr;input[15:0] data;begin

// pregatire valori pentru semnalele de controlmpuCs_no <= 1’b0;mpuTs_no <= 1’b0;mpuRdWr_no <= 1’b0;mpuAddr_o <= addr;mpuData_o <= data;@(posedge mpuClk_i);mpuTs_no <= 1’b1;// interogare indicator de validare a scrieriiwhile (mpuRdy_ni)

@(posedge mpuClk_i);// scrierea a fost efectuata, inactivare comandampuCs_no <= 1’b1;mpuRdWr_no <= 1’b1;// mesaj pentru depanare$display("%M %t NOTA: Scriere de catre CPU (addr=%hH, data=%hH).",

$time, addr, data);@(posedge mpuClk_i);

end

Page 115: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

4.1. Task-uri si functii 105

endtask

task read;input[15:0] addr;begin

// pregatire valori pentru semnalele de controlmpuCs_no <= 1’b0;mpuTs_no <= 1’b0;mpuRdWr_no <= 1’b1;mpuAddr_o <= addr;mpuData_o <= 16’b0;@(posedge mpuClk_i);mpuTs_no <= 1’b1;// interogare indicator de validare a citiriiwhile (mpuRdy_ni)

@(posedge mpuClk_i);// citirea a fost efectuata, inactivare comandampuCs_no <= 1’b1;mpuTs_no <= 1’b1;@(posedge mpuClk_i);// mesaj pentru depanare (data citita)$display("%M %t NOTA: Citire de catre CPU (addr=%hH, data=%hH).",

$time, addr, mpuData_i);$stop;

endendtask

Apelarea task-urilor se face din interiorul unei specificatii initial:

initialbegin

// write(adresa, data);write(16’h0, 16’h0039);// read (adresa);read (16’h0);write(‘sdram_mode_addr, 16’h0060); // adresa definita cu ‘define

// interogheaza un indicator pana cand este gasit 0read(‘rdaddr_addrL);while (mpuData_i[15])

read(‘rdaddr_addrL);...

end

Tnµ´¶³

Formele de unda rezultate ın urma simularii modulului MPU descris cutask-uri sunt prezentate ın figura 4.1.

Snµ´¶³

Sintaxa definirii unei functii este urmatoarea:

Page 116: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

106 CAPITOLUL 4. NOTIUNI AVANSATE DE VERILOG

Figura 4.1 Forme de unda rezultate ın urma simularii modulului MPU descris cu task-uri.

<function> ::= function <domeniu_sau_tip>? <nume_functie> ;<declaratii_functie>+<specificatii>endfunction

<domeniu_sau_tip> ::= <domeniu>||= integer||= real

<declaratii_functie> ::= <declaratii_parametrii>||= <declaratii_intrari>||= <declaratii_iesiri>||= <declaratii_bidirectionale>||= <declaratii_reg>||= <declaratii_timp>||= <declaratii_intregi>||= <declaratii_reali>||= <declaratii_evenimente>

Precizarea domeniului (dimensiunii ın biti a valorii ıntoarse) este optionala. Im-plicit, functiile ıntorc un bit.

Definirea functiei contine o declaratie implicita a unei variabile de tip reg, internafunctiei, avand numele functiei. Dimensiunea acestei variabile este specificata ca<domeniu> al functiei. In definitia functiei trebuie sa existe o atribuire de valoare catreaceasta variabila. La iesirea din functie, valoarea variabilei avand numele functiei seconsidera ca fiind valoarea la care s-a evaluat functia.

Exemplul urmator prezinta definirea si utilizarea unei functii de calcul a valoriiabsolute a unui vector ce reprezinta un numar ıntreg cu semn.

// definirea functiei modulofunction [7:0] modulo;// parametrii formali ai functieiinput[7:0] formalInitial;beginif (~formalInitial[7])

// MSB=0 => numar pozitivmodulo = formalInitial;

Page 117: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

4.2. Modelarea memoriilor 107

else// MSB=1 => numar negativmodulo = ~formalInitial + 1; // complement fata de 2

endendfunction

// declararea unei sarmewire[7:0] valoareModulo;

// apelul functiei moduloassign valoareModulo = modulo(valoareIntrare);

Vnµ´¶³

Structura rezultata ın urma sintezei unui modul al carui comportamenteste descris cu functia modulo este prezentata ın figura 4.2.

Figura 4.2 Structura rezultata ın urma sintezei unui modul a carui comportament estedescris cu functia modulo.

4.2 Modelarea memoriilor

In marea majoritate a cazurilor, sistemele digitale integrate actuale includ o memoriesau au acces la o memorie externa.

Memoriile integrate pe chip se genereaza, de obicei, cu programe specializate subforma unei descrieri fizice si a uneia comportamentale. Modelul comportamental esteutilizat de catre proiectantul RTL pentru a simula ıntreg chip-ul. Modelul fizic seutilizeaza ın etapa de realizare fizica a chip-ului.

In cazul folosirii unor chip-uri externe de memorie este necesara o simulare globalaa chip-ului proiectat interconectat la memorie. Din acest motiv este necesar un modelcomportamental al memoriei. De obicei producatorii de chip-uri de memorie ofera(gratuit sau contra cost) modelele comportamentale ale memoriilor produse.

Se poate concluziona ca multi ingineri au ocazia sa scrie (sau macar sa ınteleaga sisa modifice) modele de memorie, fie ca angajat al firmelor producatoare de memorii,fie ca proiectanti utilizatori de chip-uri de memorie sau memorii integrate.

In continuare este prezentat modelul unei memorii RAM sincrone dual-port. Me-moria este parametrizata ca latime si ca adancime.

Page 118: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

108 CAPITOLUL 4. NOTIUNI AVANSATE DE VERILOG

S-au prevazut doua optiuni de initializare: toata memoria ınscrisa cu 0 sau memo-ria ınscrisa cu datele existente ıntr-un fisier extern. In acest ultim caz, datele suntcitite din fisier ın variabila de memorie cu functia sistem $readmemh, prezentata ınsectiunea 4.6.

Vnµ´¶³

module dpMem (clk_i, // semnal de ceas// port de scrierewrAddr_i, // adresa de scrierewe_ni, // validare scriere (write enable), activ lowdata_i, // date de intrare// port de citirerdAddr_i, // adresa de citirere_ni, // validare citire (read enable), activ lowdata_o // date de iesire

);

parameter width_p = 32; // latime dateparameter addrBits_p= 10; // numar de biti de adresaparameter memInit_p = 1’b1; // 1=memorie initializata,

// 0=memorie neinitializataparameter memZero_p = 1’b1; // 1=memorie initializata cu 0,

// 0=memorie initializata cu// date din fisier// nume fisier cu date de initializareparameter fileName_p = "dpMem1kx32.dat";

input clk_i;

// port de scriereinput[addrBits_p-1:0] wrAddr_i;input we_ni;input[width_p-1:0] data_i;// port de citireinput[addrBits_p-1:0] rdAddr_i;input re_ni;output[width_p-1:0] data_o;reg[width_p-1:0] data_o;

// matrice de memorie ((2^addrBits_p) x width_p)reg[width_p-1:0] mem[(1<<addrBits_p)-1:0];

// initializare memorieinteger i; // index pentru specificatia forinitial begin

if (memInit_p) begin

Page 119: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

4.3. Generarea structurilor hardware 109

// matricea de memorie este initializataif (memZero_p) begin

// matricea de memorie este initializata cu 0for (i=0;i<(1<<addrBits_p);i=i+1)

mem[i] = ’b0;endelse begin// matricea de memorie este initializata cu date din fisier$readmemh(fileName_p, mem);

endend

end

// scriere memoriealways @(posedge clk_i)if (~we_ni) mem[wrAddr_i] <= data_i;

// citire memoriealways @(posedge clk_i)

data_o <= (~re_ni) ? mem[rdAddr_i] : ’bz;

endmodule

Tnµ´¶³

Modele comportamentale pentru memorii SDRAM/DDR pot fi gasite pesitul firmei Micron Technology (http://www.micron.com) sau pe pagina web a cartii.Aceste modele nu sunt sintetizabile.

4.3 Generarea structurilor hardware

Versiunea 2001 a standardului Verilog introduce o facilitate de a genera instantemultiple de module si primitive. Modulele generate pot fi create conditional sauparticularizate prin specificatii de decizie (if) sau de selectie (case). Patru noi cuvintecheie au fost adaugate limbajului Verilog cu aceasta ocazie:

• generate: cuvant cheie de ınceput a specificatiei;

• endgenerate: cuvant cheie de sfarsit a specificatiei;

• genvar: declaratie de index (valoare pozitiva) a specificatiei generate;

• localparam: constanta locala.

Pentru exemplificarea utilizarii specificatiei generate se prezinta modelul unuimodul de memorie realizat din 4 chip-uri de memorie de 512Mb (32M x 16) folositpentru stocarea datelor si un chip de memorie de 256Mb (32M x 8) folosit pentrustocarea sumelor de control. Memoria rezultata are dimensiunea 2Gb (32M x 64).Fiecare locatie de 64 de biti are asociati 8 biti (cate 1 bit pentru fiecare byte) pentruo suma de control.

Page 120: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

110 CAPITOLUL 4. NOTIUNI AVANSATE DE VERILOG

Pentru memorii se utilizeaza modelele firmei Micron. Modelul modulului de mem-orie este prezentat ın continuare:

Vnµ´¶³

// modul SDRAM 2Gb (32Mx64)module sdramModule (

sdrCk_i, // semnal de ceassdrCke_i, // validare ceas (clock enable)sdrDq_io, // datesdrEcc_io, // date de control (Error Correction Code)sdrAddr_i, // adresasdrBank_i, // bancasdrCs_i, // selectie chip (chip select)sdrRas_i, // rassdrCas_i, // cassdrWe_i, // validare scriere (write enable)sdrDm_i // masca de date

);

inout[63:0] sdrDq_io;inout[7:0] sdrEcc_io;input[12:0] sdrAddr_i;input[1:0] sdrBank_i;input sdrCk_i;input sdrCke_i;input sdrCs_i;input sdrRas_i;input sdrCas_i;input sdrWe_i;input[8:0] sdrDm_i;

genvar i; // variabila folosita ca index de specificatia generategenerate

// 4 instante SDRAM 512Mb (32M x 16) pentru memoria de datefor (i=0;i<4;i=i+1) begin: Usdram

// activeaza mesajele doar de la un chip de memoriedefparam UsdramDate.Debug = (i==0 ? 1 : 0);mt48lc32m16a2 UsdramDate(.Dq (sdrDq_io[16*i+15:16*i] ),.Addr (sdrAddr_i ),.Ba (sdrBank_i ),.Clk (sdrCk_i ),.Cke (sdrCke_i ),.Cs_n (sdrCs_i ),.Ras_n (sdrRas_i ),.Cas_n (sdrCas_i ),

Page 121: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

4.3. Generarea structurilor hardware 111

.We_n (sdrWe_i ),

.Dqm (sdrDm_i[2*i+1:2*i] ));end

// o instanta SDRAM 256Mb (32M x 8)// pentru memoria de sume de controldefparam UsdramEcc.Debug = 0;mt48lc32m8a2 UsdramEcc(

.Dq (sdrEcc_io ),

.Addr (sdrAddr_i ),

.Ba (sdrBank_i ),

.Clk (sdrCk_i ),

.Cke (sdrCke_i ),

.Cs_n (sdrCs_i ),

.Ras_n (sdrRas_i ),

.Cas_n (sdrCas_i ),

.We_n (sdrWe_i ),

.Dqm (sdrDm_i[8] ));

endgenerate

endmodule

Reprezentarea grafica a ierarhiei modulului sdramModule este prezentata ın figura4.3.

Figura 4.3 Reprezentarea grafica a ierarhiei modulului de memorie SDRAM.

Specificatia generate poate genera si structuri sintetizabile, asa cum este cazulexemplului unui sumator de 32 de biti format din 4 sumatoare de cate 8 biti. Structurarezultata din sinteza este prezentata ın figura 4.4.

Vnµ´¶³

module addGen (

Page 122: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

112 CAPITOLUL 4. NOTIUNI AVANSATE DE VERILOG

Figura 4.4 Structura rezultata din sinteza sumatorului de 32 de biti descris cu specificatiede generare.

a_i, // primul operandb_i, // al doilea operandci_i, // transport de intrares_o, // rezultatulco_o // transport de iesire

);

input[31:0] a_i;input[31:0] b_i;input ci_i;output[31:0] s_o;output co_o;

// declara bitii de transportwire[4:0] carry;// bitul zero reprezinta transportul de intrare la LSB (=0)assign carry[0] = 1’b0;// bitul MSB este transportul final al sumatoruluiassign co_o = carry[4];

genvar i; // variabila folosita ca index de specificatia generategenerate

// 4 instante addxCfor (i=0;i<4;i=i+1) begin: Uadder

defparam Uadd.width = 8;addxC Uadd(.a_i (a_i[8*i+7:8*i] ),.b_i (b_i[8*i+7:8*i] ),.ci_i (carry[i] ),.s_o (s_o[8*i+7:8*i] ),.co_o (carry[i+1] )

);end

endgenerate

Page 123: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

4.4. Modelarea la nivel de poarta logica 113

endmodule

4.4 Modelarea la nivel de poarta logica

Verilog este un limbaj ce contine descrierea urmatoarelor modele ce corespund portilorlogice:

• Porti cu intrari multiple (and, nand, or, nor, xor, xnor);

• Porti cu iesiri multiple (buf, not);

• Porti cu iesiri ın trei stari (bufif0, bufif1, notif0, notif1);

• Porti cu iesiri fixe (pullup, pulldown).

4.4.1 Porti cu intrari multiple

Portile cu intrari multiple modeleaza porti logice avand o singura iesire si un numarneprecizat de intrari. Functia logica implementata corespunde cuvintelor rezervate:and, nand, or, nor, xor, xnor.

Snµ´¶³

Sintaxa instantierii portilor cu intrari multiple este urmatoarea:

<tip_poarta> [nume_instanta] (iesire, intrare1, intrare2, ...);

Primul terminal este iesirea, restul terminalelor, oricate la numar, sunt asociateintrarilor.

Tabelele de adevar asociate acestor porti sunt prezentate ın tabelul 4.1:

4.4.2 Porti cu iesiri multiple

Portile cu iesiri multiple modeleaza porti logice avand o singura intrare si un numarneprecizat de iesiri. Functia logica implementata corespunde cuvintelor rezervate:buf si not. Aceste porti sunt folosite pentru stabilirea explicita a fan-out-ului uneiporti logice fizice.

Snµ´¶³

Sintaxa instantierii portilor cu iesiri multiple este urmatoarea:

buf [nume_instanta] (intrare, iesire1, iesire2, ...);not [nume_instanta] (intrare, iesire1, iesire2, ...);

Primul terminal este intrarea, restul terminalelor, oricate la numar, sunt asociateiesirilor.

Tabelele de adevar asociate acestor porti sunt prezentate ın tabelul 4.2.

Page 124: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

114 CAPITOLUL 4. NOTIUNI AVANSATE DE VERILOG

and 0 1 x z nand 0 1 x z0 1 1 1 1 0 0 0 0 01 1 0 x x 1 0 1 x xx 1 x x x x 0 x x xz 1 x x x z 0 x x x

or 0 1 x z nor 0 1 x z0 0 1 x x 0 1 0 x x1 1 1 1 1 1 0 0 0 0x x 1 x x x x 0 x xz x 1 x x z x 0 x x

xor 0 1 x z xnor 0 1 x z0 0 1 x x 0 1 0 x x1 1 0 x x 1 0 1 x xx x x x x x x x x xz x x x x z x x x x

Tabelul 4.1Tabelul de adevar ale portilor logice cu intrari multiple.

buf 0 1 x z not 0 1 x ziesire 0 1 x x iesire 1 0 x x

Tabelul 4.2Tabelul de adevar ale portilor logice cu iesiri multiple.

4.4.3 Porti cu iesiri ın trei stari

Portile cu iesiri ın trei stari modeleaza porti logice avand o intrare de validare caredetermina trecerea iesirii ın stare de ınalta impedanta. Functia logica implementatacorespunde cuvintelor rezervate: bufif0, bufif1, notif0, notif1.

Snµ´¶³

Sintaxa instantierii portilor cu iesiri ın trei stari este urmatoarea:

<tip_poarta> [nume_instanta] (iesire, intrare, control);

Tabelele de adevar asociate acestor porti sunt prezentate ın tabelul 4.3. Valo-rile alternative 0/z si 1/z semnifica cele doua valori ale iesirii, ın functie de tariasemnalelor de date si de control.

4.4.4 Porti cu iesiri fixe

Portile cu iesiri fixe modeleaza porti logice fara intrare, avand o singura iesire. Potfi interpretate ca ”generatoare de 0 sau de 1 logic”. Conectarea unei asemenea portila o sarma determina mentinerea starii logice a acelei sarme, ın absenta altei surse

Page 125: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

4.5. Modelarea la nivel de tranzistor 115

bufif0 Control bufif1 Control0 1 x z 0 1 x z

0 0 z 0/z 0/z 0 z 0 0/z 0/zData 1 1 z 1/z 1/z Data 1 z 1 1/z 1/z

x x z x x x z x x xz x z x x z z x x x

notif0 Control notif1 Control0 1 x z 0 1 x z

0 1 z 1/z 1/z 0 z 1 1/z 1/zData 1 0 z 0/z 0/z Data 1 z 0 0/z 0/z

x z z x x x z x x xz z z x x z z x x x

Tabelul 4.3Tabelul de adevar ale portilor cu iesiri ın trei stari.

de semnal. De obicei, se folosesc asemenea porti conectate ın interiorul modulului peintrarile care pot fi lasate neconectate la instantierea modulului respectiv. Existentaunei porti cu iesire fixa pe intrare nu va permite propagarea starii x ın interiorulmodulului. Exista doua tipuri de asemenea porti: pullup (”trage semnalul la valoareasursei de alimentare”, echivalenta starii logice 1) si pulldown (”trage semnalul lamasa”, echivalenta starii logice 0). De remarcat ca aceste ”trageri” sunt ”slabe”.Existenta unei alte surse de semnal, va anula efectul portii cu iesire fixa.

Snµ´¶³

Sintaxa instantierii portilor cu iesiri fixe este urmatoarea:

pullup [nume_instanta] (iesire);pulldown [nume_instanta] (iesire);

4.5 Modelarea la nivel de tranzistor

Verilog este un limbaj ce contine descrierea urmatoarelor modele ce corespund tranzis-toarelor MOS (unidirectionale): nmos, pmos, cmos, rnmos, rpmos, rcmos.

Snµ´¶³

Sintaxa instantierii tranzistoarelor MOS este urmatoarea:

pmos [nume_instanta] (iesire, intrare, control);nmos [nume_instanta] (iesire, intrare, control);cmos [nume_instanta] (iesire, intrare, controlN, controlP);rpmos [nume_instanta] (iesire, intrare, control);rnmos [nume_instanta] (iesire, intrare, control);rcmos [nume_instanta] (iesire, intrare, controlN, controlP);

De remarcat ca desi tranzistoarele MOS reale sunt simetrice, modelele Verilog suntunidirectionale, avand pentru date intrare si iesire.

Page 126: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

116 CAPITOLUL 4. NOTIUNI AVANSATE DE VERILOG

Dispozitivele ale caror nume ıncep cu litera r modeleaza dispozitive ”rezistive”. Incazul trecerii unui semnal prin aceste dispozitive, ”taria” semnalului se diminueaza.

Tabelul 4.4 descrie functionarea modelelor de tranzistoare MOS.

pmos Control nmos Controlrpmos 0 1 x z rnmos 0 1 x z

0 0 z 0/z 0/z 0 z 0 0/z 0/zData 1 1 z 1/z 1/z Data 1 z 1 1/z 1/z

x x z x x x z x x xz z z z z z z z z z

Tabelul 4.4Tabelul de adevar ale tranzistoarelor MOS.

In plus, sunt descrise ın limbaj si urmatoarele porti de transmisiune bidirectionale:tran, tranif0, tranif1, rtran, rtranif0, rtranif1.

Snµ´¶³

Sintaxa instantierii portilor de transmisiune MOS este urmatoarea:

tran [nume_instanta] (portA, portB);rtran [nume_instanta] (portA, portB);tranif0 [nume_instanta] (portA, portB, control);tranif1 [nume_instanta] (portA, portB, control);rtranif0 [nume_instanta] (portA, portB, control);rtranif1 [nume_instanta] (portA, portB, control);

Modelarea la nivel de tranzistor este utilizata de producatorii de tehnologii elec-tronice sau de inginerii care simuleaza functionarea circuitului integrat pe baza struc-turii fizice, pentru a valida un netlist ınainte de fabricatie.

Ca exemplificare, se prezinta cazul modelarii a doua multiplexoare 2:1 descrise lanivel de tranzistor MOS. Ca metodologie de lucru, schema s-a desenat cu un editorgrafic capabil sa genereze automat modelul Verilog. Schema este prezentata ın figura4.5.

Fisierele generate automat sunt prezentate ın continuare:

Tnµ´¶³

Vnµ´¶³

• inv.v

/* Verilog model created from schematic inv.sch --Feb 17, 2005 23:21 */

module inv( IN, OUT );input IN;output OUT;wire VDD = 1’b1;

Page 127: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

4.5. Modelarea la nivel de tranzistor 117

Figura 4.5 Schema a doua multiplexoare 2:1 la nivel de tranzistor.

wire GND = 1’b0;

nmos N ( OUT, GND, IN );pmos P ( OUT, VDD, IN );

endmodule // inv

• nand3.v

/* Verilog model created from schematic nand3.sch --Feb 17, 2005 23:21 */

module nand3( IN1, IN2, IN3, OUT );input IN1, IN2, IN3;output OUT;wire VDD = 1’b1;wire GND = 1’b0;wire N_1;wire N_2;

nmos N1 ( OUT, N_1, IN1 );nmos N2 ( N_1, N_2, IN2 );nmos N3 ( N_2, GND, IN3 );pmos P3 ( OUT, VDD, IN3 );pmos P2 ( OUT, VDD, IN2 );pmos P1 ( OUT, VDD, IN1 );

Page 128: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

118 CAPITOLUL 4. NOTIUNI AVANSATE DE VERILOG

endmodule // nand3

• xfer.v

/* Verilog model created from schematic xfer.sch --Feb 17, 2005 23:21 */

module xfer( D, GN, GP, S );output D;input GN, GP, S;

pmos P ( D, S, GP );nmos N ( D, S, GN );

endmodule // xfer

• muxtranzlev.v

/* Verilog model created from schematic muxtranzlev.sch --Feb 17, 2005 23:21 */

module muxtranzlev( I0A, I0B, I1A, I1B, SEL, SEL_C, YA, YB );input I0A, I0B, I1A, I1B;input [2:0] SEL;output SEL_C, YA, YB;wire N_116;wire N_117;wire N_115;wire N_94;wire N_95;

nand3 I108 ( .IN1(SEL[2]),.IN2(SEL[1]),.IN3(SEL[0]),.OUT(N_115));xfer I118 ( .D(N_95), .GN(SEL_C), .GP(N_115), .S(I1B) );xfer I119 ( .D(N_94), .GN(SEL_C), .GP(N_115), .S(I1A) );xfer I73 ( .D(N_94), .GN(N_115), .GP(SEL_C), .S(I0A) );xfer I74 ( .D(N_95), .GN(N_115), .GP(SEL_C), .S(I0B) );inv I82 ( .IN(N_116), .OUT(YB) );inv I79 ( .IN(N_117), .OUT(YA) );inv I78 ( .IN(N_95), .OUT(N_116) );inv I77 ( .IN(N_94), .OUT(N_117) );inv I109 ( .IN(N_115), .OUT(SEL_C) );

endmodule // muxtranzlev

4.6 Task-uri si functii de sistem

Verilog contine cateva task-uri si functii predefinite ın limbaj. Nu toate acestea suntfoarte folosite. In aceasta sectiune sunt prezentate doar cele folosite mai des ın testarea

Page 129: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

4.6. Task-uri si functii de sistem 119

sistemelor descrise ın Verilog. Task-urile si functiile sistem nu sunt sintetizabile ciofera doar suport pentru testare.

• Task-uri de afisare: $display, $write, $strobe, $monitor;

• Task-uri de accesare a fisierelor: $fopen, $fdisplay, $readmemb, $readmemh;

• Task-uri pentru controlul simularii: $stop, $finish;

• Task-uri pentru verificari temporale: $setup, $hold, $setuphold, $width,$period, $skew, $recovery;

• Functii referitoare la timpul simularii: $time;

• Functii pentru generarea numerelor aleatorii: $random.

4.6.1 Task-uri de afisare

Task-urile de sistem pentru afisare sunt utilizate pentru afisarea mesajelor ın fereastrade mesaje a simulatorului.

• $display: afiseaza un mesaj formatat ın momentul executiei specificatiei.

• $strobe: task similar cu $display dar cu executie amanata pana la sfarsitul ci-clului curent de simulare. Afiseaza valorile actualizate ale semnalelor cu atribuiriblocante.

• $write: task similar cu $display dar fara a trece la linie noua la sfarsitulmesajului. Posibil de folosit pentru compunerea secventiala a mesajelor ce voraparea pe un singur rand.

• $monitor: afiseaza un mesaj formatat la fiecare modificare a valorii unui semnal.Acest task este apelat o singura data si are efect pe tot parcursul simularii. Task-ul poate fi activat si dezactivat explicit prin apelul task-urilor $monitoroff si$monitoron.

Exemplu:

always @(posedge clock)// afiseaza un mesaj la fiecare front de ceas$display(%m %t: a=%b b=%b, $time, a, b);

initial// afiseaza un mesaj la fiecare modificare a semnalelor a sau b$monitor(%m %t: a=%b b=%bb, $time, a, b);

Modul de reprezentare a marimilor afisate de catre task-urile de afisare poate ficontrolat prin optiuni:

• %b - valoare exprimata ın baza 2

• %o - valoare exprimata ın baza 8

Page 130: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

120 CAPITOLUL 4. NOTIUNI AVANSATE DE VERILOG

• %d - valoare exprimata ın baza 10

• %h - valoare exprimata ın baza 16

• %e - valoare exprimata ca real ın format exponential

• %f - valoare exprimata ca real ın format zecimal

• %g - valoare exprimata ca real ın formatul cel mai scurt

• %c - caracter ASCII

• %s - sir de caractere

• %m - numele modulului ce a generat mesajul si a ierarhiei acestuia ın cadrulproiectului

• %t - timpul curent de simulare

• \n - caracter special ”rand nou”

• \t - caracter special tab

• \\ - caracter special \

• \" - caracter special "

• %% - caracter special %

4.6.2 Task-uri de accesare a fisierelor

De foarte multe ori, pentru verificarea proiectelor este necesara preluarea unor datedin fisiere: initializarea memoriilor, controlarea setului de stimuli generati.

• $fopen deschide un fisier pentru scriere. Functia ıntoarce un pointer la fisier(32 de biti).

• $fmonitor, $fdisplay, $fstrobe si $fwrite scriu mesajele ın fisier similartask-urilor $monitor, $display, $strobe, $write.

• $fclose ınchide un fisier si elibereaza pointerul la fisier.

• $readmemb, $readmemh se folosesc pentru citirea datelor dintr-un fisier ıntr-ovariabila de memorie de tip matrice bidimensionala. Datele sunt exprimate ınbinar daca citirea se face cu $readmemb sau ın hexazecimal daca citirea se facecu $readmemh.

Exemplul 1:

// parametrii de configurare a generatorului de stimuliparameter param1_p = 1;parameter param2_p = 2;parameter param3_p = 3;

Page 131: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

4.6. Task-uri si functii de sistem 121

parameter cmdFile_p = "cmdFile.mem"; // fisier de comenzi, deschis// pentru citire

parameter logFile_p = "log.out"; // fisier de mesaje, descris// pentru scriere

reg[23:0] cmdMem[99:0]; // memorie de stocare a comenziilor

integer logPtr; // pointer la fisier de mesaje

initial beginlogPtr = $fopen(logFile_p); // deschide fisier pentru scriere$readmemb(cmdFile_p, cmdMem); // initializeaza matricea cmdMem cu

// continutul fisierului cu numele// transmis prin parametrul cmdFile_p

// scrie in fisierul de mesaje valorile parametrilor cu care a fost// instantiat modulul$fdisplay(logPtr, "%M NOTE: parametrul 1 = %0d", param1_p);$fdisplay(logPtr, "%M NOTE: parametrul 2 = %0d", param2_p);$fdisplay(logPtr, "%M NOTE: parametrul 3 = %0d", param3_p);

end

Exemplul 2:

parameter initOn_p = 1’b1; // 0 = memorie neinitializata,// 1 = memorie initializata

parameter initFile_p = 1’b1; // 0 = initializare (date=adresa)// 1 = initializare din fisier

parameter fileName_p = "mem1kx32.mem";// fisier cu date de initializare// 1024 de linii a cate 8 cifre hexa

reg[31:0] mem[(1<<10)-1:0];// memorie (1K X 32)integer i; // variabila index pentru specificatia for

// initializarea memorieiinitial begin

if (initOn_p) begin // memorie initializataif(initFile_p) begin // memorie initializata din fisier$readmemh(fileName_p, mem);

endelse begin // memorie initializata (data=adresa)for (i=0;i<1024;i=i+1)

mem[i] = i;end

endend

Page 132: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

122 CAPITOLUL 4. NOTIUNI AVANSATE DE VERILOG

4.6.3 Task-uri pentru controlul simularii

• $stop: determina suspendarea simularii. Ulterior se pot lansa comenzi ın modinteractiv cu scop de depanare sau repornirea simularii din punctul ın care afost suspendata. Apelarea acestui task se face la momentele de timp la carese doreste oprirea temporara a simularii pentru verificarea unor semnale sauconditii.

• $finish: determina terminarea simularii si a programului de simulare, cuıntoarcerea controlului sistemului de operare. Apelarea acestui task se face larularea simularii fara interfata grafica, eventual cu apeluri succesive ale simulariicu parametri diferiti.

4.6.4 Task-uri pentru verificari temporale

Task-urile de sistem pentru verificari temporale pot fi apelate ın cadrul unui test-bench(modul generator de vectori de test) sau ın cadrul unui bloc specify din interiorulunui modul.

• $setup (eveniment_date, eveniment_ref, limita); Violarea timpului desetup este raportata daca timpul scurs de la eveniment_date pana laeveniment_ref este mai scurt decat limita.

Exemplu: $setup (data, posedge clk, 5);

• $hold (eveniment_ref, eveniment_date, limita); Violarea timpului dehold este raportata daca timpul scurs de la eveniment_ref pana laeveniment_date este mai scurt decat limita.

Exemplu: $hold (posedge clk, data, 2);

• $setuphold (eveniment_date, eveniment_ref, limita_s, limita_h);Efectul acestui task reprezinta o ınsumare a efectelor $setup si $hold.

Exemplu: $setuphold (data, posedge clk, 5, 2);

• $period (eveniment_ref, limita); Violarea perioadei este raportata dacatimpul scurs ıntre doua evenimente succesive este mai scurt decat limita.

Exemplu: $period (posedge clk, 16);

• $width (eveniment_ref, limita); Violarea de latime este raportata dacatimpul scurs ıntre un eveniment si urmatorul eveniment complementar este maiscurt decat limita.

Exemplu: $width (posedge clk, 8);

• $skew (eveniment_1, eveniment_2, limita); Violarea de skew este rapor-tata daca timpul scurs ıntre eveniment_1 si eveniment_2 este mai lung decatlimita.

Exemplu: $skew (posedge clk1, posedge clk2, 3);

Page 133: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

4.6. Task-uri si functii de sistem 123

• $recovery (eveniment_ref, eveniment_date, limit); Violarea este rapor-tata daca timpul scurs ıntre eveniment_ref si eveniment_date este mai lungdecat limita.

Exemplu: $recovery (posedge set, data, 5);

4.6.5 Functii referitoare la timpul simularii

Functia de sistem $time ıntoarce valoarea timpului de simulare reprezentata ca unıntreg de 64 de biti scalata cu valoarea absoluta a unitatii de timp asociata modululuiın care a fost apelata functia. Functia $time poate fi apelata ca parametru din task-uri de afisare cu optiunea %t. Forma de afisare a timpului poate fi modificata prinapelul task-ului de sistem $timeformat.

Exemplu:

// verificarea parametrilor transmisi la instantiereinitial begin

$display("%M %t EROARE: Valoare interzisa pentru parametrul 1 (%0d).",$time, param1_p);

$stop;

end

// verificarea protocolului cerere-confirmarealways @(posedge clk)if (ack && !rq) begin

$display("%M %t EROARE: Confirmare fara cerere.", $time);$stop;

end

Mesajele produse ın fereastra de mesaje sunt:

# readMemSim 0 EROARE: Valoare interzisa pentru parametrul 1 (10).# readMemSim 135 EROARE: Confirmare fara cerere.

4.6.6 Functii pentru generarea numerelor aleatorii

Functia $random ıntoarce un numar aleatoriu ıntreg reprezentat pe 32 de biti. Speci-ficarea valorii initiale (”seed”, ın limba engleza) este optionala. Apelarea functiei$random avand ca parametru aceeasi valoare initiala va ıntoarce aceeasi valoare lafiecare simulare.

Pentru a restrange domeniul numerelor aleatorii se poate folosi operatorul modulo(%).

Exemple:

integer a;a = $random % 10; // intoarce un numar intre -9 si 9

integer b;

Page 134: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

124 CAPITOLUL 4. NOTIUNI AVANSATE DE VERILOG

b = {$random} % 10; // intoarce un numar intre 0 si 9// operatorul de concatenare interpreteaza// valoarea intoarsa de $random ca fiind// pozitiva, fara semn

reg[7:0] c;c = $random; // doar cei 8 LSB intorsi de $random se

// atribuie lui c (poate fi interpretat ca// un numar pozitiv cu valori intre 0 si 255)

reg[63:0] d;d = {$random, $random}; // numar aleatoriu pe 64 de biti

parameter seed = 1; // valoare de initializare a generatorului de// numere aleatorii

initialsemnal = $random(seed); // atribuie semnalului o valoare aleatorie,

// pe baza parametrului seed

4.7 Primitive definite de utilizator

Modelarea unei biblioteci de tehnologie presupune proiectarea unui model compor-tamental al fiecarei componente primitive. Complexitatea sistemelor actuale, cumilioane de porti logice, determina necesitatea unei mari puteri de calcul ın cazulsimularii la nivel de poarta logica, dupa sinteza, sau ın final, dupa plasare si rutare.Din acest motiv, este binevenita posibilitatea de a proiecta modele mai rapide pentrucomponente ce au o functie relativ simpla si apar instantiate de foarte multe ori. Estecazul primitivelor din bibliotecile de tehnologie.

Primitivele definite de catre utilizator furnizeaza suportul pentru largirea setuluide componente elementare folosite ın descrierea structurala a unui proiect. Trebuieremarcat faptul ca ın simulare modelul unei primitive se executa mult mai rapid decatmodelul RTL echivalent. Instantierea primitivelor definite de catre utilizator poate fifacuta similar cu instantierea oricarui modul.

Exista doua tipuri de primitive definite de catre utilizator:

• primitive combinationale;

• primitive secventiale.

O primitiva definita de catre utilizator are o singura iesire si una sau mai multeintrari. Iesirea poate primi valorile 0, 1 sau x (valoarea z nu este admisa).

Primitivele definite de catre utilizator sunt independente de module si pot e-xista exclusiv ın afara acestora. Sintaxa definirii unei primitive este prezentata ıncontinuare. Cuvintele cheie ce includ o declaratie de primitiva sunt primitive siendprimitive.

Snµ´¶³

<UDP> ::=primitive<nume>(<nume_terminal_iesire>,

Page 135: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

4.7. Primitive definite de utilizator 125

<nume_terminal_intrare> <,<nume_terminal_intrare>>*);<declaratie_UDP>+ <specificatie_UDP_initial>?<tabela_definitie>endprimitive

Vnµ´¶³

Tnµ´¶³

Ca exemple, sunt prezentate un multiplexor si un bistabilD modelate cu primitive definite de catre utilizator.

// multiplexor 2:1primitive multiplexer (mux, control, dataA, dataB);output mux;input control, dataA, dataB;table//control dataA dataB mux

0 1 0 : 1;0 1 1 : 1;0 1 x : 1;0 0 0 : 0;0 0 1 : 0;0 0 x : 0;1 0 1 : 1;1 1 1 : 1;1 x 1 : 1;1 0 0 : 0;1 1 0 : 0;1 x 0 : 0;x 0 0 : 0;x 1 1 : 1;

endtableendprimitive

// Bistabil activ pe front crescator si iesire negataprimitive p_ff (Q, D, CP);output Q;reg Q;input D, CP;

table// D CP : Qt : Qt+1

1 (01) : ? : 1; // front pozitiv de ceas, D=10 (01) : ? : 0; // front pozitiv de ceas, D=01 (x1) : 1 : 1; // comutarea ceasului din sau in x0 (x1) : 0 : 0;1 (0x) : 1 : 1;0 (0x) : 0 : 0;? (?0) : ? : -; // nici o schimbare pe front negativ

Page 136: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

126 CAPITOLUL 4. NOTIUNI AVANSATE DE VERILOG

(??) ? : ? : -; // ignora fronturile intrarii Dendtableendprimitive

4.8 Accesarea semnalelor ın ierarhie

Limbajul Verilog asociaza fiecarui identificator un nume unic al ierarhiei ın cadrulproiectului. Acest lucru face posibila apelarea identificatorului si din afara modulu-lui ın care a fost declarat acesta. Numele ierarhic este format din atasarea tuturormodulelor din ierarhie despartite prin caracterul punct (.). Accesarea unor identi-ficatori din afara modulului ın care au fost definiti se utilizeaza la ”spionarea” unorsemnale din modulul RTL ın scopul verificarii unor conditii logice, mentinand codulde verificare ın afara modulului ce urmeaza a fi sintetizat.

// module ce va fi sintetizatmodule rtlModule(

a,...

);input[7:0] a;...

subModule U_subModule(...);

...endmodule

// submodul al modulului ce va fi sintetizatmodule subModule(

...);...reg eroare;

always @(posedge clk) begin...eroare <= 1’b0;...eroare <= 1’b1;...

end...endmodule

// modulul de varf, fara porturimodule testTop();

Page 137: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

4.9. Functii PLI 127

rtlModule U_rtlModule ( // instantiere a modulului proiectat.a (a ),...

);

tbModule U_tbModule ( // instantiere a generatorului de semnal.a (a ),...

);

always @(posedge clk)// daca semnalul "eroare" din submodulul "U_subModule" inclus in// "U_rtlModule" este atunci se afiseaza un mesajif (U_rtlModule.U_subModule.eroare) begin

$display("%M %t NOTA: eroare generata in ...", $time);$stop;

end

endmodule

4.9 Functii PLI

Verilog ofera posibilitatea de extindere a functionalitatii unui simulator prin PLI(”Programming Language Interface”, ın limba engleza). Prin PLI se ofera posibi-litatea simulatorului de Verilog sa apeleze programe externe, sa realizeze schimburide informatii si sa sincronizeze executia programelor externe cu cea a simulatoru-lui. Interfata PLI este specifica doar limbajului de descriere hardware Verilog. Prinfolosirea aplicatiilor PLI se rezolva ıntr-un mod facil o serie ıntreaga de probleme cumar fi:

• Incapsularea unor module prin abstractizare si descriere ın limbajul C pentru ale proteja ımpotriva copierii structurii modulului sau pentru a ımbunatati vitezade simulare.

• Accesarea unor biblioteci de functii complexe puse la dispozitie de limbajele deprogramare de nivel ınalt (de exemplu, bibliotecile matematice ale limbajuluiC).

• Citirea unor fisiere ce contin date de intrare pentru un anumit modul. Capa-bilitatile limbajului Verilog de a citi fisiere ce contin descrieri ale unor stimuli deintrare sunt medii, iar pentru structuri mai complexe ale fisierelor si vectorilorde intrare folosirea aplicatiilor PLI devine necesara.

• Prelucrarea ın mod particular a datelor de iesire. Majoritatea simulatoarelorofera medii grafice pentru afisarea semnalelor din proiect, dar uneori apar situatiiın care se doreste o formatare diferita a datelor de iesire. De exemplu, ınsimularea unui controller video pentru un monitor, o aplicatie PLI poate extrage

Page 138: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

128 CAPITOLUL 4. NOTIUNI AVANSATE DE VERILOG

datele necesare si transmite unui program extern. Acesta poate afisa ın timpreal imaginea, similar unui monitor adevarat.

• Co-simularea unor module mixte (digital-analogice). In acest caz aplicatiile PLIfunctioneaza precum un canal de legatura ıntre diferitele tipuri de simulatoarecare ruleaza independent, fiecare simuland portiunile din proiect corespunza-toare.

• Depanarea unor proiecte complexe uneori nu este usor de realizat doar cu fa-cilitatile oferite de simulatoare. De aceea, uneori, este mult mai eficient sa seapeleze la aplicatii PLI care sa extraga anumite informatii specifice procesuluide depanare.

4.9.1 Crearea unei aplicatii PLI

O aplicatie PLI este un program scris de catre utilizator folosind limbajul C/C++,care este executat de catre simulatorul Verilog. Aplicatia PLI interactioneaza cu simu-latorul prin citirea si modificarea valorilor semnalelor din cadrul proiectului simulat.Etapele crearii unei aplicati PLI sunt urmatoarele:

• Definirea numelui pentru functia sau task-ul prin intermediul carora se apeleazaaplicatia PLI.

• Definirea unor rutine C/C++ care sa fie rulate de catre simulator la apelul saula compilarea functiei/task-ului din codul Verilog.

• Inregistrarea functiei/task-ului Verilog si a rutinelor C/C++ asociate ın struc-turile specifice simulatorului Verilog. Prin procesul de ınregistrare se face olegatura ıntre numele functiei/task-ului si rutinele ce urmeaza a fi executate.

• Compilarea surselor C/C++ ale aplicatiei PLI pentru a obtine o bibliotecadinamica urmand ca aceasta sa fie ıncarcata de compilatorul Verilog la pornireasimularii.

Ca exemplu de aplicatie PLI se prezinta o functie Verilog care calculeaza logaritmulın baza 2 al argumentului de intrare.

• Definirea numelui pentru functia sau task-ul prin intermediul careiase apeleaza aplicatia PLI. Se alege un nume sugestiv, log2(n), unde argu-mentul n poate fi o constanta, parametru, sau net (wire sau reg). Ca limbajde dezvoltare se alege ANSI C. Limbajul ANSI C este preferat limbajului C++datorita portabilitatii acestuia pe diferite platforme (Windows, Linux, Solaris).Toate functiile care compun interfata PLI sunt specifice simulatorului si suntoferite sub forma de biblioteca statica ınsotita de un fisier header ın care se spe-cifica antetele functiilor din interfata PLI. Pentru aceasta aplicatie se folosescrutinele VPI care au asociate fisierul vpi_user.h.

/**************************************************************** Fisiere incluse***************************************************************/

Page 139: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

4.9. Functii PLI 129

#include <stdlib.h> /* biblioteca standard ANSI C */#include <stdio.h> /* biblioteca in/out standard ANSI C */#include <string.h> /* biblioteca de siruri standard ANSI C */#include <math.h>#include <time.h>#include "vpi_user.h" /* biblioteca PLI VPI IEEE 1364 */

• Definirea unor rutine C/C++ care sa fie rulate de catre simulator laapelul sau la compilarea functiei/task-ului din codul Verilog.

– Rutina apelata de catre simulator ın momentul compilarii -log2_compiletf. Aceasta rutina este apelata ınainte de ınceperea simu-larii. Scopul ei este de a verifica corectitudinea folosirii functiei/task-ului:numar de parametri, tipul parametrilor, blocul din care a fost apelata. Lafolosirea acestei rutine trebuie sa se tina seama de faptul ca, fiind ınainte deınceperea simularii, structura interna a simulatorului nu este initializata.De aceea, orice ıncercare de a citi sau modifica valori ale semnalelor internemodulului va genera erori. Rutina parcurge lista argumentelor folosind uniterator (o structura speciala specifica interfetei PLI) si verifica numarulsi tipul argumentelor.

/************************************************************* Rutina compiletf***********************************************************/

int log2_compiletf (char *user_data){

vpiHandle systf_handle, arg_itr, arg_handle;int arg_type;

// citeste parametrii task-ului si verifica argumentul NULLsystf_handle = vpi_handle(vpiSysTfCall, NULL);arg_itr = vpi_iterate(vpiArgument, systf_handle);if (arg_itr == NULL){ vpi_printf("EROARE: functia $log2 trebuie sa aiba \

un argument.\n");return (0);

}

// verifica daca primul argument este NULLarg_handle = vpi_scan(arg_itr);if (arg_handle == NULL){ vpi_printf("EROARE: functia $log2 trebuie sa aiba \

un argument.\n");return (0);

}

// determina tipul argumentuluiarg_type = vpi_get(vpiType, arg_handle);

Page 140: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

130 CAPITOLUL 4. NOTIUNI AVANSATE DE VERILOG

if (arg_type != vpiIntegerVar && arg_type != vpiConstant &&arg_type != vpiReg && arg_type != vpiParameter &&arg_type != vpiNet)

{ vpi_printf("EROARE: argumentul functiei $log2 trebuie \sa fie un intreg, un parametru, \un semnal reg sau un semnal wire.\n");

return(0);}

// verifica alte argumentearg_handle = vpi_scan(arg_itr);if (arg_handle != NULL){ vpi_printf("EROARE: functia $log2 accepta \

un singur argument.\n");return(0);

}return (0);

}

– Rutina apelata de simulator pentru a determina lungimea, ın numar debiti, a rezultatului ıntors de catre functie - log2_sizetf.In cazul task-urilor, aceasta functie nu este necesara.

/************************************************************ Rutina sizetf**********************************************************/

int log2_sizetf (char *user_data){ // functia intoarce o valoare reprezentata pe 32 de biti

return (32);}

– Rutina apelata de catre simulator ın momentul simularii, la apelul uneifunctii /task ın codul Verilog - log2_calltf. Rutina obtine un handle(pointer tipic interfetei PLI care identifica obiectele din baza de date in-terna a simulatorului) catre primul argument. Citirea valorii unui obiect(actiune posibila doar ın cazul obiectelor care permit stocarea unei valori)se poate realiza ın mai multe formate. In cazul acestei functii este necesaraobtinerea valorii ca numar ıntreg. Dupa calculul logaritmului ın baza 2 adatei de intrare, aplicatia trebuie sa returneze valoarea calculata. Acest lu-cru se realizeaza prin modificarea valorii obiectului corespunzator functieiVerilog (identificat prin handle-ul systf_handle). Citirea sau modificareaunei valori a unui obiect se realizeaza cu ajutorul unor structuri de datespecializate si specifice interfetei PLI s_vpi_value.

/************************************************************ Rutina calltf**********************************************************/

int log2_calltf (char *user_data){ vpiHandle systf_handle, arg_itr, arg_handle;

Page 141: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

4.9. Functii PLI 131

s_vpi_value arg_val, ret_val;

// formateaza iesirearet_val.format = vpiIntVal;

// citeste argumentul functiei utilizand un iteratorsystf_handle = vpi_handle(vpiSysTfCall, NULL);arg_itr = vpi_iterate(vpiArgument ,systf_handle);arg_handle = vpi_scan(arg_itr);arg_val.format = vpiIntVal;vpi_get_value(arg_handle, &arg_val);

// calculaeza logaritmul in baza 2 al// argumentului de intrareret_val.value.integer =

(int) ceil(log(arg_val.value.integer)/log(2));

// intoarce rezultatulvpi_put_value(systf_handle, &ret_val, NULL, vpiNoDelay);return (0);

}

• Inregistrarea functiei/task-ului Verilog si a rutinelor C/C++ asociateın structurile specifice simulatorului Verilog. Inregistrarea se realizeazafolosind o structura de date tipica interfetei PLI - s_vpi_systf_data. Fiecareinoi functii/task adaugate aplicatiei PLI ıi va corespunde o asemenea structuraai carei membri sunt initializati ıntr-o functie separata. Aceste structuri trebuietransmise simulatorului, proces realizat cu ajutorului unui sir global de poin-teri (adrese) care contine toate functiile care initializeaza structurile de tipuls_vpi_systf_data. In cazul exemplului propus exista o singura functie.

/**************************************************************** Inregistrarea functiei $log2**************************************************************/

void log2_register(){s_vpi_systf_data tf_data;

tf_data.type = vpiSysFunc; // tipul PF al rutinei PLItf_data.sysfunctype = vpiSysFuncInt; // tipul de data intorstf_data.tfname = "$log2"; // numele task-ului Verilogtf_data.calltf = log2_calltf; // numele functiei C

// apelate la rulatetf_data.compiletf = log2_compiletf; // numele functiei C

// apelate la compilaretf_data.sizetf = log2_sizetf; // dimensiunea intoarsavpi_register_systf(&tf_data);

}

Page 142: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

132 CAPITOLUL 4. NOTIUNI AVANSATE DE VERILOG

/***************************************************************** Structura necesara initializarii rutinelor VPI***************************************************************/

void (*vlog_startup_routines[])() = {log2_register,0

};

• Compilarea surselor C/C++ ale aplicatiei PLI pentru a obtine o bi-blioteca dinamica urmand ca aceasta sa fie ıncarcata de compilatorulVerilog la pornirea simularii. Compilarea fisierelor C se realizeaza cu oricecompilator C, folosind un mediu integrat sau apeluri la linie de comanda. Infaza de link-editare a fisierelor, trebuie precizata calea catre biblioteca staticace contine functiile interfetei PLI. Aceasta biblioteca se gaseste ın distributiafiecarui compilator Verilog ce ofera suport PLI. In mod particular, s-a folositsimulatorul ModelSim pe o platforma Windows. Simulatorul ModelSim oferabiblioteca numita mtipli.lib. Pentru o compilare la linie de comanda pentruplatforme Windows, se poate folosi urmatoarea secventa de comenzi (calea catredistributia de ModelSim nu este absoluta, ci este specifica fiecarui utilizator):

cl -c -IC:\modeltech_5.7g\include log2.clink -dll -export:vlog_startup_routines log2.objc:\modeltech_5.7g\win32\mtipli.lib /out:log2.dll

Ca rezultat, se obtine o biblioteca dinamica (log2.dll, ın cazul platformei Win-dows) care trebuie ıncarcata de catre simulator la ıncarcarea proiectului. Moda-litatea de ıncarcare a unei aplicatii PLI este specifica fiecarui tip de simulator.In cazul particular al simulatorului ModelSim, trebuie specificat ın fisierul deinitializare (modelsim.ini) calea catre bibiotecile dinamice ce contin aplicatiiPLI prin intermediul variabilei Veriuser:

; List of dynamically loaded objects for Verilog PLI applicationsVeriuser = ./log2.dll

Incarcarea proiectului ın simulator se face asemanator cu situatiile ın care nusunt implicate aplicatii PLI.

4.9.2 Apelarea aplicatiei PLI

Aplicatia PLI este apelata prin intermediul functiilor din codul Verilog. Un exemplude modul Verilog ın care se apeleaza functia PLI $log2 este prezentat ın continuare.Se observa apelarea functiei cu diferite tipuri de obiecte, transmise ca argument.

Tnµ´¶³

Page 143: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

4.10. Noutati introduse de standardul IEEE Verilog 1364-2001 133

module tstPli();

parameter param = 230;

wire[7:0] wire_sig;reg[7:0] reg_sig;integer int = 279;

wire[7:0] rez_param;wire[7:0] rez_wire;wire[7:0] rez_reg;wire[7:0] rez_int;

initial beginreg_sig = 63;

endassign wire_sig = 15;

assign rez_param = $log2(param); // log2(230) = 8assign rez_wire = $log2(wire_sig); // log2(15) = 4assign rez_reg = $log2(reg_sig); // log2(63) = 6assign rez_int = $log2(int); // log2(279) = 9

endmodule

4.10 Noutati introduse de standardul IEEE Verilog1364-2001

• bloc de configurare

• specificatie generate

• functii care ıntorc constante

• adresarea indexata a vectorilor

• matrici multidimensionale

• selectia unui domeniu al matricilor

• aritmetica cu numere cu semn

• operator de ridicare la putere

• task-uri si functii re-entrante

• operator ce desemneaza o lista de senzitivitati completa

• liste de senzitivitati cu caracter de despartire virgula (,)

Page 144: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

134 CAPITOLUL 4. NOTIUNI AVANSATE DE VERILOG

• functii extinse de acces la fisiere

• extensie automata a latimii peste 32 de biti

• definirea explicita a parametrilor la instantiere

• combinarea declaratiilor de porturi si de directie

• combinarea declaratiilor de directie si de tip

• atribuire initiala pentru semnale de tip reg

• ınlocuirea termenului ”registru” cu termenul ”variabila”

• directive de compilare conditionala ımbunatatite

• directiva de compilare ‘line

• atribute

Page 145: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

Capitolul 5

PROBLEME REZOLVATE

Acest capitol prezinta cateva probleme avansate de proiectare, care nu se rezolvaıntotdeauna cu solutia ”clasica”. Toate problemele au fost ıntalnite ın practica dezi cu zi la firma eASIC. Din acest motiv, unele rezolvari fac apel la metodologia deproiectare a circuitelor integrate digitale ın aceasta tehnologie. Bibliotecile completepentru simulare si sinteza se gasesc pe situl firmei eASIC (http://www.easic.com).

5.1 Circuite de prelucrare a impulsurilor

De foarte multe ori modulele de control transmit comenzi sub forma unor impulsuri.Intr-un sistem sincron, se poate defini impulsul ca fiind un semnal cu o durata activamult mai scurta decat perioada inactiva. Intr-un sistem sincron, latimea semnaluluieste ıntotdeauna un numar ıntreg de perioade de ceas.

5.1.1 Circuite formatoare de impulsuri

Acest paragraf prezinta proiectarea unui circuit secvential sincron avand o intrare sio iesire. Intrarea este generata de un sistem sincron si este activa ın starea ”1” unnumar oarecare Ni de perioade de ceas. Iesirea este ıntotdeauna activa un numar parNo de perioade de ceas, astfel:

• daca Ni este par, atunci No = Ni ;

• daca Ni este impar, atunci No = Ni + 1.

Pentru exemplificare, figura 5.1 prezinta descrierea sistemului prin forme de unda.Se presupune ca exista cel putin doua perioade de ceas pauza ıntre doua pulsuriconsecutive.

Figura 5.1 Formele de unda pentru generatorul de impulsuri.

135

Page 146: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

136 CAPITOLUL 5. PROBLEME REZOLVATE

Problema poate fi rezolvata cu un automat de tip Mealy imediat, pornind de la ointerpretare echivalenta a functionarii:

• daca intrarea este gasita ”1”, iesirea este activata pentru doua perioade de ceassuccesive;

• intrarea este indiferenta (nu se testeaza) ın cea de-a doua perioada de ceas.

Graful de tranzitii al unui automat Mealy imediat, a carui functionare se bazeazape observatia anterioara, este prezentat ın figura 5.2.

0/0

1/1

−/1

S1 S0

Figura 5.2 Graful de tranzitie al automatului care genereaza un impuls de latime numarpar de perioade de ceas.

Se observa ca automatul are numai doua stari ıntre care comuta. Descriereaacestui automat este prezentata ın continuare:

reg stare;

always @(posedge ck) begincase (stare)1’b0: if (puls_i) begin

stare <= 1’b1;endelse begin

stare <= 1’b0;end

1’b1: beginstare <= 1’b0;

enddefault: stare <= 1’b0;endcase

end

// activeaza pulsul de iesire daca stare=1 sau daca puls_i=1assign puls_o = stare ? 1’b1 : puls_i;

Se remarca faptul ca automatul definit anterior nu are semnal de reset. In practica,ın cazul acestui exemplu nici nu este necesar. In simulare ınsa, automatul trebuie adusıntr-o stare cunoscuta. Acest lucru se poate face prin existenta clauzei default pentruspecificatia case, fie prin initializarea variabilei reg stare = 1’b0;.

Page 147: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

5.1. Circuite de prelucrare a impulsurilor 137

Evident, un automat cu doua stari poate fi implementat cu un singur bistabil. Infigura 5.3 se prezinta forma de unda a iesirii unui bistabil comandat astfel:

• daca puls_i=1’b0 atunci toggle = 1’b0 (resetare);

• daca puls_i=1’b1 atunci toggle = ~toggle (complementare).

Iesirea puls_o este obtinuta printr-o poarta logica SAU avand ca intrari puls_isi toggle.

Functionarea circuitului poate fi descrisa astfel: semnalul puls_o este activat dacasemnalul puls_i este activat sau daca semnalul toggle este activat (prin aceastaıntelegand ca latimea semnalului puls_i a fost un numar impar de pulsuri de ceas).

Figura 5.3 Formele de unda pentru generatorul de impulsuri si bistabilul toggle.

Codul Verilog care descrie sistemul este prezentat ın continuare:

reg toggle;assign puls_o = puls_i | toggle;

always @(posedge ck)toggle <= puls_i & ~toggle;

Schema rezultata dupa sinteza este prezentata figura 5.4.

Figura 5.4 Generatorul de impulsuri descris ca bistabil T. Schema dupa sinteza.

Daca se doreste iesirea direct din registru, atunci codul trebuie modificat astfel:

reg toggle;reg puls_o;

always @(posedge ck)begin

toggle <= puls_i & ~toggle;puls_o <= puls_i | toggle;

end

Page 148: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

138 CAPITOLUL 5. PROBLEME REZOLVATE

In acest caz, schema rezultata dupa sinteza este similara cu cea prezentata ın figura5.5. Iesirea va fi ıntarziata cu un tact fata de cea din implementarea precedenta (figura5.4).

Figura 5.5 Generatorul de impulsuri descris ca bistabil T, cu iesire din registru. Schemadupa sinteza.

Se observa ca, desi schemele rezultate (figurile 5.4 si 5.5) prezinta structura unorautomate (bucla peste un registru/bistabil), modelul Verilog nu este similar celuipropus pentru descrierea automatelor ın general. Pentru automate cu putine stari,este uneori preferata scrierea modelului rezultat din transcrierea ın Verilog a ecuatiilorde tranzitie a iesirilor.

5.1.2 Generarea unui semnal ın avans sau cu ıntarziere

Acest paragraf prezinta proiectarea unui circuit secvential sincron ce are la baza unbistabil RS. Se face ipoteza ca semnalele R si S nu sunt active simultan si ca exista celputin doua tacte consecutive ın care nici unul nu este activ. Este necesara generareaa doua semnale cu forma de unda identica cu cea a iesirii bistabilului RS. Primulsemnal trebuie sa fie ıntarziat cu un tact iar al doilea ın avans cu un tact fata desemnalul de referinta (iesirea bistabilului RS). In plus, este necesara monitorizareavalorii de adevar a ipotezei ca R si S nu sunt active simultan.

Formele de unda ce descriu sistemul sunt prezentate ın figura 5.6.

Figura 5.6 Forme de unda ce descriu bistabilul RS.

Semnalul ıntarziat se obtine din iesirea bistabilului RS trecuta printr-un bistabilde tip D. Semnalul ın avans va trebui obtinut combinational. Din analiza formelor deunda prezentate ın figura 5.6, reiese ecuatia logica:

iesire_avans = S | (iesire_rs & ~R)

Codul Verilog care modeleaza acest circuit este prezentat ın continuare:

Page 149: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

5.1. Circuite de prelucrare a impulsurilor 139

Vnµ´¶³

Tnµ´¶³

module rs(ck,reset_ni,r_i,s_i,rs_o,rsAvans_o,rsIntarziat_o

);

input ck;input reset_ni;input r_i;input s_i;output rs_o;output rsAvans_o;output rsIntarziat_o;

reg rs_o;reg rsIntarziat_o;

always @(posedge ck)if (~reset_ni) begin

rs_o <= 1’b0;endelse begin

if (r_i) beginrs_o <= 1’b0;

endelse begin

if (s_i) beginrs_o <= 1’b1;

endend

end

// iesire in avansassign rsAvans_o = s_i | (rs_o & ~r_i);

// iesire intarziataalways @(posedge ck)if (~reset_ni) begin

rsIntarziat_o <= 1’b0;endelse begin

rsIntarziat_o <= rs_o;

Page 150: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

140 CAPITOLUL 5. PROBLEME REZOLVATE

end

endmodule

Schema rezultata prin sinteza este prezentata ın figura 5.7.

Figura 5.7 Schema rezultata prin sinteza (bistabil RS cu semnale ıntarziate si ın avans).

Exista doua ipoteze asociate intrarilor:

• intrarile R si S nu sunt niciodata active simultan;

• exista cel putin doua tacte ın care nici o intrare nu este activa, ıntre activareauneia dintre cele doua intrari.

Verificarea primei ipoteze este echivalenta cu a spune ca functia logica AND ıntrecele doua intrari nu are niciodata valoarea de adevar ”1”.

always @(posedge ck) beginif (r_i && s_i) begin

$display("%M %t EROARE: R si S sunt simultan active", $time);$stop;

endend

Verificarea celei de-a doua ipoteze presupune existenta unor informatii despre”istoria” semnalelor ın ultimele doua perioade de ceas. Figura 5.8 prezinta formelede unda ale semnalelor utilizate la verificarea ipotezei.

Ecuatiile logice ale acestora sunt:

• rOrS = r_i | s_i;

• rOrS_r1 este versiunea ıntarziata cu un tact a semnalului rOrS;

• rOrS_r2 este versiunea ıntarziata cu un tact a semnalului rOrS_r1;

Page 151: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

5.1. Circuite de prelucrare a impulsurilor 141

Figura 5.8 Formele de unda ale semnalelor utilizate la verificarea ipotezei asupra intrarilorRS.

• rOrS_intarziat = rOrS_r1 | rOrS_r2;

• eroare = rOrS_intarziat & rOrS.

Codul Verilog care modeleaza aceste ecuatii este:

wire rOrS;// SAU logic intre intrariassign rOrS = r_i | s_i;

reg rOrS_r1;reg rOrS_r2;wire rOrS_intarziat;// intarzierialways @(posedge ck) begin

rOrS_r1 <= rOrS;rOrS_r2 <= rOrS_r1;

end

// semnal activ doua tacte "in umbra" semnalelor R sau Sassign rOrS_intarziat = rOrS_r1 | rOrS_r2;

reg eroare;// verificare conditie eroare si emitere mesajalways @(posedge ck) begin

if (rOrS_intarziat && rOrS) begineroare <= 1’b1;$display("%M %t EROARE: R si S sunt activate incorect", $time);$stop;

endelse begin

eroare <= 1’b0;end

end

Page 152: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

142 CAPITOLUL 5. PROBLEME REZOLVATE

Logica echivalenta circuitului de generare a erorii este prezentata ın figura 5.9.

Figura 5.9 Logica echivalenta circuitului de generare a erorii.

5.2 Circuit secvential pentru recunoastere de pat-tern

Specificatiile de proiectare ale acestui circuit sunt:

• Sistem sincron, cu reset sincron activ ın 0;

• Recunoaste pattern-ul secvential 11100 prin activarea iesirii potrivire_o pen-tru un tact.

• Numara aparitiile pattern-ului si activeaza iesirea depasire_o la peste 99 deaparitii. Iesirea depasire_o odata setata nu mai este resetata decat prin acti-varea intrarii de reset sincron. Recunoasterea pattern-ului se realizeaza si dupaactivarea iesirii depasire_o.

Formele de unda ce descriu functionarea circuitului sunt prezentate ın figura 5.10.

Figura 5.10 Formele de unda ce descriu functionarea circuitului de recunoastere de pattern.

Abordarea ”clasica” a acestui proiect presupune implementarea circuitului de re-cunoastere a secventei printr-un automat. Organigrama sau graful de tranzitie caredescriu functionarea acestuia vor fi dependente de secventa care se doreste a fi re-cunoscuta. Cu alte cuvinte, daca ulterior proiectarii, beneficiarul schimba secventace trebuie recunoscuta, atunci tot procesul de proiectare se reia de la ınceput.

In continuare este prezentata proiectarea sistemului dupa metodologia clasica deimplementare cu automat. Graful de tranzitie este prezentat ın figura 5.11. Au-tomatul are o intrare de date si o iesire cu semnificatia potrivire_o. Automatulproiectat este de tip Moore. Secventa de recunoscut este ”codata” ın graful detranzitie al automatului.

Numararea potrivirilor se face cu un numarator ın sens crescator care este in-crementat la fiecare activare a iesirii potrivire_o. Un comparator monitorizeaza

Page 153: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

5.2. Circuit secvential pentru recunoastere de pattern 143

0

0

0

0

0

1

S0

S1

S2

S3

S4

S5

1

0

10

1

1

0

0

0

1

1

reset_n0

Figura 5.11 Graful de tranzitie al automatului pentru recunoastere de pattern.

valoarea numaratorului si seteaza un bistabil ın cazul ın care aceasta valoare este 100.Incrementarea ulterioara a numaratorului este inhibata prin conditionarea acesteiade depasire_o=0.

Schema bloc a ıntregului circuit este prezentata ın figura 5.12.Codul Verilog care modeleza circuitul contine specificatii corespunzatoare blocu-

rilor proiectate.

Vnµ´¶³

Tnµ´¶³

// starile automatului‘define S0 3’b000‘define S1 3’b001‘define S2 3’b010‘define S3 3’b011‘define S4 3’b100‘define S5 3’b101

module recPatt(ck,reset_ni,dataIn_i,potrivire_o,depasire_o

);

Page 154: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

144 CAPITOLUL 5. PROBLEME REZOLVATE

reset_ni

S

R

Automatpotrivire_o

depasire_o

dataIn_i

7

crescator

CU

sensNumarator

=100

Figura 5.12 Schema bloc a circuitului de recunoastere de pattern, implementat cu automat.

input ck;input reset_ni;input dataIn_i;output potrivire_o;output depasire_o;

reg potrivire_o;reg depasire_o;reg[6:0] numarator;reg[2:0] stare;

always @(posedge ck) beginif (!reset_ni) begin

stare <= ‘S0;endelse begin

case (stare)‘S0: if (!dataIn_i) begin

stare <= ‘S0;endelse begin

stare <= ‘S1;end

‘S1: if (!dataIn_i) beginstare <= ‘S0;

end

Page 155: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

5.2. Circuit secvential pentru recunoastere de pattern 145

else beginstare <= ‘S2;

end‘S2: if (!dataIn_i) begin

stare <= ‘S0;endelse begin

stare <= ‘S3;end

‘S3: if (!dataIn_i) beginstare <= ‘S4;

endelse begin

stare <= ‘S3;end

‘S4: if (!dataIn_i) beginstare <= ‘S5;

endelse begin

stare <= ‘S1;end

‘S5: if (!dataIn_i) beginstare <= ‘S0;

endelse begin

stare <= ‘S1;end

default: stare <= ‘S0;endcase

endend

always @(posedge ck)if (!reset_ni) begin

potrivire_o <= 1’b0;endelse begin

potrivire_o <= (stare == ‘S4) & (~dataIn_i);end

always @(posedge ck)if (!reset_ni) begin

numarator <= 7’b0;endelse begin

if (potrivire_o && ~depasire_o) beginnumarator <= numarator + 1;

Page 156: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

146 CAPITOLUL 5. PROBLEME REZOLVATE

endend

always @(posedge ck)if (!reset_ni) begin

depasire_o <= 1’b0;endelse begin

if (numarator==7’d100) begindepasire_o <= 1’b1;

endend

endmodule

O abordare alternativa a acestei probleme porneste de la observatia ca o secventade date poate fi memorata ıntr-un lant de bistabile, pentru a se avea acces la o”istorie” a semnalului. Avand la dispozitie istoria semnalului, la fiecare moment sepoate decide daca secventa impusa a fost recunoscuta sau nu. Schimbarea ulterioaraa secventei nu va modifica decat existenta unor inversoare (care ”codifica” informatiadespre pattern). Schema bloc a circuitului care implementeaza acest principiu esteprezentata ın figura 5.13. Circuitul este format dintr-un lant de bistabile ale caroriesiri sunt inversate sau nu, conform patternului ce trebuie recunoscut. Ulterior acestesemnale sunt colectate ıntr-o poarta AND pentru a genera semnalul potrivire_o.

potrivire_oD O

D O D O D O D OdataIn_i

Figura 5.13 Schema bloc a circuitului de deplasare pentru implementarea recunoasterii depattern.

Codul Verilog care modeleaza circuitul de deplasare este prezentat ın continuare.

Vnµ´¶³

reg[3:0] data_r;always @(posedge ck)if (!reset_ni) begin

data_r <= 4’b0;potrivire_o <= 1’b0;

endelse begin

data_r <= {data_r[2:0], dataIn_i};// urmatoarea linie codifica patternul prin pozitia inversoarelorpotrivire_o <= &{data_r[3], data_r[2], data_r[1], ~data_r[0],

Page 157: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

5.3. Verificator de protocol de comunicatie 147

~dataIn_i};end

Se remarca claritatea sporita a codului propus ın varianta cu registru de deplasarefata de varianta cu automat.

5.3 Verificator de protocol de comunicatie

Un protocol uzual de comunicare ıntre doua module ale unui sistem digital este pro-tocolul bazat pe cerere si confirmare. Modulul sursa trimite o cerere catre modululdestinatie prin activarea unui semnal cerere. Acest semnal este tinut activ pana candmodulul destinatie valideaza cererea. Cererea este validata cand modulul destinatieactiveaza pentru o perioada de tact semnalul confirmare. Se presupune ca modululsursa mentine cererea activa pana la primirea confirmarii iar modulul destinatie emiteıntotdeaunda (mai devreme sau mai tarziu) un puls de validare asociat fiecarei cererireceptionate. Aceste ipoteze pot fi infirmate ın cazul ın care unul dintre module areo anomalie de proiectare. Acest lucru este mai neplacut ın cazul ın care cele douamodule, sursa si destinatie, sunt proiectate de catre proiectanti diferiti.

Se justifica astfel existenta unui ”monitor/verificator de protocol” care sa ”spi-oneze” semnalele de cerere si de confirmare si sa semnaleze abaterile de la protocolulimpus. Cateva cazuri de abateri de la protocol sunt prezentate ın figura 5.14:

• cerere abandonata ınainte de primirea confirmarii;

• cerere mentinuta dupa primirea confirmarii;

• confirmare emisa fara cerere;

• confirmare emisa simultan cu cererea.

Figura 5.14 Protocol bazat pe cerere si confirmare.

Pozitia unui modul de monitorizare a protocolului ın cadrul unui mediu de simulareeste prezentata grafic ın figura 5.15. Se observa faptul ca modulul are doar intrari,provenite de la cererea modulului sursa si confirmarea modulului destinatie. Modululde verificare nu trebuie sa aiba iesiri, mesajele de eroare putand fi prezentate ca mesajetext. Ca o alternativa, se poate proiecta o iesire cu semnificatia ”eroare de protocol”.Aceasta iesire ar putea fi folosita, ıntr-un sistem cu microprocesor, la activarea uneiıntreruperi.

Abordarea proiectarii acestui circuit porneste de la observatia ca toate erorilesunt depistate prin corelarea valorilor curente ale cererii si confirmarii cu valorileanterioare (din tactul precedent) ale acestora. Este nevoie ca cele doua semnale sa fiememorate ın doua bistabile. Iesirile celor doua bistabile, ımpreuna cu valorile curente

Page 158: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

148 CAPITOLUL 5. PROBLEME REZOLVATE

Modul sursa

Modul

verificare protocol

Modul destinatie

cerere

confirmare

mesaj de eroare

eroare

Figura 5.15 Pozitia unui modul de monitorizare a protocolului ın cadrul unui mediu desimulare.

ale cererii si confirmarii vor intra ıntr-un circuit combinational care va face distinctiaıntre cazurile corecte si cazurile eronate. Codul Verilog este prezentat ın continuareiar schema obtinuta prin sinteza este prezentata ın figura 5.16.

Figura 5.16 Schema sintetizata pentru modulul de verificare a protocolului de comunicareıntre doua module.

Vnµ´¶³

Tnµ´¶³

module monProtocol(ck_i,reset_ni,cerere_i,confirmare_i,eroare_o

);

Page 159: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

5.3. Verificator de protocol de comunicatie 149

input ck_i;input reset_ni;input cerere_i;input confirmare_i;output eroare_o;

reg cerere_r;reg confirmare_r;reg eroare_o;

always @(posedge ck_i)if (!reset_ni) begin

cerere_r <= 1’b0;confirmare_r <= 1’b0;

endelse begin

cerere_r <= cerere_i;confirmare_r <= confirmare_i;

end

always @(posedge ck_i)if (!reset_ni) begin

eroare_o <= 1’b0;endelse begin

case({cerere_i, cerere_r, confirmare_i, confirmare_r})4’b0000: eroare_o <= 1’b0;4’b0001: eroare_o <= 1’b1;4’b0010: eroare_o <= 1’b1;4’b0011: eroare_o <= 1’b1;4’b0100: eroare_o <= 1’b1;4’b0101: eroare_o <= 1’b0;4’b0110: eroare_o <= 1’b1;4’b0111: eroare_o <= 1’b1;4’b1000: eroare_o <= 1’b0;4’b1001: eroare_o <= 1’b1;4’b1010: eroare_o <= 1’b1;4’b1011: eroare_o <= 1’b1;4’b1100: eroare_o <= 1’b0;4’b1101: eroare_o <= 1’b1;4’b1110: eroare_o <= 1’b0;4’b1111: eroare_o <= 1’b1;default: eroare_o <= 1’b1;endcase

end

Page 160: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

150 CAPITOLUL 5. PROBLEME REZOLVATE

always @(posedge ck_i)if (eroare_o)

$display("%M %t eroare_o de protocol", $time);

endmodule

5.4 Generarea semnalului de transport al unuinumarator sincron

Se considera proiectarea unui numarator sincron prevazut cu o iesire de semnalizarea depasirii (”overflow”, ın limba engleza).

Solutia banala consta ın conectarea tuturor iesirilor unui numarator la o poartaSAU-NU. Descrierea Verilog a acestui caz este prezentata ın continuare.

Vnµ´¶³

Tnµ´¶³

always @(posedge Ck) begincounter <= counter + 1;ovf <= ~|counter;

end

Schema rezultata dupa sinteza este prezentata ın figura 5.17.

Figura 5.17 Schema sintetizata pentru numaratorul cu semnalizare a depasirii.

Un dezavantaj consta ın faptul ca numarul de intrari ın poarta OR este egal cunumarul de biti ai numaratorului. O solutie independenta de numarul de biti ainumaratorului este prezentata ın continuare. Solutia se bazeaza pe observatia cala comutarea din 11...1 ın 00...0 este singura data cand bitul cel mai semnifica-tiv comuta din 1 ın 0. Altfel spus, depasirea este marcata de starea 0 a celui maisemnificativ bit, daca ın tactul anterior acest bit a fost 1.

Vnµ´¶³

reg[msb:0] counter;always @(posedge Ck) begin

counter <= counter + 1;

Page 161: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

5.5. Modelarea registrelor 151

counter_msb_r <= counter[msb];ovf <= counter_msb_r & ~counter[msb];

end

Schema rezultata dupa sinteza (figura 5.18) prezinta un bistabil pentru ıntarziereacelui mai semnificativ bit urmat de o poarta AND (cu o intrare inversata). Solutiaeste independenta de numarul de biti ai numaratorului.

Figura 5.18 Schema recomandata pentru numaratorul cu semnalizare a depasirii.

5.5 Modelarea registrelor

5.5.1 Registrul paralel

Schema bloc a unui registru de deplasare, cu ıncarcare si iesire ın paralel, este prezen-tata ın figura 5.19.

d

q

ldshck

Figura 5.19 Schema bloc a unui registru de deplasare, cu ıncarcare si iesire ın paralel.

Registrul functioneaza astfel:

• Daca semnalul de ıncarcare ld (Load) este activ, atunci datele de intrare disunt stocate ın registru.

• Daca semnalul de deplasare sh (Shift) este activ, atunci cuvantul memorat deregistru este deplasat spre stanga cu un bit.

Tabelul 5.1 prezinta actiunile registrului.Descrierea Verilog a unui astfel de registru este prezentata ın continuare:

Page 162: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

152 CAPITOLUL 5. PROBLEME REZOLVATE

ld sh ck q Semnificatie1 X d Incarcare0 1 q << 1 Deplasare stanga0 0 X q Pastrare stare

Tabelul 5.1Tabelul de adevar al registrului de deplasare paralel.

Vnµ´¶³

Tnµ´¶³

module paralelReg (ck,ld,sh,di,do

);

input ck;input ld;input sh;input[3:0] di;output[3:0] do;reg[3:0] do;

always @(posedge ck) beginif (ld) begin

do <= di;endelse begin

if (sh) begin// deplasare stanga realizata prin concatenarea celor mai putini// semnificativi biti ai registrului cu un bit zero.do <= {do[2:0], 1’b0};

endend

endendmodule

Schema acestui registru, sintetizat, este prezentata ın figura 5.20.

5.5.2 Registrul cu reactie, LFSR

LFSR (Linear Feed-back Shift Register) este un registru de deplasare care are o reactierealizata cu o poarta XOR. Acest tip de constructie poate genera o secventa de staripseudoaleatorii. Numarul de stari generate de un LFSR cu latime de N biti este de2N−1 (ın cazul ın care polinomul caracteristic este prim). Diferenta ıntre LFSR si un

Page 163: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

5.5. Modelarea registrelor 153

Figura 5.20 Registru de deplasare, cu ıncarcare si iesire ın paralel, schema dupa sinteza.

numarator, care are 2N stari, consta ın faptul ca circuitul combinational al LFSR estemult mai mic (deci circuitul are arie mai mica si functioneaza mai rapid). CircuiteleLFSR se utilizeaza cand se doreste o secventa de numarare aleatorie sau o secventaindiferenta dar de dimensiuni maxime pentru un anumit ”cost de hardware”.

La intrarea portii XOR se introduc bitii corespunzatori polinomului care caracte-rizeaza circuitul. Acest polinom este dependent de latimea registrului. De exemplu,pentru o latime de 8 biti, polinomul caracteristic este: f(x) = x8 + x6 + x5 + x + 1.

Schema bloc a unui LFSR de 8 biti este prezentata ın figura 5.21.

D Q D QD Q D Q D Q D Q D QD Q

[7] [6] [5] [4] [3] [2] [1] [0]

CK

Figura 5.21 Schema bloc a unui LFSR de 8 biti.

Descrierea Verilog a unui astfel de registru este prezentata ın continuare:

Vnµ´¶³

module lfsr8(ck_i,reset_ni,en_i,data_o

);

input ck_i;

Page 164: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

154 CAPITOLUL 5. PROBLEME REZOLVATE

input reset_ni;input en_i;output[7:0] data_o;reg[7:0] data_o;

// registru de deplasare cu MSB format din XOR pe vectori// polinom caracteristic x8+x6+x5+x+1always @(posedge ck_i) begin

if (~reset_ni) begindata_o <= ’b1;

endelse begin

if (en_i) begindata_o <= {~^{data_o[6], data_o[5], data_o[1], data_o[0]},

data_o[7:1]};end

endend

endmodule

In continuare este prezentat un model de LFSR parametrizabil. Modelul are avan-tajul ca permite mentinerea unui cod unic si transmiterea dimensiunii registrului doarın momentul instantierii acestuia. Codul are ca parametru dimensiunea registruluiexprimata ın numar de biti. Pe baza dimensiunii, se determina printr-o functie con-stanta polinomul caracteristic. Ulterior, functia XNOR se aplica ıntre bitii registruluimascati cu polinomul asociat. Modelarea are la baza ideea ca poarta AND permitetrecerea unei intrari daca cealalta este 1 sau blocheaza intrarea (0) daca cealaltaintrare este 0. Functiile constante sunt o caracteristica introdusa de Verilog-2001.

Vnµ´¶³

module lfsr(ck_i,reset_ni,en_i,data_o

);

parameter width = 4;input ck_i;input reset_ni;input en_i;output[width-1:0] data_o;reg[width-1:0] data_o;

// functia de asociere a polinomului cu latimea LFSRfunction integer lfsrPoly (input integer width);

Page 165: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

5.5. Modelarea registrelor 155

begincase (width)1: lfsrPoly = 1’b1;2: lfsrPoly = 2’b11;3: lfsrPoly = 3’b011;4: lfsrPoly = 4’b0011;5: lfsrPoly = 5’b00101;6: lfsrPoly = 6’b000001;7: lfsrPoly = 7’b0000011;8: lfsrPoly = 8’b01100011;9: lfsrPoly = 9’b000010001;

10: lfsrPoly = 10’b0000001001;11: lfsrPoly = 11’b00000000101;12: lfsrPoly = 12’b000010011001;13: lfsrPoly = 13’b0000000011011;14: lfsrPoly = 14’b01100000000011;15: lfsrPoly = 15’b000000000000011;16: lfsrPoly = 16’b0000000000101101;17: lfsrPoly = 17’b00000000000001001;18: lfsrPoly = 18’b000000000010000001;19: lfsrPoly = 19’b0000000000001100011;20: lfsrPoly = 20’b00000000000000001001;21: lfsrPoly = 21’b000000000000000000101;22: lfsrPoly = 22’b0000000000000000000011;23: lfsrPoly = 23’b00000000000000000100001;24: lfsrPoly = 24’b000000000000000000011011;25: lfsrPoly = 25’b0000000000000000000001001;26: lfsrPoly = 26’b00000000000000000110000011;27: lfsrPoly = 27’b000000000000000000110000011;28: lfsrPoly = 28’b0000000000000000000000001001;29: lfsrPoly = 29’b00000000000000000000000000101;30: lfsrPoly = 30’b000000000000011000000000000011;31: lfsrPoly = 31’b0000000000000000000000000001001;32: lfsrPoly = 32’b00011000000000000000000000000011;33: lfsrPoly = 33’b000000000000000000010000000000001;34: lfsrPoly = 34’b0000000000000000001100000000000011;35: lfsrPoly = 35’b00000000000000000000000000000000101;36: lfsrPoly = 36’b000000000000000000000000100000000001;37: lfsrPoly = 37’b0000000000000000000000010100000000101;38: lfsrPoly = 38’b00000000000000000000000000000001100011;39: lfsrPoly = 39’b000000000000000000000000000000000010001;40: lfsrPoly = 40’b0000000000000000000101000000000000000101;41: lfsrPoly = 41’b00000000000000000000000000000000000001001;42: lfsrPoly = 42’b000000000000000001100000000000000000000011;43: lfsrPoly = 43’b0000000000000000000000000000000000001100011;44: lfsrPoly = 44’b00000000000000001100000000000000000000000011;45: lfsrPoly = 45’b000000000000000000000000000000000000000011011;

Page 166: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

156 CAPITOLUL 5. PROBLEME REZOLVATE

46: lfsrPoly = 46’b0000000000000000000000000110000000000000000011;47: lfsrPoly = 47’b00000000000000000000000000000000000000000100001;48: lfsrPoly = 48’b000000000000000000011000000000000000000000000011;49: lfsrPoly = 49’b0000000000000000000000000000000000000001000000001;50: lfsrPoly = 50’b00000000000000000000001100000000000000000000000011;

default : lfsrPoly = 1’b1;endcase

endendfunction

wire[width-1:0] polynom;

// asociaza dimensiunii polinomul caracteristicassign polynom = lfsrPoly(width);

// registru de deplasare cu MSB format din XOR pe vectorialways @(posedge ck_i) begin

if (~reset_ni) begindata_o <= ’b1;

endelse begin

if (en_i) begindata_o <= {~^(data_o & polynom), data_o[width-1:1]};

endend

end

endmodule

Tnµ´¶³

In mediul de testare s-a instantiat modulul lfsr cu diversi parametrii, caın exemplul urmator:

wire[2:0] data3;wire[3:0] data4;

// instantiere LFSR de 3 bitilfsr #(3) lfsr3(

.ck_i (ck ),

.reset_ni (reset_n ),

.en_i (en ),

.data_o (data3 ));

// instantiere LFSR de 4 bitilfsr #(4) lfsr4(

.ck_i (ck ),

.reset_ni (reset_n ),

Page 167: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

5.5. Modelarea registrelor 157

.en_i (en ),

.data_o (data4 ));

Tnµ´¶³

In continuare sunt prezentate fisiere intermediare obtinute ın cursul imple-mentarii unui LSFR ın tehnologie eASIC. Fisierele cu bibliotecile necesare simulariise afla pe situl de web al cartii. Intregul set de biblioteci poate fi gasit pe situl firmeieASIC.

In urma sintezei modulului lfsr cu parametrul width = 4, se obtine un netlistcu instantieri de primitive din biblioteca specifica de tehnologie. Fisierul rezultat,prezentat ın continuare, poate fi simulat cu conditia compilarii bibliotecii de tehnologiece contine descrierea comportamentului tuturor primitivelor.

module lfsr_syn ( ck_i, reset_ni, en_i, data_o );output [3:0] data_o;input ck_i, reset_ni, en_i;wire N13, n2, n3, n4, n6, n8, n9, n11, n12;

dffe data_o_reg1 ( .Q(data_o[1]), .CK(ck_i), .D(n2), .EN(N13) );dffe data_o_reg2 ( .Q(data_o[2]), .CK(ck_i), .D(n3), .EN(N13) );dffe data_o_reg3 ( .Q(data_o[3]), .CK(ck_i), .D(n4), .EN(N13) );dffe data_o_reg0 ( .Q(data_o[0]), .CK(ck_i), .D(n12), .EN(N13) );l3i_40_x3 U8 ( .Y(n8), .A(data_o[1]), .B(n9), .C(n6) );inv U9 ( .Y(n9), .A(data_o[0]) );inv U16 ( .Y(n6), .A(n11) );l3j_45_x3 U18 ( .Y(n4), .A(n8), .B(n11), .C1(data_o[0]),

.C2(data_o[1]) );l2c_dd_x3 U19 ( .Y(n3), .A(data_o[3]), .B(n11) );l2c_dd_x3 U20 ( .Y(n2), .A(data_o[2]), .B(n11) );l3i_4c_x3 U21 ( .Y(n12), .A(data_o[1]), .B(reset_ni), .C(n6) );l2c_77_x3 U22 ( .Y(n11), .A(reset_ni), .B(en_i) );l2c_77_x3 U23 ( .Y(N13), .A(reset_ni), .B(n11) );

endmodule

Ulterior, netlist-ul ce contine primitive de nivel ınalt este asociat cu resurselelogice existente, plasat si ın final rutat. La finalul implementarii se genereaza un fisiernetlist cu informatii specifice resurselor folosite ın tehnologia aleasa. Acest fisier poatefi simulat ın acelasi mediu de testare, cu sau fara informatie de timp de propagareprin logica si pe sarme. Formele de unda rezultate ın urma simularii celor trei modele(RTL, post sinteza si post map-are/plasare/rutare) sunt prezentate ın figura 5.22.In figura 5.23, se prezinta o imagine marita a formelor de unda, imagine ın care seobserva includerea informatiilor temporale ın modelul post map-are/plasare/rutare.

Tnµ´¶³

//-----------------------------------------------------// Generated by eMap Ver 1.0.11 - eTools 4.1.2 Build Fri 05/28/05

Page 168: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

158 CAPITOLUL 5. PROBLEME REZOLVATE

Figura 5.22 Formele de unda rezultate ın urma simularii celor trei modele (RTL, postsinteza si post map-are/plasare/rutare) ale LFSR pe 4 biti.

Figura 5.23 Imagine marita a formelor de unda rezultate ın urma simularii. Se remarcaıntarzierile modelului post map-are/plasare/rutare.

// technology FA250L// Current time: 25_07_2005-12:40:49//-----------------------------------------------------

//------------------------------------------------------// Top module//------------------------------------------------------module core_lfsr ( data_o, ck_i, reset_ni, en_i );

output [3:0] data_o;input ck_i, reset_ni, en_i;

wire n32, n31, n30, n29, n28, n27, n26, n25, n24, n23, n22, n21, n19,n17, n16, n15;

supply1 N_VCC;

assign data_o[3] = n19;assign data_o[2] = n23;assign data_o[1] = n28;assign data_o[0] = n21;assign n15 = ck_i;assign n16 = reset_ni;assign n17 = en_i;

Page 169: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

5.5. Modelarea registrelor 159

cell_2413 cell_2413 ( .i2n(n29), .i2(n26) );

cell_2412 cell_2412 ( .i2n(n27), .i2(n22) );

cell_2411 cell_2411 ( .x(n24), .xa(n29), .xb(n21), .xc1(N_VCC),.xc2(n22) );cell_2398 cell_2398 ( .i2n(n28), .i2(n27) );

cell_2396 cell_2396 ( .i3n(n21), .ms(n30), .xa(n31), .xb(n29),.xc1(N_VCC), .xc2(n27), .ck(n15) );

cell_2395 cell_2395 ( .i3n(n19), .ms(n30), .xa(n26), .xb(n24),.xc1(n21), .xc2(n28), .ck(n15) );

cell_2394 cell_2394 ( .i3n(n22), .ms(n30), .xa(N_VCC), .xb(n26),.xc1(N_VCC), .xc2(n23), .ck(n15) );

cell_2392 cell_2392 ( .i2n(n30), .i2(n25) );

cell_2382 cell_2382 ( .i3n(n31), .i3(n16) );

cell_2381 cell_2381 ( .i1n(n26), .yc1(n16), .yc2(n17) );

cell_2379 cell_2379 ( .i3n(n23), .ms(n30), .xa(N_VCC), .xb(n26),.xc1(N_VCC), .xc2(n19), .ck(n15) );

cell_2378 cell_2378 ( .i2n(n32), .i2(n31) );

cell_2377 cell_2377 ( .i1n(n25), .yc1(n32), .yc2(n26) );endmodule

module cell_2413 ( i2n, i2 );//PLACEDoutput i2n;input i2;

inv6xb u36_inv6xb ( .i2n(i2n), .i2(i2) );endmodule

module cell_2412 ( i2n, i2 );//PLACEDoutput i2n;input i2;

inv6xb u34_inv6xb ( .i2n(i2n), .i2(i2) );

Page 170: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

160 CAPITOLUL 5. PROBLEME REZOLVATE

endmodule

module cell_2411 ( x, xa, xb, xc1, xc2 );//PLACED//DUMMYPORT U8_nand2x.xc1output x;input xa, xb, xc1, xc2;wire xn, xc;

inv6xa U8_inv6xa ( .x(x), .xn(xn) );lutx_fe U8_lutx ( .xn(xn), .xa(xa), .xb(xb), .xc(xc) );nand2x U8_nand2x ( .xc(xc), .xc1(xc1), .xc2(xc2) );endmodule

module cell_2398 ( i2n, i2 );//PLACEDoutput i2n;input i2;

inv6xb u35_inv6xb ( .i2n(i2n), .i2(i2) );endmodule

module cell_2396 ( i3n, ms, xa, xb, xc1, xc2, ck );//PLACED//DUMMYPORT U21_nand2x.xc1output i3n;input ms, xa, xb, xc1, xc2, ck;wire qn, mn, xn, xc;

inv8xb data_o_reg0_inv8xb ( .i3n(i3n), .i3(qn) );dffx data_o_reg0_dffx ( .qn(qn), .mn(mn), .ck(ck) );muxy data_o_reg0_muxy ( .mn(mn), .ms(ms), .m1(xn), .m0(qn) );lutx_54 U21_lutx ( .xn(xn), .xa(xa), .xb(xb), .xc(xc) );nand2x U21_nand2x ( .xc(xc), .xc1(xc1), .xc2(xc2) );endmodule

module cell_2395 ( i3n, ms, xa, xb, xc1, xc2, ck );//PLACEDoutput i3n;input ms, xa, xb, xc1, xc2, ck;wire qn, mn, xn, xc;

inv8xb data_o_reg3_inv8xb ( .i3n(i3n), .i3(qn) );

Page 171: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

5.5. Modelarea registrelor 161

dffx data_o_reg3_dffx ( .qn(qn), .mn(mn), .ck(ck) );muxy data_o_reg3_muxy ( .mn(mn), .ms(ms), .m1(xn), .m0(qn) );lutx_13 U18_lutx ( .xn(xn), .xa(xa), .xb(xb), .xc(xc) );nand2x U18_nand2x ( .xc(xc), .xc1(xc1), .xc2(xc2) );endmodule

module cell_2394 ( i3n, ms, xa, xb, xc1, xc2, ck );//PLACED//DUMMYPORT U20_lutx.xa, u62_nand2x.xc1output i3n;input ms, xa, xb, xc1, xc2, ck;wire qn, mn, xn, xc;

inv8xb data_o_reg1_inv8xb ( .i3n(i3n), .i3(qn) );dffx data_o_reg1_dffx ( .qn(qn), .mn(mn), .ck(ck) );muxy data_o_reg1_muxy ( .mn(mn), .ms(ms), .m1(xn), .m0(qn) );lutx_3f U20_lutx ( .xn(xn), .xa(xa), .xb(xb), .xc(xc) );nand2x u62_nand2x ( .xc(xc), .xc1(xc1), .xc2(xc2) );endmodule

module cell_2392 ( i2n, i2 );//PLACEDoutput i2n;input i2;

inv6xb u37_inv6xb ( .i2n(i2n), .i2(i2) );endmodule

module cell_2382 ( i3n, i3 );//PLACEDoutput i3n;input i3;

inv8xb u38_inv8xb ( .i3n(i3n), .i3(i3) );endmodule

module cell_2381 ( i1n, yc1, yc2 );//PLACEDoutput i1n;input yc1, yc2;wire yc;

inv8xa U22_inv8xa ( .i1n(i1n), .i1(yc) );

Page 172: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

162 CAPITOLUL 5. PROBLEME REZOLVATE

nand2y U22_nand2y ( .yc(yc), .yc1(yc1), .yc2i(yc2) );endmodule

module cell_2379 ( i3n, ms, xa, xb, xc1, xc2, ck );//PLACED//DUMMYPORT U19_lutx.xa, u63_nand2x.xc1output i3n;input ms, xa, xb, xc1, xc2, ck;wire qn, mn, xn, xc;

inv8xb data_o_reg2_inv8xb ( .i3n(i3n), .i3(qn) );dffx data_o_reg2_dffx ( .qn(qn), .mn(mn), .ck(ck) );muxy data_o_reg2_muxy ( .mn(mn), .ms(ms), .m1(xn), .m0(qn) );lutx_3f U19_lutx ( .xn(xn), .xa(xa), .xb(xb), .xc(xc) );nand2x u63_nand2x ( .xc(xc), .xc1(xc1), .xc2(xc2) );endmodule

module cell_2378 ( i2n, i2 );//PLACEDoutput i2n;input i2;

inv6xb u39_inv6xb ( .i2n(i2n), .i2(i2) );endmodule

module cell_2377 ( i1n, yc1, yc2 );//PLACEDoutput i1n;input yc1, yc2;wire yc, yc2n;

inv8xa U23_inv8xa ( .i1n(i1n), .i1(yc) );nand2y U23_nand2y ( .yc(yc), .yc1(yc1), .yc2i(yc2n) );invi U23_invi ( .yc2n(yc2n), .yc2(yc2) );endmodule

5.6 Sincronizarea semnalelor la trecerea ıntre douadomenii de ceas

O problema deosebita ın proiectarea sistemelor digitale o reprezinta trecerea sem-nalelor dintr-un domeniu de ceas ın altul. Riscul ıl reprezinta faptul ca este posibilca ın simulare totul sa functioneze corect, dar ın realitate chip-ul sa nu functionezesau sa functioneze aleatoriu. Motivul ıl constituie negarantarea ındeplinirii conditiilor

Page 173: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

5.6. Sincronizarea semnalelor la trecerea ıntre doua domenii de ceas 163

de setup si hold ale bistabilelor ce comuta pe ceasul de destinatie, ın cazul ın caresemnalul de date se modifica pe un ceas sursa asincron fata de cel de destinatie.

De cele mai multe ori exista cazuri de treceri ale semnalelor ıntre doua domeniide ceas chiar ın sisteme simple, cu procesoare ınglobate. De exemplu, ın cazul ıncare procesorul functioneaza pe o frecventa iar restul sistemului pe alta frecventa (deobicei mai mare), trecerea semnalelor ıntre procesor si restul sistemului este inevita-bila. In continuarea acestui paragraf vor fi analizate trei tipuri de circuite folosite lasincronizarea unor tipuri de semnale particulare.

• sincronizare de semnal cu evolutie lenta la trecerea dintr-un domeniu de ceas defrecventa scazuta ıntr-un domeniu de ceas de frecventa ridicata;

• sincronizare de puls la trecerea dintr-un domeniu de ceas de frecventa ridicataıntr-un domeniu de ceas de frecventa scazuta;

• sincronizare de puls la trecerea dintr-un domeniu de ceas de frecventa scazutaıntrn domeniu de ceas de frecventa ridicata.

Exista circuite simple care realizeaza cu succes sincronizarea semnalelor dar au deza-vantajul ca se bazeaza pe o anumita relatie ıntre frecventele celor doua domenii (sursasi destinatie). La circuitele de sincronizare de pulsuri se vor prezenta cele mai simplesolutii dar si solutii mai complexe dar independente de raportul ıntre frecventele celordoua domenii de ceas.

5.6.1 Sincronizarea unui semnal cu evolutie lenta la trecereadintr-un domeniu de ceas de frecventa scazuta ıntr-undomeniu de ceas de frecventa ridicata

Acest tip de sincronizare este foarte frecventa pentru semnale de control (cu semnifi-catie pe bit) programate de catre microprocesor. In cele mai multe cazuri, registreleasociate acestor semnale de control sunt scrise o singura data, ın etapa de initializarea sistemului. Ca exemplu, se poate mentiona semnalul de validare a functionarii unuicontroller de memorie, activat de catre microprocesor dupa scurgerea unui intervalde timp impus de contrangerile chip-ului de memorie. Acest semnal este initial (lareset) ın stare 0 si este scris de catre procesor cu valoarea 1. Acest eveniment estesingular (semnalul ramane 1 pentru totdeauna) si este interpretat de catre controllerca ”validare a ınceperii initializarii memoriei”.

Evident, aparitia acestui eveniment (setarea semnalului de catre procesor) cu ooarecare ıntarziere pe celalalt domeniu de ceas este acceptabila. Singura constangereimpusa este ca sa fie minimizata starea de metastabilitate a semnalelor din domeniulde ceas de destinatie. Din acest motiv, sincronizarea semnalului prin trecerea acestuiaprin doua bistabile avand ca ceas ceasul de destinatie, este o solutie acceptabila.

Codul Verilog al circuitului de sincronizare a unui semnal la trecerea dintr-undomeniu de ceas lent ıntr-un domeniu de ceas mai rapid este prezentat ın continuare.Formele de unda rezultate sunt prezentate ın figura 5.24.

Vnµ´¶³

Tnµ´¶³

Page 174: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

164 CAPITOLUL 5. PROBLEME REZOLVATE

module outSync_s2f (bitS_i,clkF_i,resetF_ni,bitF_o

);

input bitS_i;input clkF_i;input resetF_ni;output bitF_o;

// clkS | | | | |// clkF_i | | | | | | | | | | | | | | | | | |// bitS_i _|-----------------------|________// bitF_r __|-----------------------|_______// bitF_o ____|-----------------------|_____

reg bitF_r;reg bitF_o;

// doua bistabile pe ceasul de destinatiealways @(posedge clkF_i) begin

if (~resetF_ni) beginbitF_r <= 1’b0;bitF_o <= 1’b0;

endelse begin

bitF_r <= bitS_i;bitF_o <= bitF_r;

endendendmodule

Figura 5.24 Formele de unda pentru circuitul de sincronizare a unui semnal la trecereadintr-un domeniu de ceas lent ıntr-un domeniu de ceas mai rapid.

De remarcat faptul ca acest circuit este corect exclusiv pentru sincronizarea sem-nalelor de un bit, cu semnificatie individuala. O solutie pentru sincronizarea unui buseste prezentata ın sectiunea 5.6.4.

Page 175: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

5.6. Sincronizarea semnalelor la trecerea ıntre doua domenii de ceas 165

5.6.2 Sincronizarea unui puls la trecerea dintr-un domeniu deceas de frecventa ridicata ıntr-un domeniu de ceas defrecventa scazuta

Exista numeroase cazuri ın care o actiune ce are loc ıntr-un domeniu de ceas rapidtrebuie transmisa ın domeniul unui ceas lent. Actiunea, semnalata printr-un puls culatime de o perioada de ceas rapid, poate avea loc ıntre momentele determinate defronturile ceasului lent. Din aceasta cauza sunt necesare procesari ale pulsului pentrua asigura transmiterea acestuia ca un puls pe domeniul de ceas lent.

O solutie simpla, dar dependenta de raportul dintre frecventele ceasurilor sursa sidestinatie, consta din ”latirea” pulsului astfel ıncat latimea pulsului sa fie egala cucel putin o perioada a ceasului destinatie. In acest mod se garanteaza ca semnalul vafi esantionat la destinatie activ cel putin pe un front al semnalului de ceas. Ceasurilefiind asincrone, este posibil, ca ın anumite cazuri, pulsul sa fie esantionat la destinatieca activ chiar ın doua perioade de ceas succesive. Din acest motiv, trebuie prevazut un”circuit de detectie de front” care sa garanteze ca la iesirea acestuia pulsul are latimeaexact de o perioada de ceas. In plus, ramane problema sincronizarii semnalului printrecerea prin doua bistabile pe ceasul de destinatie. Circuitul consta din:

• latire a pulsului la destinatie astfel ıncat latimea acestuia sa fie mai mare decat operioada a ceasului de destinatie (operatie dependenta de frecventele ceasurilorsursa si destinatie);

• sincronizare a pulsului prin trecerea prin doua bistabile pe ceasul de destinatie;

• detectia de front pentru generarea unui puls cu latime de o perioada pe ceasulde destinatie.

Codul Verilog al circuitului de sincronizare a unui puls la trecerea dintr-un dome-niu de ceas rapid ıntr-un domeniu de ceas mai lent este prezentat ın continuare.Formele de unda rezultate sunt prezentate ın figura 5.25. Schema rezultata din sin-teza este prezentata ın figura 5.26. Ipoteza este ca frecventa ceasului de destinatieeste de maxim 4 ori mai mica decat frecventa ceasului sursa.

Vnµ´¶³

Tnµ´¶³

module pulseSyncFq_f2s (clkF_i,resetF_ni,pulseF_i,

clkS_i,resetS_ni,pulseS_o

);

input clkF_i;input resetF_ni;

Page 176: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

166 CAPITOLUL 5. PROBLEME REZOLVATE

input pulseF_i;

input clkS_i;input resetS_ni;output pulseS_o;

// clkF_i | | | | | | | | | | | | | | | | | | | | | | | | | |// pulseF_i __|-|______________________________________________// pulseF_r1 ____|-|____________________________________________// pulseF_r2 ______|-|__________________________________________// pulseF_r3 ________|-|________________________________________// pulseF_r4 __________|-|______________________________________// pulseF_or ____|---------|____________________________________// clkS_i | | | | | |// pulseS_r1 _____|---------------|_____________________________// pulseS_r2 _____________|---------------|_____________________// pulseS_r3 _____________________|---------------|_____________// pulseS_o _____________________________________|-------|_____

reg pulseF_r1;reg pulseF_r2;reg pulseF_r3;reg pulseF_r4;reg pulseF_or;reg pulseS_r1;reg pulseS_r2;reg pulseS_r3;reg pulseS_o;

// intarzie de 4 ori pulsul de pe ceasul sursaalways @(posedge clkF_i) begin

if (~resetF_ni) beginpulseF_r1 <= 1’b0;pulseF_r2 <= 1’b0;pulseF_r3 <= 1’b0;pulseF_r4 <= 1’b0;

endelse begin

pulseF_r1 <= pulseF_i;pulseF_r2 <= pulseF_r1;pulseF_r3 <= pulseF_r2;pulseF_r4 <= pulseF_r3;

endend

// construieste un puls de latime 5 perioade de ceas sursaalways @(posedge clkF_i) begin

Page 177: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

5.6. Sincronizarea semnalelor la trecerea ıntre doua domenii de ceas 167

if (~resetF_ni) beginpulseF_or <= 1’b0;

endelse begin

pulseF_or <= pulseF_i | pulseF_r1 | pulseF_r2 |pulseF_r3 | pulseF_r4;

endend

// preia pulsul pe ceasul de destinatie, cu inca doua intarzierialways @(posedge clkS_i) begin

if (~resetS_ni) beginpulseS_r1 <= 1’b0;pulseS_r2 <= 1’b0;pulseS_r3 <= 1’b0;

endelse begin

pulseS_r1 <= pulseF_or;pulseS_r2 <= pulseS_r1;pulseS_r3 <= pulseS_r2;

endend

// detectie de front negativalways @(posedge clkS_i) begin

if (~resetS_ni) beginpulseS_o <= 1’b0;

endelse begin

pulseS_o <= pulseS_r3 & ~pulseS_r2;end

end

endmodule

Uneori raportul ıntre frecventele de ceas ale celor doua domenii nu este cunoscut ınmomentul proiectarii. Solutia prezentata anterior nu este convenabila daca se ıncearcageneralizarea ei si extinderea domeniului de frecvente. O solutie independenta defrecventa este prezentata ın continuare. Solutia consta ın existenta unui bistabilRS care este setat de catre pulsul din domeniul destinatie si resetat dupa primireaconfirmarii aparitiei pulsului pe domeniul destinatie.

Codul Verilog al circuitului de sincronizare a unui puls la trecerea dintr-un dome-niu de ceas rapid ıntr-un domeniu de ceas mai lent, independent de frecventele de ceas,este prezentat ın continuare. Formele de unda rezultate sunt prezentate ın figura 5.27.Schema rezultata din sinteza este prezentata ın figura 5.28.

Vnµ´¶³

Tnµ´¶³

Page 178: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

168 CAPITOLUL 5. PROBLEME REZOLVATE

Figura 5.25 Formele de unda pentru circuitul de sincronizare a unui puls la trecerea dintr-undomeniu de ceas rapid ıntr-un domeniu de ceas mai lent, dependent de raportul frecventelor.

Figura 5.26 Schema rezultata din sinteza circuitului de sincronizare a unui puls la trecereadintr-un domeniu de ceas rapid ıntr-un domeniu de ceas mai lent, dependent de raportulfrecventelor.

module pulseSync_f2s (clkF_i,resetF_ni,pulseF_i,clkS_i,resetS_ni,pulseS_o

);

input clkF_i;input resetF_ni;input pulseF_i;input clkS_i;input resetS_ni;output pulseS_o;

// clkF_i | | | | | | | | | | | | | | | | | | | | | | | | | |// pulseF_i __|-|______________________________________________// syncPendF ____|---------------|______________________________// clkS_i | | | | | | |// plsS_r1 _________|---------------|_________________________// plsS_r2 _________________|---------------|_________________

Page 179: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

5.6. Sincronizarea semnalelor la trecerea ıntre doua domenii de ceas 169

// pulseS_w _________|-------|_________________________________// pulseS_o _________________|-------|_________________________// syncPendS _________________|---------------|_________________// clrF __________________|---------------|________________// clkF_i | | | | | | | | | | | | | | | | | | | | | | | | | |

reg pulseS_o;reg syncPendS;reg plsS_r1;reg plsS_r2;wire pulseS_w;reg syncPendF;reg clrF;

assign pulseS_w = plsS_r1 & ~plsS_r2;

always @(posedge clkF_i) beginif (~resetF_ni) begin

syncPendF <= 1’b0;clrF <= 1’b0;

endelse begin

clrF <= syncPendS;if (pulseF_i) beginsyncPendF <= 1’b1;

endelse beginif (clrF) begin

syncPendF <= 1’b0;end

endend

end

always @(posedge clkS_i) beginif (~resetS_ni) begin

plsS_r1 <= 1’b0;plsS_r2 <= 1’b0;pulseS_o <= 1’b0;syncPendS <= 1’b0;

endelse begin

plsS_r1 <= syncPendF;plsS_r2 <= plsS_r1;pulseS_o <= pulseS_w;if (~plsS_r1) beginsyncPendS <= 1’b0;

Page 180: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

170 CAPITOLUL 5. PROBLEME REZOLVATE

endelse beginif (pulseS_w) begin

syncPendS <= 1’b1;end

endend

end

endmodule

Figura 5.27 Formele de unda pentru circuitul de sincronizare a unui puls la trecereadintr-un domeniu de ceas rapid ıntr-un domeniu de ceas mai lent, independent de rapor-tul frecventelor.

Figura 5.28 Schema rezultata din sinteza circuitului de sincronizare a unui puls la trecereadintr-un domeniu de ceas rapid ıntr-un domeniu de ceas mai lent, independent de raportulfrecventelor.

5.6.3 Sincronizarea unui puls la trecerea dintr-un domeniu deceas de frecventa scazuta ıntr-un domeniu de ceas defrecventa ridicata

La trecerea unui puls dintr-un domeniu de frecventa lenta ıntr-un domeniu de frecventaridicata latimea pulsului scade. Se poate garanta ca, la esantionarea pulsului pefrecventa de destinatie, pulsul este gasit activ cel putin la o esantionare. In acestcaz, apare ınsa o noua problema: pulsul din domeniul destinatie (efect) poate aparea

Page 181: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

5.6. Sincronizarea semnalelor la trecerea ıntre doua domenii de ceas 171

ınaintea celui din domeniul sursa (cauza). Acest lucru se poate ıntampla daca se uti-lizeaza un circuit simplu de sincronizare pe ceasul de destinatie urmat de un circuitde detectie de front crescator.

Vnµ´¶³

/***** COD NERECOMANDAT *****/module ldSyncBad_s2f (

clkS_i,resetS_ni,ldS_i,clkF_i,resetF_ni,ldF_o

);

input clkS_i;input resetS_ni;input ldS_i;input clkF_i;input resetF_ni;output ldF_o;

// clkS_i | | |// ldS_i _|-----------|____________// clkF_i | | | | | | | | | | | | |// ldF_r1 __|-----------|___________// ldF_r2 ____|-----------|_________// ldF_r3 ______|-----------|_______// ldF_o ______|-|_________________// activ lent ^// activ rapid ^

reg ldF_r1, ldF_r2, ldF_r3;reg ldF_o;

always @(posedge clkF_i) beginif (~resetF_ni) begin

ldF_r1 <= 1’b0;ldF_r2 <= 1’b0;ldF_r3 <= 1’b0;ldF_o <= 1’b0;

endelse begin

ldF_r1 <= ldS_i;ldF_r2 <= ldF_r1;ldF_r3 <= ldF_r2;ldF_o <= ldF_r2 & ~ldF_r3;

Page 182: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

172 CAPITOLUL 5. PROBLEME REZOLVATE

endend

endmodule

Figura 5.29 Formele de unda pentru circuitul nerecomandat de sincronizare a unui puls latrecerea dintr-un domeniu de ceas lent ıntr-un domeniu de ceas mai rapid, independent deraportul frecventelor. Se observa aparitia pulsului activ ın domeniul de destinatie ınainteaactivarii acestuia ın domeniul sursa.

In scopul evitarii aparitiei pulsului efect ınaintea pulsului cauza se recomandaıntarzierea pulsului cu o perioada de ceas ın domeniul sursa si detectarea frontuluicazator al semnalului sincronizat ın domeniul de destinatie.

Codul Verilog al circuitului de sincronizare a unui puls la trecerea dintr-un dome-niu de ceas lent ıntr-un domeniu de ceas mai rapid, independent de frecventele de ceas,este prezentat ın continuare. Formele de unda rezultate sunt prezentate ın figura 5.30.Schema rezultata din sinteza este prezentata ın figura 5.31.

Vnµ´¶³

Tnµ´¶³

module ldSync_s2f (clkS_i,resetS_ni,ldS_i,clkF_i,resetF_ni,ldF_o

);

input clkS_i;input resetS_ni;input ldS_i;input clkF_i;input resetF_ni;output ldF_o;

// clkS_i | | | | |// ldS_i _|-------|________________________// ldS_r _________|-------|________________// clkF_i | | | | | | | | | | | | | | | | |

Page 183: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

5.6. Sincronizarea semnalelor la trecerea ıntre doua domenii de ceas 173

// ldF_r1 __________|-------|______________// ldF_r2 ____________|-------|____________// ldF_r3 ______________|-------|__________// ldF_o ______________________|-|________

reg ldS_r;reg ldF_r1, ldF_r2, ldF_r3;reg ldF_o;

always @(posedge clkS_i) beginif (~resetS_ni) begin

ldS_r <= 1’b0;endelse begin

ldS_r <= ldS_i;end

end

always @(posedge clkF_i) beginif (~resetF_ni) begin

ldF_r1 <= 1’b0;ldF_r2 <= 1’b0;ldF_r3 <= 1’b0;ldF_o <= 1’b0;

endelse begin

ldF_r1 <= ldS_r;ldF_r2 <= ldF_r1;ldF_r3 <= ldF_r2;ldF_o <= ~ldF_r2 & ldF_r3;

endend

endmodule

5.6.4 Aplicatie la sincronizarea unui bus cu variatie lenta

Sincronizarea unui bus nu se poate face identic cu sincronizarea unui singur bit. Sin-cronizarea unui bus prin trecerea fiecarui bit prin circuite dedicate (prezentate ınsectiunea 5.6.1) este total incorecta. Justificarea consta ın faptul ca datorita imposi-bilitatii realizarii identice a bistabilelor, este posibila aparitia ın domeniul de ceas dedestinatie a unei stari inexistente ın domeniul de ceas sursa. De exemplu, un semnalde 2 biti ce comuta ın domeniul sursa ıntre valorile 00 si 11 poate genera ın domeniuldestinatie succesiunea de stari 00, 01, 11.

Solutia propusa consta ın trecerea bus-ului de date ın domeniul destinatie ın mo-mentul ın care exista garantia ca datele sunt stabile ın domeniul sursa. Ideea este de a

Page 184: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

174 CAPITOLUL 5. PROBLEME REZOLVATE

Figura 5.30 Formele de unda pentru circuitul de sincronizare a unui puls la trecereadintr-un domeniu de ceas lent ıntr-un domeniu de ceas mai rapid, independent de rapor-tul frecventelor.

Figura 5.31 Schema rezultata din sinteza circuitului de sincronizare a unui puls la trecereadintr-un domeniu de ceas lent ıntr-un domeniu de ceas mai rapid, independent de raportulfrecventelor.

”intercepta” semnalul de modificare a datelor pe domeniul sursa, de a-l ıntarzia si a-lsincroniza pe ceasul de destinatie (ca un singur bit). Ulterior, acest semnal va deter-mina ıncarcarea datelor din registru de pe ceasul sursa ıntr-un registru din domeniulde ceas de destinatie. Conditia de functionare a acestui circuit este ca bus-ul sa fiemodificat rar, nu mai des de odata la trei perioade de ceas sursa (lent).

Figura 5.32 prezinta schema de principiu a sincronizarii unui bus la trecerea ıntredoua domenii de ceas.

5.6.5 Aplicatie la sincronizarea unui bus cu variatie rapida(FIFO)

Solutia prezentata ın sectiunea 5.6.4 nu poate fi folosita la transferul rapid al datelorıntre doua domenii de ceas datorita faptului ca datele trebuie mentinute ıntr-un re-gistru ın domeniul sursa mai mult de un tact. Presupunand ca datele se modificala sursa pe fiecare tact, solutia prezentata nu poate fi folosita. Totusi, este evidentca, din punct de vedere al ratei de transfer, nu este nici o problema ca datele ce vincontinuu pe o frecventa lenta sa fie transferate fara pierderi ıntr-un domeniu de ceasde frecventa mai mare.

In acest caz solutia consta ın folosirea unei memorii FIFO (First-In-First-Out)asincrona, ”dual-clock”: scrierea si citirea se fac pe ceasuri de frecvente diferite.Principiul consta ın stocarea datelor ın memoria FIFO pe ceasul domeniului sursasi citirea acestora pe ceasul domeniului destinatie. Datorita faptului ca frecventade scriere este mai mare decat cea de citire, se pot ıntampla cazuri ca memoriasa se goleasca. Presupunand un flux continuu la intrare, fluxul de iesire din FIFO

Page 185: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

5.6. Sincronizarea semnalelor la trecerea ıntre doua domenii de ceas 175

LD

D Q

date pe

ceasrapid

circuit sincronizare bit

LD

D Q

ceas lent (domeniu sursa)ceas rapid (domeniu destinatie)

comandaincarcaredate pe ceaslent

rapiddate pe ceasincarcarecomanda

lentceaspe

date

(ldSync_s2f)

Figura 5.32 Schema de principiu a sincronizarii unui bus la trecerea ıntre doua domenii deceas.

va avea momente cand va fi ıntrerupt. In functie de raportul celor doua frecvente,ıntreruperile din fluxul de date vor fi mai dese sau mai rare. In orice caz, va trebuigenerat un semnal care sa marcheze ın domeniul destinatie daca datele sunt sau nuvalide. Care este adancimea necesara pentru memoria FIFO? Teoretic, doua locatiisunt suficiente. In acest caz datele trebuie citite din FIFO ıntr-un interval de operioada de ceas lent din momentul ın care datele au fost scrise ın FIFO. La frecventeapropiate adancimea de doua niveluri se dovedeste a fi riscanta. Riscul ıl reprezintaneındeplinirea timpilor de setup si hold la primul registrul din domeniul destinatie. Sapresupunem o adancime de 4 locatii. In continuare se prezinta o rezolvare a problemeicu o memorie FIFO implementata cu registre.

Sunt necesare 4 registre pentru stocarea datelor si doua numaratoare de adrese:un numarator pentru adresa de scriere incrementat pe ceasul de scriere (sursa) si unnumarator al adresei de citire incrementat pe ceasul de citire (destinatie). Fiecaredin cele doua numaratoare au cate 2 biti si numara doar ın sens crescator ın modcircular. Numaratorul adresei de citire este incrementat la fiecare front de ceas sursasau ori de cate ori datele de intrare sunt validate (cazul extrem este cand datele deintrare sunt validate continuu). Simultan, un bistabil T ısi comuta starea. Iesireabistabilului T este un semnal care comuta la fiecare front activ al ceasului sursa.Acest semnal de un bit este sincronizat pe ceasul destinatie prin trecerea prin douabistabile. Detectand ambele fronturi ale acestui semnal se obtine un set de impulsuri(pe ceasul destinatie) care sunt asociate fiecarei scrieri ın memoria FIFO. Acest trende impulsuri incrementeaza un numarator al locatiilor pline (scrise si necitite) pedomeniul de ceas destinatie. Daca acest numarator are valoarea 2, se decide lansareaunei citiri. La fiecare citire, numaratorul de locatii se decrementeaza. In mod normal,dupa catva timp, numaratorul de locatii va oscila ıntre valorile 1 si 2. Numaratorul delocatii are posibilitatea de a numara atat ın sens crescator, cat si ın sens descrescator.In cazul ın care ambele comenzi sunt activate simultan, numaratorul ısi pastreazastarea (o scriere la o adresa si o citire de la alta adresa au avut loc simultan).

De remarcat ca, ın acest fel, chiar daca actiunile de scriere si citire asincrone potfi apropiate ın timp, adresele la care au loc acestea sunt la interval de cel putin doua

Page 186: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

176 CAPITOLUL 5. PROBLEME REZOLVATE

locatii. Se asigura astfel stabilitatea datelor ın momentul trecerii acestora pe ceasulde destinatie.

Figura 5.33 prezinta schema de principiu a sincronizarii datelor cu memorie FIFOimplementata cu registre.

D Q

D

D

D

Q

Q

Q

LD

LD

LD

LD

0

1

2

3

df1

df0

df2

df3

CU CU

data_i

Registru de stocare a datelor (FIFO)

Registru date

pe domeniu destinatie

2 2

valid_i

Numaratoradrese citire

0

3

2

1 data_o

LD

valid_o

Numarator locatii

T

detectare de fronturi

sincronizare

=2

2

CU

CD

ckSrc_i

ckSrc_i

Numaratoradrese scriere

wrAddr rdAddr

ckDst

numLoc

ckDst_i

ckSrc

Figura 5.33 Schema de principiu a sincronizarii datelor cu memorie FIFO implementatacu registre.

Se remarca faptul ca sincronizarea semnalului valid_i implica o ıntarziere ıntremomentul cand datele sunt scrise si momentul cand datele sunt citite. Intre acestedoua momente datele se afla ın FIFO. Presupunand un flux continuu de date deintrare, rezulta o limitare legata de raportul frecventelor ceasurilor sursa si destinatie.Pentru ca circuitul sa functioneze corect pana la un raport de frecvente sursa/des-tinatie aproximativ unitar, ar trebui crescuta adancimea FIFO. Folosind mediul detestare existent pe pagina de web a cartii se poate determina exact valoarea maximaa raportului de frecvente pana la care circuitul prezentat functioneaza corect.

Vnµ´¶³

Tnµ´¶³

Codul Verilog ce modeleaza circuitul FIFO este prezentat ıncontinuare. Mediul de testare se afla pe situl cartii.

module dataSync(ckSrc_i, // ceas de frecventa scazuta, domeniul sursarstSrc_ni,data_i, // date de intrare, pe ceasul sursavalid_i, // validarea datelor de intrare,

// poate fi activ (1) tot timpulckDst_i, // ceas de frecventa ridicata, domeniul destinatie

Page 187: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

5.6. Sincronizarea semnalelor la trecerea ıntre doua domenii de ceas 177

rstDst_ni,data_o, // date de iesire, pe ceasul destinatievalid_o // validarea datelor la iesire

);

parameter dataWidth = 32;

input ckSrc_i;input rstSrc_ni;input[dataWidth-1:0] data_i;input valid_i;input ckDst_i;input rstDst_ni;output[dataWidth-1:0] data_o;output valid_o;

reg[dataWidth-1:0] data_o;reg valid_o;

reg[dataWidth-1:0] df0;reg[dataWidth-1:0] df1;reg[dataWidth-1:0] df2;reg[dataWidth-1:0] df3;

reg[1:0] wrAddr;reg[1:0] rdAddr;reg[1:0] numLoc;reg validInT;reg[2:0] validInDst;wire numLocEq2;

// registre care modeleaza cele 4 locatii ale FIFOalways @(posedge ckSrc_i)if (~rstSrc_ni) begin

df0 <= ’h0;df1 <= ’h0;df2 <= ’h0;df3 <= ’h0;

endelse begin

if (valid_i && (wrAddr == 2’d0)) begindf0 <= data_i;

endif (valid_i && (wrAddr == 2’d1)) begin

df1 <= data_i;endif (valid_i && (wrAddr == 2’d2)) begin

Page 188: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

178 CAPITOLUL 5. PROBLEME REZOLVATE

df2 <= data_i;endif (valid_i && (wrAddr == 2’d3)) begin

df3 <= data_i;end

end

// adresa de scriere (pe ceasul domeniului sursa)always @(posedge ckSrc_i)if (~rstSrc_ni) begin

wrAddr <= 2’b00;endelse begin

if (valid_i) beginwrAddr <= wrAddr + 1;

endend

// complementare daca valid_i=1, pentru sincronizarealways @(posedge ckSrc_i)if (~rstSrc_ni) begin

validInT <= 1’b0;endelse begin

if (valid_i) beginvalidInT <= ~validInT;

endend

// sincronizare semnal valid_ialways @(posedge ckDst_i)if (~rstDst_ni) begin

validInDst <= 3’b0;endelse begin

validInDst <= {validInDst[1:0], validInT};end

// adresa de citire (pe ceasul domeniului destinatie)always @(posedge ckDst_i)if (~rstDst_ni) begin

rdAddr <= 2’b0;endelse begin

if (numLocEq2) beginrdAddr <= rdAddr + 1;

end

Page 189: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

5.6. Sincronizarea semnalelor la trecerea ıntre doua domenii de ceas 179

end

assign numLocEq2 = (numLoc == 2’d2);

// numarator al locatiilor "pline" din FIFOwire cuNumLoc = validInDst[2] ^ validInDst[1];wire cdNumLoc = numLocEq2;always @(posedge ckDst_i)if (~rstDst_ni) begin

numLoc <= 2’b00;endelse begin

case ({cuNumLoc, cdNumLoc})2’b10: numLoc <= numLoc + 1;2’b01: numLoc <= numLoc - 1;endcase

end

// registru de iesire pentru datealways @(posedge ckDst_i)if (~rstDst_ni) begin

data_o <= ’h0;endelse begin

if (numLocEq2) begincase (rdAddr)2’d0: data_o <= df0;2’d1: data_o <= df1;2’d2: data_o <= df2;default: data_o <= df3;endcase

endend

// semnal de validare a datelor la iesirealways @(posedge ckDst_i)if (~rstDst_ni) begin

valid_o <= 1’b0;endelse begin

valid_o <= numLocEq2;end

endmodule

Figura 5.34 prezinta cateva forme de unda relevante pentru descrierea circuituluide sincronizare a datelor.

Figura 5.35 prezinta structura rezultata ın urma sintezei circuitului de sincronizare

Page 190: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

180 CAPITOLUL 5. PROBLEME REZOLVATE

Figura 5.34 Forme de unda ale circuitului de sincronizare a datelor cu memorie FIFOimplementata cu registre.

Page 191: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

5.7. Interfatarea cu CPU 181

a datelor implementat cu FIFO.

5.7 Interfatarea cu CPU

Acest paragraf prezinta proiectarea si modelul Verilog al unui bloc de interfatare aunui controller de memorie (denumit ın continuare sdramCntrl) cu un microcontroller(denumit ın continuare CPU). Se presupune ca sistemul (sdramCntrl) este vizibil ınspatiul de adrese al microcontrollerului (CPU).

Protocolul de accesare a registrelor de catre CPU este prezentat ın figura 5.36.Semnalul cpuRq_i informeaza un modul ca o noua tranzactie este ceruta de catreCPU. Tipul tranzactiei este determinat de cpuRdWr_ni (0 semnifica scriere, 1 sem-nifica citire). Accesul este confirmat de catre sdramCntrl prin activarea semnaluluicpuAck_o pentru un tact.

Setul de registre de configurare si a accesului CPU la memorie este descris ıntabelul 5.2.

Registru Adresa DescriereCONFIG_REG 0x00 Registru de configurare, semnificatie pe bitRDWR_CMD 0x04 Registru de comanda, semnificatie pe bitMSB_ADDR_REG 0x08 MSB adresaLSB_ADDR_REG 0x10 LSB adresaWRITE_DATA_REG 0x20 Registru de date scrise ın SDRAMREAD_DATA_REG 0x30 Registru de date citite din SDRAM

Tabelul 5.2Descrierea setului de registre de configurare si a accesului CPU lamemorie.

CONFIG_REG (0x0)15:8 frecv: frecventa (exprimata ın MHz)7 nefolosit6:4 burstSize: dimensiune burst3 sdramCntrlEn: pornire sdramCntrl2:0 casLatency: latenta CAS

RDWR_REG (0x4)15:9 nefolositi8 rdCmd: comanda de citire (activa high)7:1 nefolositi0 wrCmd: comanda de scriere (activa high)

MSB_ADDR_REG (0x8)15:9 nefolositi8:0 msbAddr: adresa de acces a memoriei[24:16]

Page 192: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

182 CAPITOLUL 5. PROBLEME REZOLVATE

Figura 5.35 Circuitul de sincronizare a datelor cu FIFO - schema rezultata din sinteza.

Page 193: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

5.7. Interfatarea cu CPU 183

Figura 5.36 Operatii de citire/scriere ıntre CPU si un registru intern al sdramCntrl.

LSB_ADDR_REG (0x10)15:0 lsbAddr: adresa de acces a memoriei[15:0]

WRITE_DATA_REG (0x20)15:0 wrData: data ce urmeaza a fi scrisa ın SDRAM

READ_DATA_REG (0x30)15:0 rdData: data ce a fost citita din SDRAM

Registrul CONFIG_REG contine biti folositi pentru controlul software al configurariisdramCntrl. Controllerul lanseaza spre SDRAM secventa de initializare daca bitulsdramCntrlEn comuta din 0 ın 1. In acel moment se esantioneaza datele necesare con-figurarii SDRAM: burstSize, casLatency. Frecventa de lucru, frecv, este transmisablocului de control al sdramCntrl ın scopul determinarii momentelor de timp candeste necesara lansarea unei comenzi de refresh.

Registrul RDWR_REG contine 2 biti care comanda accesul CPU la memorie. DacaCPU seteaza bitul wrCmd, sdramCntrl lanseaza o cerere de scriere ın SDRAM laadresa {msbAddr, lsbAddr} a datelor wrData. La terminarea actiunii bitul wrCmdeste resetat automat iar adresa {msbAddr, lsbAddr} este incrementata.

Daca CPU seteaza bitul rdCmd, sdramCntrl lanseaza o cerere de citire din SDRAMde la adresa {msbAddr, lsbAddr}.

Datele citite se stocheaza ın registrul READ_DATA_REG. La terminarea actiunii, bitulrdCmd este resetat automat iar adresa {msbAddr, lsbAddr} este incrementata.

Tabelul 5.3 prezinta descrierea interfetei modulului proiectat.Figura 5.37 prezinta detaliile de implementare a instantierii registrelor si a modu-

lui de scriere a acestora de catre CPU. Se observa ca o scriere are loc doar ın cazulın care semnalele de control selecteaza dispozitivul curent (cpuCs_ni=0) si exista ocerere (cpuRq_i=1) iar cererea este de scriere (cpuRdWr_i=0). Rezulta ca raspunsulla ıntrebarea ”cand se scrie?” este ”atunci cand doWr=1”. Din figura se observa casemnalul doWr valideaza un demultiplexor pe al carui port de selectie intra adresaCPU (cpuAddr_i). Iesirile demultiplexorului reprezinta semnalele de ıncarcare aso-ciate fiecarui registru ın parte. Rezulta ca raspunsul la ıntrebarea ”unde se scriu

Page 194: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

184 CAPITOLUL 5. PROBLEME REZOLVATE

Port DescrierecpuClk_i semnal de ceas al CPUcpuReset_ni semnal de reset al CPU, activ ın 0cpuCs_ni selectare dispozitiv, activ ın 0cpuAddr_i[9:0] adresa CPUcpuRdWr_ni tipul comenzii CPU (0=citire, 1=scriere)cpuData_o[15:0] data de iesire spre CPU (folosita la citire)cpuData_i[15:0] data de intrare de la CPU (folosita la scriere)cpuRq_i cerere de la CPUcpuAck_o confirmare cerere de la CPUsysClk_i semnal de ceas, utilizat de restul sistemului,

frecventa mai ridicata decat cpuClk_isysReset_ni semnal de reset activ ın 0sysFrecv_o[7:0] frecventa (exprimata ın MHz)sysBurstSize_o[2:0] dimensiune burstsysSdramCntrlEn_o validare pornire sdramCntrlsysCasLatency_o latenta CASsysRdRq_o comanda de citire din memoriesysWrRq_o comanda de scriere ın memoriesysAck_i confirmare a comenzii de la sistemsysAddr_o[24:0] adresa de acces a memorieisysWrData_o[15:0] data ce urmeaza a fi scrisa ın SDRAMsysRdData_i[15:0] data ce a fost citita din SDRAM

Tabelul 5.3Porturile modulului de interfatare cu CPU.

datele?” este ”ın registrul care a fost validat prin aplicarea adresei lui pe cpuAddr_i”.Raspunsul la ıntrebarea ”ce date se scriu ın registrul selectat” este ”datele provenitede la CPU pe magistrala corespunzatoare cpuData_i”.

Figura 5.38 prezinta detaliile de implementare a citirii registrelor si generareasemnalului de confirmare cpuAck_o. Continutul registrelor se multiplexeaza pe bazaadresei de citire primite de la CPU. Datele se genereaza tot timpul dar se valideaza(cpuAck_o) doar ın conditiile ın care se cere o operatie de citire (cpuCs_ni=0,cpuRq_i=1 iar cpuRdWr_i=1).

Fiecare registru prezinta particularitati de interfatare cu restul sistemului carefunctioneaza pe un ceas asincron fata de CPU (sysClk_i). Solutiile de sincronizaresunt adaptate fiecarui caz ın parte.

Registrul CONFIG_REG contine date de configurare. In mod normal, acestea suntscrise o singura data, ulterior ramanand constante. Strategia abordata ın acest caz,prezentata ın figura 5.39, consta ın sincronizarea semnalului de ıncarcare a registrului(ld0) si trecerea datelor ulterior pe ceasul sysClk_i.

Registrul RDWR_REG contine doi biti care, daca sunt setati prin scriere de catreCPU, determina generarea unor cereri de acces la memoria controlata de restul sis-

Page 195: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

5.7. Interfatarea cu CPU 185

ld30015

16rdData

READ_DATA_REG (0X30)

ld20015

10

cpuData_i

wrDataWRITE_DATA_REG (0X20)

ld1015

16

cpuData_i

lsbAddrLSB_ADDR_REG (0X10)

ld808

9

cpuData_i

msbAddrMSB_ADDR_REG (0X08)

8

wrCmd

rdCmd

RDWR_REG (0X04)

cpuData_i

cpuCs_ni

cpuRdw_ni

cpuRq_i

cpuAddr_i

doWr

ld002346815

0

0

3

3

10

sdramCntrlEn

frecvburstSize

CONFIG_REG (0X00)

#00

#08

#10

#20

#30

casLatency

#04ld4

Figura 5.37 Detalii de implementare a instantierii registrelor si a modului de scriere aacestora. Toate scrierile se fac sincron pe cpuClk i.

temului. Cererile sunt lansate prin porturile de iesire sysRdRq_o si sysWrRq_o sin-cron pe sysClk_i. Bitii registrului RDWR_REG sunt monitorizati prin interogare decatre CPU pentru a se cunoaste daca actiunea curenta a fost sau nu ıncheiata. Laaparitia confirmarii din partea sistemului (sysAck_i) trebuie sa se reseteze cererea(sysRdRq_o sau sysWrRq_o). Totodata, trebuie transmisa informatia de actualizarea starii bitilor rdCmd si wrCmd aflati pe ceasul cpuClk_i. Circuitul prezentat ın figura5.40 sincronizeaza comenzile de cerere si confirmare la trecerea domeniilor de ceas ınambele sensuri.

Registrele MSB_ADDR_REG, LSB_ADDR_REG si WRITE_DATA_REG pot fi considerateconstante ın momentul citirii acestora pe ceasul sysClk_i, cu conditia ca ın softwaresa se respecte ipotezele de proiectare referitoare la succesiunea operatiilor:

• Scriere:

– scriere MSB_ADDR_REG;

– scriere LSB_ADDR_REG;

– scriere WRITE_DATA_REG;

– scriere RDWR_REG cu valoare 0x0001H;

– citire RDWR_REG, daca este egal cu 0x0000H, atunci operatia de scriere seconsidera ıncheiata.

• Citire:

– scriere MSB_ADDR_REG;

– scriere LSB_ADDR_REG;

– scriere RDWR_REG cu valoare 0x0100H;

Page 196: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

186 CAPITOLUL 5. PROBLEME REZOLVATE

D Q

cpuClk_i

cpuCs_ni

cpuRdw_ni

cpuRq_i

doRd

doW

D QcpuAck_o

D Q cpuData_o

cpuAddr_i

16

16

16

16

10

9

7

7

8

3

3

16

16

16

16

sdramCntrlEncasLatency

frecv

wrCmd

rdCmd

msbAddr

lsbAddr

wrData

rdData

1’b0

7’b0

7’b0

7’b0

16’DEAD

burstSize

data0

data4

data8

data10

data20

data30

#00

#04

#08

#10

#20

#30

*

Figura 5.38 Detalii de implementare a citirii registrelor si de generare a confirmarii.

Page 197: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

5.7. Interfatarea cu CPU 187

sysCasLatency_o

sysSdramCntrl_o

sysBurstSize_o

sysFrecv_o

3

3

3

3

8

3

casLatency

sdramCntrlEn

frecv

ld0 ld0Sys

CONFIG_REG (0X00)

ldSync_s2f

burstSize

Figura 5.39 Sincronizarea CONFIG REG.

– citire RDWR_REG, daca este egal cu 0x0000H, atunci operatia de citire seconsidera ıncheiata;

– citire date din READ_DATA_REG.

Registrul READ_DATA_REG are un regim particular. Teoretic, CPU nu are motivesa scrie acest registru. Din motive de depanare, s-a permis totusi scrierea acestuiade catre CPU. Insa, READ_DATA_REG trebuie scris ca urmare a ıncheierii operatieide citire din memorie cu datele provenite de la portul sysRdData_i. Apare o pro-blema de sincronizare a unui bus de date: datele de intrare sysRdData_i sosesc peceasul sysClk_i si trebuie citite din READ_DATA_REG pe ceasul cpuClk_i. Ideea desincronizare consta ın ınscrierea datelor ıntr-un registru temporar ın momentul con-firmarii operatiei de citire (sysRdRq_o=1 si sysAck_i=1). Ulterior, conditia de citire(de pe ceasul sysClk_i) este sincronizata pe ceasul cpuClk_i. Dupa sincronizareaconditiei, datele din registrul temporar se ıncarca ın registrul READ_DATA_REG de undeurmeaza a fi preluate de catre CPU. Figura 5.41 prezinta circuitul de sincronizare aso-ciat registrului READ_DATA_REG. Se observa ca acest registru poate fi scris din douasurse: CPU si restul sistemului.

Modelul Verilog are interfata descrisa ın tabelul 5.3 si comportamentul prezentatın figurile 5.37, 5.38, 5.39, 5.40 si 5.41.

Vnµ´¶³

‘include "cpuIntfAddr.h"

module cpuIntf(// Interfata cpucpuClk_i, // semnal de ceas al CPUcpuReset_ni, // semnal de reset al CPU, activ in 0

Page 198: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

188 CAPITOLUL 5. PROBLEME REZOLVATE

sincroclkSys

pulseSync_f2s

RLDld4

R

S

D

sysAck_i

crescatordetectare front set (cpu)

reset (sistem)

sysRdRq_ordCmd

cpuData_i[8]

wrCmd

sincroclkSys

pulseSync_f2s

RLDld4

cpuData_i[0]

R

S

D

sysAck_i

crescatordetectare front set (cpu)

reset (sistem)

sysWrRq_o

Figura 5.40 Sincronizarea RDWR REG.

cpuCs_ni, // selectare dispozitiv activ in 0cpuAddr_i, // adresa CPUcpuRdWr_ni, // tipul comenzii CPU (0=citire, 1=scriere)cpuData_o, // data de iesire spre CPU (folosita la citire)cpuData_i, // data de intrare de la CPU (folosita la scriere)cpuRq_i, // cerere de la CPUcpuAck_o, // confirmare cerere de la CPU// Interfata syssysClk_i, // semnal de ceas utilizat de restul sistemului

//(frecventa mai ridicata decat cpuClk_i)sysReset_ni, // semnal de reset activ in zerosysCasLatency_o, // latenta CASsysSdramCntrlEn_o,// validare pornire sdramCntrlsysBurstSize_o, // dimensiune burstsysFrecv_o, // frecventa exprimata in MHzsysAddr_o, // adresa de acces la memoriesysWrData_o, // data ce urmeaza a fi scrisa in SDRAMsysWrRq_o, // comanda de scriere in memoriesysRdData_i, // data ce a fost citita din SDRAMsysRdRq_o, // comanda de citire din memoriesysAck_i // confirmare a comenzii de la sistem

);

Page 199: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

5.7. Interfatarea cu CPU 189

sysAck_i

sysRdData_i

sysRdRq_o

LD

pulseSync_f2s

16 rdData

ld30

cpuData_i 16

ldCpu Dcpu ldSys Dsys

Figura 5.41 Sincronizarea READ DATA REG.

// Interfata CPUinput cpuClk_i;input cpuReset_ni;input cpuCs_ni;input[9:0] cpuAddr_i;input cpuRdWr_ni;output[15:0] cpuData_o;input[15:0] cpuData_i;input cpuRq_i;output cpuAck_o;

// Interfata sysinput sysClk_i;input sysReset_ni;output[2:0] sysCasLatency_o;output sysSdramCntrlEn_o;output[2:0] sysBurstSize_o;output[7:0] sysFrecv_o;output[24:0] sysAddr_o;output[15:0] sysWrData_o;output sysWrRq_o;input[15:0] sysRdData_i;output sysRdRq_o;input sysAck_i;

reg[15:0] cpuData_o;reg cpuAck_o;

reg[2:0] sysCasLatency_o;reg sysSdramCntrlEn_o;reg[2:0] sysBurstSize_o;

Page 200: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

190 CAPITOLUL 5. PROBLEME REZOLVATE

reg[7:0] sysFrecv_o;reg[24:0] sysAddr_o;reg[15:0] sysWrData_o;reg sysWrRq_o;

reg[2:0] casLatency;reg sdramCntrlEn;reg[2:0] burstSize;reg[7:0] frecv;reg wrCmd;reg rdCmd;reg[8:0] msbAddr;reg[15:0] lsbAddr;reg[15:0] wrData;reg[15:0] rdData;wire doRd;reg doRd_r;reg[3:0] sysWrCmd_r;reg[3:0] sysRdCmd_r;reg sysRdRq_o;reg[15:0] sysRdData_r;

wire doWr;wire ld0;wire ld4;wire ld8;wire ld10;wire ld20;wire ld30;wire ldSys_f;wire ldSys_s;wire cpuAck;

// semnal care valideaza o scriereassign doWr = ~cpuCs_ni & ~cpuRdWr_ni & cpuRq_i;

// CONFIG_REG 0x00 ***************************************// semnal de incarcare pentru registrii de la adresa ‘CONFIG_REGassign ld0 = (doWr & (cpuAddr_i == ‘CONFIG_REG));

// registrul pe cpuClk_ialways @(posedge cpuClk_i) begin

if (!cpuReset_ni) begin{frecv, burstSize, sdramCntrlEn, casLatency} <= 15’b0;

endelse begin

if (ld0) begin

Page 201: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

5.7. Interfatarea cu CPU 191

{frecv, burstSize, sdramCntrlEn, casLatency} <={cpuData_i[15:8], cpuData_i[6:0]};

endend

end

// sincronizarea semnalului ld0 pe domeniul// de ceas mai rapid (sysClk_i)ldSync_s2f i_config_reg(

.clkS_i (cpuClk_i ),

.resetS_ni (cpuReset_ni ),

.ldS_i (ld0 ),

.clkF_i (sysClk_i ),

.resetF_ni (sysReset_ni ),

.ldF_o (ld0Sys ));

// registrul CONFIG_REG sincronizat pe domeniul// de ceas mai rapid (sysClk_i)always @(posedge sysClk_i) begin

if (!sysReset_ni) begin{sysFrecv_o, sysBurstSize_o, sysSdramCntrlEn_o, sysCasLatency_o}

<= 15’b0;endelse begin

if (ld0Sys) begin{sysFrecv_o, sysBurstSize_o, sysSdramCntrlEn_o, sysCasLatency_o}

<= {frecv, burstSize, sdramCntrlEn, casLatency};end

endend

// RDWR_REG 0x04 ***************************************// semnal de incarcare pentru registrii de la adresa ‘RDWR_REGassign ld4 = (doWr & (cpuAddr_i == ‘RDWR_REG));

// registrul pe cpuClk_ialways @(posedge cpuClk_i) begin

if (!cpuReset_ni) beginwrCmd <= 1’b0;rdCmd <= 1’b0;

endelse begin

if (ld4) beginrdCmd <= cpuData_i[8];wrCmd <= cpuData_i[0];

end

Page 202: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

192 CAPITOLUL 5. PROBLEME REZOLVATE

else beginif (cpuAck) begin

wrCmd <= 1’b0;rdCmd <= 1’b0;

endend

endend

// sincronizare comanda de scriere pe domeniul// de ceas mai rapid (sysClk_i)always @(posedge sysClk_i) begin

if (!sysReset_ni) beginsysWrCmd_r <= 4’b0;

endelse begin

sysWrCmd_r <={~sysWrCmd_r[2] & sysWrCmd_r[1], sysWrCmd_r[1:0], wrCmd};

endend

// implementarea comenzii de scriere pe ceasul rapidalways @(posedge sysClk_i) begin

if (!sysReset_ni) beginsysWrRq_o <= 1’b0;

endelse begin

if (sysWrCmd_r[3]) beginsysWrRq_o <= 1’b1;

endelse beginif (sysAck_i) begin

sysWrRq_o <= 1’b0;end

endend

end

// sincronizare comanda de citire pe domeniul// de ceas mai rapid (sysClk_i)always @(posedge sysClk_i) begin

if (!sysReset_ni) beginsysRdCmd_r <= 4’b0;

endelse begin

sysRdCmd_r <={~sysRdCmd_r[2] & sysRdCmd_r[1], sysRdCmd_r[1:0], rdCmd};

Page 203: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

5.7. Interfatarea cu CPU 193

endend

// implementarea comenzii de citire pe ceasul rapidalways @(posedge sysClk_i) begin

if (!sysReset_ni) beginsysRdRq_o <= 1’b0;

endelse begin

if (sysRdCmd_r[3]) beginsysRdRq_o <= 1’b1;

endelse beginif (sysAck_i) begin

sysRdRq_o <= 1’b0;end

endend

end

// sincronizarea confirmarii a comenzii de la sistem// pe domeniul de ceas mai lent (cpuClk_i)pulseSync_f2s i_rdwr_reg(

.clkF_i (sysClk_i ),

.resetF_ni (sysReset_ni ),

.pulseF_i (sysAck_i ),

.clkS_i (cpuClk_i ),

.resetS_ni (cpuReset_ni ),

.pulseS_o (cpuAck ));

// MSB_ADDR_REG 0x08 ***************************************// semnal de incarcare pentru registrii de la adresa ‘MSB_ADDR_REGassign ld8 = (doWr & (cpuAddr_i == ‘MSB_ADDR_REG));

// registrul pe cpuClk_ialways @(posedge cpuClk_i) begin

if (!cpuReset_ni) beginmsbAddr <= 9’b0;

endelse begin

if (ld8) beginmsbAddr <= cpuData_i[8:0];

endend

end

Page 204: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

194 CAPITOLUL 5. PROBLEME REZOLVATE

// LSB_ADDR_REG 0x10 ***************************************// semnal de incarcare pentru registrii de la adresa ‘LSB_ADDR_REGassign ld10 = doWr & (cpuAddr_i == ‘LSB_ADDR_REG);

// registrul care memoreaza adresa de acces la memorie (LSB)always @(posedge cpuClk_i) begin

if (!cpuReset_ni) beginlsbAddr <= 1’b0;

endelse begin

if (ld10) beginlsbAddr <= cpuData_i;

endend

end

// registrul care memoreaza adresa de acces la memorie (MSB)// pe domeniul de ceas mai rapid (sysClk_i)always @(posedge sysClk_i) begin

if (!sysReset_ni) beginsysAddr_o <= 25’b0;sysWrData_o <= 16’b0;

endelse begin

if (sysWrCmd_r[3] || sysRdCmd_r[3]) beginsysAddr_o <= {msbAddr, lsbAddr};sysWrData_o <= wrData;

endend

end

// WRITE_DATA_REG 0x20 ***************************************// semnal de incarcare pentru registrii de la adresa ‘WRITE_DATA_REGassign ld20 = doWr & (cpuAddr_i == ‘WRITE_DATA_REG);

// registrul care memoreaza datele ce urmeaza a fi scrise in memoriealways @(posedge cpuClk_i) begin

if (!cpuReset_ni) beginwrData <= 1’b0;

endelse begin

if (ld20) beginwrData <= cpuData_i;

endend

end

Page 205: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

5.7. Interfatarea cu CPU 195

// READ_DATA_REG 0x30 ***************************************// semnal de incarcare pentru registrii de la adresa ‘READ_DATA_REGassign ld30 = doWr & (cpuAddr_i == ‘READ_DATA_REG);

// semnal de incarcare pentru registrul ce va contine// datele citite de la memoria SDRAMassign ldSys_f = sysAck_i & sysRdRq_o;

// registrul ce va contine// datele citite de la memoria SDRAMalways @(posedge sysClk_i) begin

if (!sysReset_ni) beginsysRdData_r <= 16’b0;

endelse begin

if (ldSys_f) beginsysRdData_r <= sysRdData_i;

endend

end

// registrul care memoreaza datele care au fost citite din memoriealways @(posedge cpuClk_i) begin

if (!cpuReset_ni) beginrdData <= 16’b0;

endelse begin

if (ldSys_s) beginrdData <= sysRdData_r;

endelse beginif (ld30) begin

rdData <= cpuData_i;end

endend

end

// sincronizarea semnalului de incarcare ldSys_f// pe domeniul de ceas mai lent (cpuClk_i)pulseSync_f2s i_read_data_reg(

.clkF_i (sysClk_i ),

.resetF_ni (sysReset_ni ),

.pulseF_i (ldSys_f ),

.clkS_i (cpuClk_i ),

.resetS_ni (cpuReset_ni ),

Page 206: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

196 CAPITOLUL 5. PROBLEME REZOLVATE

.pulseS_o (ldSys_s ));

// citirea registrilor de catre CPU// semnal care valideaza o citireassign doRd = ~cpuCs_ni & cpuRdWr_ni & cpuRq_i;

always @(posedge cpuClk_i) beginif (!cpuReset_ni) begin

doRd_r <= 1’b0;endelse begin

doRd_r <= doRd;end

end

always @(posedge cpuClk_i) beginif (!cpuReset_ni) begin

cpuData_o <= 16’b0;endelse begin

case (cpuAddr_i)‘CONFIG_REG : cpuData_o <= {frecv, 1’b0, burstSize,

sdramCntrlEn, casLatency};‘RDWR_REG : cpuData_o <= {7’b0, rdCmd, 7’b0, wrCmd};‘MSB_ADDR_REG : cpuData_o <= {7’b0, msbAddr};‘LSB_ADDR_REG : cpuData_o <= lsbAddr;‘WRITE_DATA_REG : cpuData_o <= wrData;‘READ_DATA_REG : cpuData_o <= rdData;default : cpuData_o <= 16’hDEAD;endcase

endend

// registrul care memoreaza confirmarea de la CPUalways @(posedge cpuClk_i) begin

if (!cpuReset_ni) begincpuAck_o <= 1’b0;

endelse begin

cpuAck_o <= doWr | doRd;end

end

endmodule

Mediul de testare contine pe langa modulul proiectat o instantiere a unui modulce modeleaza comportamentul CPU si o instantiere aunui modul ce modeleaza com-

Page 207: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

5.8. Multiplicator secvential 197

portamentul restului sistemului, sdramCntrl. Reprezentarea grafica a mediului detestare este prezentata ın figura 5.42 iar codul Verilog se afla ın ıntregime pe situlcartii.

Tnµ´¶³

CPU este modelata sub forma unor task-uri de citire si de scriere registre.Aceste task-uri sunt apelate fie explicit, fie ın mod aleatoriu. Modelul controlleruluide memorie este modelat sub forma unui tabel bidimensional care mentine o copie adatelor si furnizeaza semnale de validare a cererilor la un interval de timp aleatoriu.

cpuIntf

tstCpuIntf

cpuDummy sdramCntrlDummy

Figura 5.42 Mediu de testare pentru interfata CPU.

5.8 Multiplicator secvential

Un sistem digital complex poate fi structurat ın doua componente principale:

• cale de date si

• cale de control.

Automatele constituie calea de control ın cadrul circuitelor digitale asigurand semnalede comanda si control caii de date.

Acest paragraf prezinta proiectarea unui multiplicator secvential, structurat ıncale de date si cale de control. In figura 5.43 este prezentata schema bloc a unuimultiplicator secvential ce foloseste metoda adunarilor repetate. Pentru simplificareaschemei nu au fost reprezentate semnalele de ceas si reset prezente la intrarea tuturorregistrelor.

Modelul Verilog asociat multiplicatorului prezinta un model de nivel ınalt, struc-tural, care instantiaza alte doua module asociate caii de date si caii de control.

Vnµ´¶³

Tnµ´¶³

module mult (ck,reset_ni,start_i,opA_i,opB_i,

Page 208: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

198 CAPITOLUL 5. PROBLEME REZOLVATE

rezValid_o

CLR

LD

LD

CLR

+

=0

rezultat_o

DEC

LD

opB_i opA_i

LD

start_i

stare urmatoare

Registru

starede

Logica

iesirilor

Logica

starede

decB

IdAccIdRez

IdOp

acc

opB_r

cale de control

cale dedate

opA_r

opBzero

starecurenta

Figura 5.43 Schema bloc a multiplicatorului.

rezultat_o,rezValid_o

);

input ck;input reset_ni;input start_i;input[7:0] opA_i;input[7:0] opB_i;output[15:0] rezultat_o;output rezValid_o;

// semnale intre calea de control si calea de datewire opBzero; // operandul B a devenit 0

// (terminare multiplicare)wire ldRez; // incarca rezultatwire ldOp; // incarca operanziwire decB; // decrementeaza operand Bwire ldAcc; // incarca registru acumulator

multCaleControl umultCaleControl(.ck (ck ),.reset_ni (reset_ni ),.start_i (start_i ),.rezValid_o (rezValid_o ),.opBzero_i (opBzero ),

Page 209: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

5.8. Multiplicator secvential 199

.ldRez_o (ldRez ),

.ldOp_o (ldOp ),

.decB_o (decB ),

.ldAcc_o (ldAcc ));

multCaleDate UmultCaleDate (.ck (ck ),.reset_ni (reset_ni ),.opA_i (opA_i ),.opB_i (opB_i ),.rezultat_o (rezultat_o ),.opBzero_o (opBzero ),.ldRez_i (ldRez ),.ldOp_i (ldOp ),.decB_i (decB ),.ldAcc_i (ldAcc )

);endmodule

module multCaleDate (ck,reset_ni,opA_i,opB_i,rezultat_o,

opBzero_o,ldRez_i,ldOp_i,decB_i,ldAcc_i

);

input ck;input reset_ni;input[7:0] opA_i;input[7:0] opB_i;output[15:0] rezultat_o;reg[15:0] rezultat_o;

// semnale intre calea de control si calea de dateoutput opBzero_o; // operandul B a devenit 0

// (terminare multiplicare)input ldRez_i; // incarca rezultat

Page 210: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

200 CAPITOLUL 5. PROBLEME REZOLVATE

input ldOp_i; // incarca operanziiinput decB_i; // decrementeaza operand Binput ldAcc_i; // incarca registru acumulator

reg[7:0] opA_r;reg[7:0] opB_r;reg[15:0] acc;

// stocare operandAalways @(posedge ck)if (~reset_ni) opA_r <= 0; elseif (ldOp_i) opA_r <= opA_i;

// stocare operandBalways @(posedge ck)if (~reset_ni) opB_r <= 0; elseif (ldOp_i) opB_r <= opB_i; elseif (decB_i) opB_r <= opB_r - 1;

assign opBzero_o = (opB_r == 0);

// acumulator rezultat partialalways @(posedge ck)if (~reset_ni) acc <= 0; elseif (ldOp_i) acc <= 0; elseif (ldAcc_i) acc <= acc + opA_r;

always @(posedge ck)if (~reset_ni) rezultat_o <= 0; elseif (ldOp_i) rezultat_o <= 0; elseif (ldRez_i) rezultat_o <= acc;endmodule

// codificarea stariilor automatului‘define INIT 3’b000‘define SET_UP 3’b001‘define DEC 3’b010‘define ADD 3’b011‘define FINAL 3’b100

module multCaleControl(ck,reset_ni,start_i,rezValid_o,

Page 211: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

5.8. Multiplicator secvential 201

opBzero_i,ldRez_o,ldOp_o,decB_o,ldAcc_o

);

input ck;input reset_ni;

// porturi de intrare/iesire primareinput start_i; // incepere operatie de multiplicareoutput rezValid_o; // rezultat valid

// (terminare multiplicare)reg rezValid_o;

// semnale intre calea de control si calea de dateinput opBzero_i; // operandul B a devenit 0

// (terminare multiplicare)output ldRez_o; // incarca rezultatoutput ldOp_o; // incarca operanziioutput decB_o; // decrementeaza operand Boutput ldAcc_o; // incarca registru acumulator

//registru de stare al FSMreg[2:0] stare;

//modelarea tranzitilor FSMalways @(posedge ck) begin

if (~reset_ni) begin // reset sincronstare <= ‘INIT;

endelse begin

case (stare)‘INIT: if (start_i)

stare <= ‘DEC;‘DEC: if (opBzero_i)

stare <= ‘FINAL;elsestare <= ‘ADD;

‘ADD: if (opBzero_i)stare <= ‘FINAL;

elsestare <= ‘DEC;

‘FINAL: stare <= ‘INIT;default: stare <= ‘INIT;endcase

Page 212: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

202 CAPITOLUL 5. PROBLEME REZOLVATE

endend

//modelarea iesirilor imediate ale automatuluiassign ldRez_o = (stare == ‘FINAL);assign ldOp_o = (stare == ‘INIT) & start_i;assign decB_o = (stare == ‘DEC);assign ldAcc_o = (stare == ‘ADD);

always @(posedge ck) beginif (~reset_ni) begin

rezValid_o <= 1’b0;endelse begin

if (ldRez_o) beginrezValid_o <= 1’b1;

endelse beginrezValid_o <= 1’b0;

endend

endendmodule

Schemele la nivel RTL rezultate ın urma sintezei sunt prezentate ın figurile 5.44,5.45 si 5.46.

Figura 5.44 Schema multiplicatorului dupa etapa de sinteza.

5.9 Modelarea si testarea memoriilor

Acest paragraf prezinta modelarea unei memorii RAM cu un singur port. Acesta esteun model comportamental. In simularile profesionale modelul trebuie ımbunatatit cuinformatii despre constrangerile temporale.

Page 213: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

5.9. Modelarea si testarea memoriilor 203

Figura 5.45 Schema multiplicatorului dupa etapa de sinteza - cale de control.

Figura 5.46 Schema multiplicatorului dupa etapa de sinteza - cale de date.

Page 214: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

204 CAPITOLUL 5. PROBLEME REZOLVATE

Memoriile cu un singur port permit, la un moment dat, accesul la o singura locatiede memorie fie pentru citire, fie pentru scriere. Structura si semnificatia porturilorunei astfel de memorii este prezentata ın tabelul 5.4. Operatiile de scriere si citire a

Port Dir Dimensiune Semnificatieclk in 1 Ceasul memoriei activ pe frontul pozitiv

addr in 8 Adresa memorieidi in 16 Datele de intrare ın memoriece in 1 Semnal de selectie a memorieiwe in 1 Semnal de validare a scrieriioe in 1 Semnal de activare a iesirilor

dout out 16 Datele de iesire din memorie

Tabelul 5.4Semnificatiile porturilor unei memorii cu un singur port.

memoriei sunt caracterizate prin formele de unda din figurile 5.47, respectiv 5.48:

Figura 5.47 Forme de unda la citirea memoriei.

Figura 5.48 Forme de unda la scrierea memoriei.

Modelul Verilog al unei memorii cu un port este prezentat ın continuare:

Vnµ´¶³

module singlePortMem (clk,addr,di,

Page 215: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

5.9. Modelarea si testarea memoriilor 205

ce,we,oe,dout

);parameter initLocation = "fisier";

// "fisier": date in fisier extern "memContent.dat"// "zero": toate locatiile contin data=0// "adresa": fiecare locatie contine data=adresa// "x": toate locatiile initializate cu ’bx// "aleatoriu": toate locatiile intializate aleatoriu

// declaratia porturilorinput clk; // ceasul memorieiinput[7:0] addr; // bus de adreseinput[15:0] di; // bus date de intrareinput ce; // semnal de selectie a memorieiinput we; // semnal de validare a scrieriiinput oe; // semnal de activare a iesiriioutput[15:0] dout; // bus date de iesirereg[15:0] dout;

// declaratia de memoriereg [15:0] mem [0:255]; // memorie de 256 de locatii a cate 16 biti

// memorie sincronaalways @(posedge clk) begin

if(ce) beginif(we) beginmem[addr] <= di; // scrierea in memorie a datelor de pe

endelse begin // bus-ul de intrare diif(oe) begin

dout <= mem[addr]; // citirea din memorieend

endendelse begindout <= 16’bz; // cand memoria nu este selectata

// portul de date de ie’sire este in starea HighZend

end

integer i;// initializarea memorieiinitial begin

if (initLocation == "fisier") begin

Page 216: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

206 CAPITOLUL 5. PROBLEME REZOLVATE

$readmemb ("memContent.dat", mem);endelse begin

if (initLocation == "zero") beginfor (i=0; i<=255; i=i+1)

mem[i] = 0;endelse beginif (initLocation == "adresa") begin

for (i=0; i<=255; i=i+1)mem[i] = i;

endelsebegin

if (initLocation == "x") beginfor (i=0; i<=255; i=i+1)

mem[i] = ’bx;endelse beginif (initLocation == "aleatoriu") begin

for (i=0; i<=255; i=i+1)mem[i] = $random;

endelse begin

$display("%M EROARE: parametru incorect initLocation=%s",initLocation);

$stop;end

endend

endend

endendmodule

Pentru testarea unei memorii cu un singur port se realizeaza un mediu de testareın care se instantiaza memoria care se doreste a fi testata si se descriu task-urile careimplementeaza operatiile unei memorii.

Modul de initializare a memoriei este determinat de parametrul initLocation.

• Daca initLocation="fisier", initializarea se face cu datele dintr-un fisier ex-tern, cu comanda $readmemb. Formatul fisierului de intrare este prezentat ıncontinuare:

0000000000000000 // continutul de la locatia 00000000000000001 // continutul de la locatia 10000000000000010 // continutul de la locatia 20000000000000011 // continutul de la locatia 3

Page 217: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

5.9. Modelarea si testarea memoriilor 207

0000000000000100 // continutul de la locatia 40000000000000101 // continutul de la locatia 5...

• Daca initLocation="zero", toate locatiile memorie sunt initializate cu 0.

• Daca initLocation="adresa", toate locatiile memorie sunt initializate cu va-loarea adresei la care se afla.

• Daca initLocation="x", toate locatiile memorie sunt initializate cu valoareindiferenta "x".

• Daca initLocation="aleatoriu", toate locatiile memorie sunt initializate cuvalori aleatorii.

• Daca initLocation nu are nici una din valorile mentionate, se genereaza unmesaj de eroare si se opreste simularea.

Task-ul de citire este prezentat ın continuare:

task Read;input[7:0] addr_task;begin// Adresa de unde se face citireaaddr <= addr_task;

// Semnalele de control setate pentru operatia de citirewe <= 1’b0;oe <= 1’b1;ce <= 1’b1;@(posedge clk);#1$display("%M %t NOTA: citire adresa=%d, data=%hH", $time,

addr_task, dout);endendtask

Apelul task-ului de citire este de forma:Read(<adresa de citire>);

Task-ul de scriere este prezentat ın continuare:

task Write;input[7:0] addr_task;input[15:0] di_task;begin$display("%M %t NOTA: scriere adresa=%d, data=%hH", $time,

addr_task, di_task);// Adresa unde se face scriereaaddr <= addr_task;

Page 218: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

208 CAPITOLUL 5. PROBLEME REZOLVATE

// Valoarea care se inscrie la locatia pointata de adresadi <= di_task;

// Semnalele de control setate pentru operatia de scrierewe <= 1’b1;oe <= 1’b1;ce <= 1’b1;@(posedge clk);endendtask

Apelul task-ului de scriere este de forma:Write(<adresa de scriere>, <data scrisa>);

Task-ul de citire a continutului ıntregii memorii este prezentat ın continuare:

task Dump;input[0:100] file_name;integer k;integer file_id;begin

file_id = $fopen(file_name);$display("%M %t NOTA Citire/dump continut memorie", $time);for (k=0; k<256; k = k + 1) begin

$fdisplay (file_id,"adresa=%d, data=%hH",k, UsinglePortMem.mem[k]);

$display ("adresa=%d, data=%hH",k, UsinglePortMem.mem[k]);

end$fclose(file_id);

endendtask

In urma apelului task-ului Dump rezulta un fisier care contine o copie a memoriei.Formatul fisierului de iesire este prezentat ın continuare:

# tstSinglePortMem.Dump 5 NOTA Citire/dump continut memorie# adresa= 0, data=0000H# adresa= 1, data=0001H# adresa= 2, data=0002H# adresa= 3, data=0003H# adresa= 4, data=0004H# adresa= 5, data=0005H# adresa= 6, data=0006H

Un model Verilog care foloseste task-urile prezentate mai sus este prezentat ıncontinuare:

Tnµ´¶³

Page 219: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

5.9. Modelarea si testarea memoriilor 209

module tstSinglePortMem();

reg clk;reg[7:0] addr;reg[15:0] di;reg ce;reg we;reg oe;wire[15:0] dout;

//descrierea task-urilortask Read;...endtask

task Write;...endtask

task Dump;...endtask

// valoarea initiala a ceasuluiinitial clk <= 0;

// generator de ceasalways #5 clk <= ~clk;

initial begin@(posedge clk);Dump("dumpMem.dat");Read (8’h00);Read (8’h01);Read (8’h02);Read (8’h03);Write(8’h00,16’hFFF0);Write(8’h01,16’hFF0F);Write(8’h02,16’hF0FF);Write(8’h03,16’h0FFF);@(posedge clk);$stop;Dump("dumpMem.dat");@(posedge clk);$display("%M %t NOTA: Terminare simulare", $time);$stop;

end

Page 220: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

210 CAPITOLUL 5. PROBLEME REZOLVATE

// instanta de memorie testatadefparam UsinglePortMem.initLocation = "adresa";// "fisier": date in fisier extern "memContent.dat"// "zero": toate locatiile contin data=0// "adresa": fiecare locatie contine data=adresa// "x": toate locatiile initializate cu ’bx// "aleatoriu": toate locatiile intializate aleatoriusinglePortMem UsinglePortMem (

.clk (clk ),

.addr (addr ),

.di (di ),

.ce (ce ),

.we (we ),

.oe (oe ),

.dout (dout ));

endmodule

5.10 Modelarea multiplexoarelor

Multiplexoarele sunt circuite foarte frecvent utilizate. Ele implementeaza o functie deselectie. Multiplexoarele se pot modela folosind operatorul ternar ?:.

assign y = sel ? i1 : i0;

Acest model este foarte folosit ın majoritatea cazurilor. Paragrafele urmatoareprezinta cateva limitari ale acestui model si propune solutii de ımbunatatire a calitatiimodelului.

5.10.1 Multiplexor modelat cu valori neprecizate

Multiplexorul 2:1 este un circuit combinational cu trei intrari (doua de date si una deselectie) si o iesire. Tabelul de adevar al acestuia este prezentat ın tabelul 5.5.

Tinand cont de setul de valori Verilog (0, 1, x, z), se poate concluziona ca tabelul5.5 nu este complet. Practic, pentru ca setul de valori Verilog are patru valori dis-tincte, ar trebui ca tabelul de adevar al circuitului multiplexor 2:1 sa aiba 43 = 64linii.

Ce valoare logica are iesirea y daca intrarea sel=1’bx? Ar trebui sa fie i0, i1 sau1’bx?

Ce valoare logica are iesirea y daca sel=1’bx, i1=i0=1’b0? Ar trebui sa fie 1’b0sau 1’bx?

Pentru a evidentia diferentele dintre diferite tipuri de modelare, sunt prezentateın continuare patru specificatii care modeleaza multiplexoare. Formele de unda co-respunzatoare sunt prezentate ın figura 5.49.

Page 221: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

5.10. Modelarea multiplexoarelor 211

sel i1 i0 y0 0 0 00 0 1 10 1 0 00 1 1 11 0 0 01 0 1 01 1 0 11 1 1 1

Tabelul 5.5Tabelul de adevar al circuitului multiplexor 2:1.

always @(sel or in0 or in1) beginout1 <= sel ? in1 : in0;if (sel) out2 <= in1; else

out2 <= in0;if (sel) out3 <= in1; elseif (!sel) out3 <= in0; else

out3 <= 1’bx;out4 <= (sel & in1) | (~sel & in0);

end

out1 este modelat ”clasic”. Daca sel=0, atunci out1=in0. Daca sel=1, atunciout1=in1. Daca sel=1’bx sau sel=1’bz, atunci se evalueaza ambele expresii in0 siin1. Daca sunt gasite egale, out1 primeste aceasta valoare (chiar daca sel=1’bx).Altfel spus, daca sel=1’bx, in0=in1=1’b0, atunci y=1’b0. Acest lucru este corectdaca 1’bx este interpretat ca valoare indiferenta dar egala (ın realitate) cu 1’b0 sau1’b1. Insa, acest lucru poate ascunde o conditie 1’bx aparuta nedorit pe selectie.

out2 este modelat cu specificatie de decizie. In acest caz decizia if (sel) tre-buie ıntelesa ca if (sel==1’b1), adica ıntoarce adevarat daca sel=1’b1 si fals ıncelelalte cazuri. Ca efect, daca sel=1’b1 atunci out2=in1, altfel out2=in0. Dife-renta ıntre out1 si out2 se manifesta cand sel=1’bx si sel=1’bz. In aceste cazuri,out2=in0 dar out1 depinde de valorile ambelor intrari de date.

Desi mai neobisnuita la prima vedere, modelul de multiplexor out3 aduce unavantaj: semnaleaza cu out3=1’bx daca sel=1’bx, indiferent de intrarile de date.Acest lucru poate fi util ın simularea comportamentala. Desi, la prima vedere,conditia if (!sel) este gasita (ın acea pozitie) tot timpul adevarata, acest lucrunu este adevarat daca sel=1’bx sau sel=1’bz. In aceste ultime cazuri, se atribuiteout3=1’bx.

A patra forma modeleaza multiplexorul pe baza ecuatiei sale logice. Se observaca iesirea nu poate avea valoarea 1’bz. In plus, spre deosebire de out1, out4=1’bxdaca in1=in0=1’b1 dar sel=1’bx.

Se demonstreaza astfel ca, desi modelele sunt echivalente pentru valorile logiceelementare 0 si 1, ele se comporta diferit imediat ce intrarile au alte valori (x si z).

Este interesat de studiat cum se comporta modelele de multiplexoare ın cazul

Page 222: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

212 CAPITOLUL 5. PROBLEME REZOLVATE

Figura 5.49 Formele de unda pentru circuitul multiplexor 2:1.

existentei unor conexiuni externe particulare. De exemplu, conectarea intrarii deselectie la una din intrari (in0=sel) ar echivala functionarea multiplexorului cu ceaa unei porti logice out = sel & in1.

Multiplexorul instantiat ın continuare are, conform algebrei Booleene, iesirea in-dependenta de selectie (out=1’b0 pentru orice valoare sel). Daca sel=1’b0, atunciout=in0=sel=1’b0. Daca sel=1’b0, atunci out=in1=1’b0. Totusi, aparitia uneivalori sel=1’bx sau sel=1’bz produce out=1’bx.

muxX UmuxX(.sel (sel ),.in0 (sel ),.in1 (1’b0),.out1 (out )

);

5.10.2 Multiplexor ın bucla cu bistabil

Acest paragraf prezinta un caz de modelare RTL si la nivel de poarta logica pentru unbistabil RS sincron. Bistabilul va fi implementat ın tehnologie eASIC si va prezentaın netlist-ul la nivel de poarta logica o instantiere de multiplexor. Comportamentulmultiplexorului va fi descris cu specificatia Verilog de primitiva, lucru care asigura oviteza de simulare superioara, necesara simularilor la acest nivel.

Codul RTL este prezentat ın continuare. Bistabilul are un semnal de reset sincronglobal (care actioneaza asupra tuturor bistabilelor din sistem). In plus, exista douasemnale de set si reset sincrone, particulare acestui bistabil. Conditia de set esterealizata ca un SI logic ıntre doua semnale.

Vnµ´¶³

module srFf (clk_i,reset_ni,rSync_i,sSync1_i,sSync2_i,iesire_o

);

input clk_i;input reset_ni;

Page 223: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

5.10. Modelarea multiplexoarelor 213

input rSync_i;input sSync1_i;input sSync2_i;output iesire_o;

reg iesire_o;always @(posedge clk_i) begin

if (~reset_ni) begin // reset global sincroniesire_o <= 1’b0;

endelse begin

if (sSync1_i && sSync2_i) begin // set sincroniesire_o <= 1’b1;

endelse beginif (rSync_i) begin // reset sincron

iesire_o <= 1’b0;end

endend

endendmodule

In urma sintezei acestui cod si a implementarii circuitului ın tehnologie eASICrezulta urmatorul netlist.

// Ver 1.0.2 Build Tue 01/11/05// Technology // E-cell netlist after mapping// ***** Verplex FORMAT *****

module core_srFf (iesire_o, clk_i, reset_ni, rSync_i,sSync1_i, sSync2_i);

output iesire_o;input clk_i, reset_ni, rSync_i, sSync1_i, sSync2_i;wire n9, n8, n7, n6, n5, n4, n3;

supply1 N_VCC;supply0 N_GND;

assign n3 = clk_i;assign n4 = reset_ni;assign n5 = rSync_i;assign n6 = sSync1_i;assign n7 = sSync2_i;assign iesire_o = n8;

srFf_cell_17796 srFf_cell_17796 (.i3n(n8), .ms(n9), .xa(n6), .xb(n4), .xc1(N_VCC),

Page 224: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

214 CAPITOLUL 5. PROBLEME REZOLVATE

.xc2(n7), .ck(n3));

srFf_cell_17780 srFf_cell_17780 (.x(n9), .xa(n4), .xb(n5), .xc1(n7), .xc2(n6));

endmodule

module srFf_cell_17796 (i3n, ms, xa, xb, xc1, xc2, ck);//PLACED//DUMMYPORT U7_nand2x.xc1//DUMMYINST inv6xa_1output i3n;input ms, xa, xb, xc1, xc2, ck;wire qn, mn, xn, xc;

wire x;

inv6xa inv6xa_1 (.x(x), .xn(xn));

inv8xb iesire_o_reg_inv8xb (.i3n(i3n), .i3(qn));dffx iesire_o_reg_dffx (.qn(qn), .mn(mn), .ck(ck));muxy iesire_o_reg_muxy (.mn(mn), .ms(ms), .m1(xn), .m0(qn));lutx_7f U7_lutx (.xn(xn), .xa(xa), .xb(xb), .xc(xc));nand2x U7_nand2x (.xc(xc), .xc1(xc1), .xc2(xc2));

// defparam U7_lutx.lut_data = 8’h7f;

endmodule

module srFf_cell_17780(x, xa, xb, xc1, xc2);//PLACED//DUMMYPORT//DUMMYINST u5333_muxyoutput x;input xa, xb, xc1, xc2;wire xn, xc;

muxy u5333_muxy (.mn(mn), .ms(1’b1), .m1(xn), .m0(1’b1));

inv6xa U6_inv6xa (.x(x), .xn(xn));lutx_02 U6_lutx (.xn(xn), .xa(xa), .xb (xb), .xc(xc));nand2x U6_nand2x (.xc(xc), .xc1(xc1), .xc2(xc2));

// defparam U6_lutx.lut_data = 8’h02;

endmodule

Se observa ca bistabilul a fost implementat ın doua eCell-uri.

Page 225: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

5.10. Modelarea multiplexoarelor 215

eCell-ul srFf_cell_17796 foloseste din resursele interne inv6xa, inv8xb, dffx,muxy, lutx_7f, nand2x. eCell-ul srFf_cell_17780 foloseste din resursele internemuxy, inv6xa, lutx_02, nand2x. Aceste resurse existente ın eCell-uri au comporta-mentul descris ın biblioteci specifice tehnologiei. Reprezentarea grafica a netlist-uluieste prezentata ın figura 5.50.

xa

xb

xc

8’h02

reset_ni

rSync_i

sSync1_isSync2_i

sSync2_i8’h7f

sSync1_i xa

xb

xc

xn

m0

m1

d q iesire_oVCC

reset_ni

Figura 5.50 Reprezentarea grafica a netlist-ului de bistabil RS la nivel de poarta logica.

Componenta muxy este descrisa ın biblioteca easic_TA.v prin instantierea unorporti definite ın limbaj si a apelarii unei primitive.

‘celldefine// INVERTER// mn = ms ? !m1 : !m0module muxy (mn, m0, m1, ms);

output mn;input m0;input m1;input ms;

‘protectspecify// Pin-to-pin timing.(m0 => mn) = (0.027:0.039:0.061,0.026:0.039:0.065);(m1 => mn) = (0.025:0.036:0.058,0.028:0.042:0.071);if(!m0&m1) (ms => mn) = (0.049:0.074:0.120,0.042:0.063:0.106);if(m0&!m1) (ms => mn) = (0.036:0.051:0.080,0.047:0.072:0.118);ifnone (ms => mn) = (0.049:0.074:0.120,0.042:0.063:0.106);endspecify

// Gate-level description.not _i0 (_n1,m1); // poarta definita in Verilog

Page 226: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

216 CAPITOLUL 5. PROBLEME REZOLVATE

not _i1 (_n2,m0); // poarta definita in Verilogp_mux21 _i2 (mn, _n1, _n2, ms); // primitiva

‘endprotectendmodule‘endcelldefine

Primitiva ce descrie comportamentul multiplexorul este:

primitive p_mux21 (q, data1, data0, dselect);output q;input data1, data0, dselect;

// FUNCTION : TWO TO ONE MULTIPLEXERtable//data1 data0 dselect : q0 0 ? : 0 ;1 1 ? : 1 ;

0 ? 1 : 0 ;1 ? 1 : 1 ;

? 0 0 : 0 ;? 1 0 : 1 ;endtableendprimitive

Tnµ´¶³

Pe situl cartii se gaseste mediul de simulare comparativa al modelelor RTLsi la nivel de porti logice.

Mai multe detalii despre tehnologia eASIC si bibliotecile de simulare si sintezacomplete se pot gasi pe situl firmei eASIC.

5.10.3 Multiplexor pe bus

De multe ori, multiplexoarele au ca date de intrare bus-uri. Un multiplexor 2:1 pe busde 32 biti este echivalent cu 32 de multiplexoare 2:1 pe bit. Modelarea acestora esteidentica cu cea prezentata ın paragraful precedent, cu deosebirea ca iesirea si intrarilede date sunt de tip bus. Intrarea de selectie este de 1 bit si este conectata la toateintrarile de selectie acele celor 32 de multiplexoare 2:1.

Un caz particular ıl constituie cazul ın care se doreste implementarea unei operatiide ”mascare” pe bus. In acest caz, atat datele de intrare, cat si intrarea de selectiesunt bus-uri. Desi circuitul hardware rezultat este acelasi (32 de multiplexoare 2:1),faptul ca intrarile de selectie sunt diferite necesita o modelare particulara. Modelareaacestui circuit se poate face considerand operatori pe bus:

module muxBus(data0,

Page 227: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

5.11. Controller pentru memorie SDRAM 217

data1,sel,out

);

input[7:0] data0;input[7:0] data1;input[7:0] sel;output[7:0] out;

assign out = (~sel & data0) | (sel & data1);

endmodule

Se observa ca operatorii ~, & si | sunt operatori pe vectori, rezultat fiind tot unvector.

5.11 Controller pentru memorie SDRAM

Acest paragraf prezinta codul Verilog asociat controllerului SDRAM. Descrierea ındetaliu a controllerului SDRAM este prezentata ın volumul ıntai a acestei carti. Dupaprezentarea modelului Verilog asociat si a structurilor hardware rezultate prin sintezase vor trata doua probleme specifice legate de testarea acestui modul:

• verificarea corectitudini acceselor la memorie prin modelarea unei memorii dereferinta (oglinda);

• modelarea unor generatoare de comenzi complexe.

5.11.1 Modelul Verilog al controllerului SDRAM

Secventierea activitatii controllerul SDRAM este asigurata de un automat sincron acarui organigrama este reluata ın figura 5.51.

Codul Verilog asociat este prezentat ın continuare. Schema rezultata din sintezaeste prezentata ın figura 5.52. Se observa ca datorita modului de codare ”one-hot”(specific cazurilor ın care se doreste functionarea la frecvente ınalte) automatul areo prezentare grafica diferita de cea ”clasica”. Registrul de stare este realizat dinbistabile individuale iar circuitul logic este ”ımprastiat” ın jurul acestora.

// bistabile de stare (stari codificate "one-hot")reg initSt;reg nopSt;reg arfSt;reg idleArfSt;reg actSt;reg idleActSt;reg operSt;reg idle1St;

Page 228: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

218 CAPITOLUL 5. PROBLEME REZOLVATE

NOP

NOP

0

rf_rq

NOP

001H

000H

RQ

002H

arf_st

0

NOP

NOP

NOP

WRITE / READ

001

008H

010H

020H

040H

080H

100H

200H

NOP

arf_term1

400H

act_st

Idle_act_st

oper_st

Idle_2_st

Idle_3_st

Idle_1_st

Idle_arf_st

Idle_wr_st

pr_st

Operatii

Refresh

1

2

3

4

5

6

7

8

9

10

11

0

004H

Initializare

PREINCARCARE

rwCrt0 1

ACTIVAREAUTOREFRESH

nop_st

1ShReg(17)

Init_st INCARCARE REGISTRU MOD(LMR)

PREINCARCARE(PA)AUTOREFRESH(AR1,AR2)

Figura 5.51 Organigrama automatului controllerului SDRAM.

Page 229: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

5.11. Controller pentru memorie SDRAM 219

reg idle2St;reg idle3St;reg idleWrSt;reg prSt;

// automat de stare, codat "one-hot"// (un bistabil asociat fiecarei stari)always @(posedge clk_i or negedge reset_ni) begin

if (~reset_ni) begininitSt <= 1’b1;

endelse begin

initSt <= (initSt & ~lmr);end

end

always @(posedge clk_i or negedge reset_ni) beginif (~reset_ni) begin

nopSt <= 1’b0;endelse begin

nopSt <= (initSt & lmr) |(nopSt & ~rfRq & ~rq_i) |(idleArfSt & arTerm) |prSt;

endend

always @(posedge clk_i or negedge reset_ni) beginif (~reset_ni) begin

arfSt <= 1’b0;endelse begin

arfSt <= (nopSt & rfRq);end

end

always @(posedge clk_i or negedge reset_ni) beginif (~reset_ni) begin

idleArfSt <= 1’b0;endelse begin

idleArfSt <= arfSt |(idleArfSt & ~arTerm);

endend

Page 230: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

220 CAPITOLUL 5. PROBLEME REZOLVATE

always @(posedge clk_i or negedge reset_ni) beginif (~reset_ni) begin

actSt <= 1’b0;endelse begin

actSt <= (nopSt & ~rfRq & rq_i);end

end

always @(posedge clk_i or negedge reset_ni) beginif (~reset_ni) begin

idleActSt <= 1’b0;endelse begin

idleActSt <= actSt;end

end

always @(posedge clk_i or negedge reset_ni) beginif (~reset_ni) begin

operSt <= 1’b0;endelse begin

operSt <= idleActSt;end

end

always @(posedge clk_i or negedge reset_ni) beginif (~reset_ni) begin

idle1St <= 1’b0;endelse begin

idle1St <= operSt;end

end

always @(posedge clk_i or negedge reset_ni) beginif (~reset_ni) begin

idle2St <= 1’b0;endelse begin

idle2St <= idle1St;end

end

always @(posedge clk_i or negedge reset_ni) beginif (~reset_ni) begin

Page 231: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

5.11. Controller pentru memorie SDRAM 221

idle3St <= 1’b0;endelse begin

idle3St <= idle2St;end

end

always @(posedge clk_i or negedge reset_ni) beginif (~reset_ni) begin

idleWrSt <= 1’b0;endelse begin

idleWrSt <= idle3St & ~rwnCrt;end

end

always @(posedge clk_i or negedge reset_ni) beginif (~reset_ni) begin

prSt <= 1’b0;endelse begin

prSt <= (idle3St & rwnCrt) |idleWrSt;

endend

Registrul de initializare este modelat ca un registru de 18 biti initializat la reset cuvaloarea 18’b1 si deplasat spre stanga la fiecare tact dupa inactivarea semnalului dereset. Pentru o mai buna ıntelegere a codului, anumiti biti, ce corespund actiunilorce au loc la initializare au fost redenumiti cu nume sugestive. Figura 5.53 prezintaschema rezultata din sinteza pentru registrul de initializare.

// denumire alternative pentru usurinta intelegerii coduluiwire lmr; // "load mode register" la initializarewire ar1; // primul auto-refresh la initializarewire ar2; // al doilea auto-refresh la initializarewire pa; // "precharge all" la initializare

/ *** registre de stare *************************************// registru de deplasare utilizat pentru initializarealways @(posedge clk_i or negedge reset_ni) begin

if(~reset_ni) begin// la reset, se activeaza bitul cel mai putin semnificativinitShReg <= 18’b1;

endelse begin

initShReg <= {initShReg[16:0], 1’b0}; // deplasare stangaend

Page 232: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

222 CAPITOLUL 5. PROBLEME REZOLVATE

Figura 5.52 Automatul controllerului SDRAM - schema sintetizata.

Page 233: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

5.11. Controller pentru memorie SDRAM 223

end// secventa de initializare SDRAMassign lmr = initShReg[17];assign ar2 = initShReg[10];assign ar1 = initShReg[3];assign pa = initShReg[1];

Figura 5.53 Registrul de initializare al controllerului SDRAM - schema sintetizata.

Semnalele de comanda ale memorie SDRAM sunt descrise pe baza starilor au-tomatului si starii registrului de initializare. Toate iesirile din modul provin dinregistru. Adresa si banca trimise spre memoria SDRAM provin din adresa clientu-lui SDRAM sau sunt generate intern, ın functie de starea automatului. Figura 5.54prezinta schema rezultata din sinteza pentru logica iesirilor.

reg[11:0] addr_o;reg[1:0] ba_o;reg cs_no;reg ras_no;reg cas_no;reg we_no;reg[31:0] dqEn; // validarea emiterii datelor pe

// bus-ul de datetri-state

// *** iesiri de control spre SDRAM **************************// adresa/banca SDRAMalways @(posedge clk_i or negedge reset_ni) begin

if (~reset_ni) beginaddr_o <= 12’b0;ba_o <= 2’b00;

endelse begin

if (operSt) beginaddr_o <= {4’b0, colCrt}; // coloanaba_o <= baCrt;

endelse beginif (actSt) begin

Page 234: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

224 CAPITOLUL 5. PROBLEME REZOLVATE

addr_o <= rowCrt; // randba_o <= baCrt;

endelse begin

if (lmr) beginaddr_o <= 12’b00_0_00_010_0_010;// registru de modba_o <= 2’b00;

endelse begin

if (ar1 | ar2 | pa | prSt) beginaddr_o <= 12’b0100_0000_0000; // autorefesh sau precharge all

ba_o <= 2’b00;end

endend

endend

end

// semnalele de controlalways @(posedge clk_i or negedge reset_ni) beginif (~reset_ni) begin

cs_no <= 1’b1;endelse begin

cs_no <= ~(lmr | ar1 | ar2 | pa |arfSt | actSt | operSt | prSt);

endend

always @(posedge clk_i or negedge reset_ni) beginif (~reset_ni) begin

ras_no <= 1’b1;endelse begin

ras_no <= ~(lmr | ar1 | ar2 | pa |arfSt | actSt | prSt);

endend

always @(posedge clk_i or negedge reset_ni) beginif (~reset_ni) begin

cas_no <= 1’b1;endelse begin

cas_no <= ~(lmr | ar1 | ar2 |arfSt | operSt);

Page 235: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

5.11. Controller pentru memorie SDRAM 225

endend

always @(posedge clk_i or negedge reset_ni) beginif (~reset_ni) begin

we_no <= 1’b1;endelse begin

we_no <= ~(lmr | pa |(operSt & ~rwnCrt) | prSt);

endend

always @(posedge clk_i or negedge reset_ni) beginif(~reset_ni) begin

dqEn <= 32’b0;endelse begin

dqEn <= {32{(~rwnCrt & (operSt | idle1St |idle2St | idle3St))}};

endend

Actiunea de reımprospatare a continutului memoriei (”refresh”, ın limba engleza)este modelata cu ajutorul unui numarator care seteaza un bistabil pentru activareacererii de refresh spre automat. Bistablul este resetat cand automatul lanseaza cerereade refresh spre memoria SDRAM. Figura 5.55 prezinta schema rezultata din sintezapentru circuitul de refresh.

reg rfRq; // cerere de refresh

reg[10:0] rfCounter; // numaratorul perioadei de refreshreg[6:0] rfIdle; // linie de intarziere pentru

// masurare latenta refresh

// *** circuite implicate in gestionarea refresh-ului *******// registru de deplasare pentru masurarea latentei de refreshalways @(posedge clk_i or negedge reset_ni) begin

if (~reset_ni) beginrfIdle <= 7’b0;

endelse begin

if (arfSt) beginrfIdle <= 7’b1;

endelse beginrfIdle <= {rfIdle[5:0], 1’b0};

end

Page 236: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

226 CAPITOLUL 5. PROBLEME REZOLVATE

Figura 5.54 Logica iesirilor controllerului SDRAM - schema sintetizata.

Page 237: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

5.11. Controller pentru memorie SDRAM 227

endend// terminat starile IDLE dupa comanda de refreshassign arTerm = rfIdle[6];

// generator intervale de timp de refreshalways @(posedge clk_i or negedge reset_ni) begin

if (~reset_ni) beginrfCounter <= perRefresh_p;

endelse if(|rfCounter) begin

rfCounter <= rfCounter - 1;endelse begin

rfCounter <= perRefresh_p;end

end

// cerere refreshalways @(posedge clk_i or negedge reset_ni) begin

if (~reset_ni) beginrfRq <= 1’b0;

endelse begin

if (~|rfCounter) beginrfRq <= 1’b1;

endelse beginif (arfSt) begin

rfRq <= 1’b0;end

endend

end

Interfata cu clientul SDRAM se face print-un set de registre care stocheaza tipulactiunii (citire sau scriere) si adresa la care se cere accesul. Adresa accesata esteulterior decodificata ın banca, rand si coloana SDRAM. Confirmarea spre client estetrimisa pe baza starii automatului. Figura 5.56 prezinta schema rezultata din sintezapentru circuitul de interfatare dintre client si controllerul SDRAM.

reg rwnCrt;reg[1:0] baCrt;reg[11:0] rowCrt;reg[7:0] colCrt;reg[3:0] ackDel; // intarziere confirmare pentru citire

// *** interfatarea cu clientul ********************************

Page 238: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

228 CAPITOLUL 5. PROBLEME REZOLVATE

Figura 5.55 Circuitul de refresh al controllerului SDRAM - schema sintetizata.

// memorarea comenzii curentealways @(posedge clk_i or negedge reset_ni) begin

if (~reset_ni) beginrwnCrt <= 1’b1;baCrt <= 2’b00;rowCrt <= 12’b0;colCrt <= 8’b0;

endelse begin

if (rq_i) begin // cat timp rq_i=1, clientul are obligatia// sa tina comanda (tipul, adresa, datele)

// active.// aceste informatii sunt necesare// si ulteriorrwnCrt <= rw_ni;baCrt <= addrClient_i[21:20];// decodificarea bancii SDRAMrowCrt <= addrClient_i[19:8]; // decodificarea randului SDRAMcolCrt <= addrClient_i[7:0]; // decodificarea coloanei SDRAM

endend

end

// intarziere confirmare (in cazul citiri, datorita latentei CAS)always @(posedge clk_i or negedge reset_ni) begin

if (~reset_ni) beginackDel <= 4’b0;

endelse begin

ackDel <= {ackDel[2:0],((operSt | idle1St | idle2St | idle3St) & rwnCrt)};

end

Page 239: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

5.11. Controller pentru memorie SDRAM 229

end

// confirmare spre clientassign ack_o = rwnCrt ? ackDel[3] :

(operSt | idle1St | idle2St | idle3St);

Figura 5.56 Circuitul de interfata cu clientul al controllerului SDRAM - schema sintetizata.

Legarea blocurilor functionale ıntr-un modul este prezentata grafic ın figura 5.57.

5.11.2 Mediul de testare al controllerului SDRAM

Mediul de testare propus instantiaza urmatoarele module:

Tnµ´¶³

• sdramCntrl: modul de testat;

• sdramClient: model al clientului SDRAM;

• mt48lc4m32b2: model al memoriei SDRAM;

• monitor: model de verificare.

Figura 5.58 prezinta grafic pozitia modulelor instantiate ın mediul de testare.Modelul clientului SDRAM este conceput cu task-uri asociate actiunilor aces-

tuia: citire, scriere, lipsa cerere.

Page 240: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

230 CAPITOLUL 5. PROBLEME REZOLVATE

Figura 5.57 Structura controllerului SDRAM - schema sintetizata.

Page 241: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

5.11. Controller pentru memorie SDRAM 231

Mediu de testare

SDRAM

protocol

monitor

client

SDRAM SDRAM

controller memorie

Figura 5.58 Pozitia modulelor instantiate ın mediul de testare.

Task-ul de scriere are ca parametrii adresa de scriere si patru date scrise ın burst.Task-ul de citire are ca parametrii adresa de citire si patru date asteptate ın urma

citirii (pentru verificare).In lipsa unor comenzi de citire/scriere este apelat task-ul break avand ca para-

metru numarul de perioade de tact ın care nu se lanseaza nici o comanda.

// *** cerere de scriere **********************************task write;// parametrii formali ai task-uluiinput[21:0] ad_t;input[31:0] d0_t;input[31:0] d1_t;input[31:0] d2_t;input[31:0] d3_t;

begin// $display("%M %t NOTA: ad=%0d, d0=%0d, d1=%0d, d2=%0d, d3=%0d",// $time, ad_t, d0_t, d1_t, d2_t, d3_t);

rq_o <= 1’b1;rw_no <= 1’b0;addrClient_o <= ad_t;data_o <= d0_t;@(posedge clk_i);while (~ack_i)

@(posedge clk_i);rq_o <= 1’b0;rw_no <= 1’bx;addrClient_o <= ’bx;data_o <= d1_t;@(posedge clk_i);

Page 242: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

232 CAPITOLUL 5. PROBLEME REZOLVATE

data_o <= d2_t;@(posedge clk_i);data_o <= d3_t;@(posedge clk_i);

endendtask

// *** cerere de citire ************************************task read;// parametrii formali ai task-uluiinput[21:0] ad_t;input[31:0] d0_t;input[31:0] d1_t;input[31:0] d2_t;input[31:0] d3_t;begin

rq_o <= 1’b1;rw_no <= 1’b1;addrClient_o <= ad_t;data_o <= ’bx;@(posedge clk_i);while (~ack_i)

@(posedge clk_i);rq_o <= 1’b0;rw_no <= 1’bx;addrClient_o <= ’bx;if ((^(d0_t) !== 1’bx) && (data_i !== d0_t)) begin

$display("%M %t EROARE: data 0 asteptata=%0d, citita=%0d", $time,d0_t, data_i);$stop;

end@(posedge clk_i);if ((^d1_t !== 1’bx) && (data_i !== d1_t)) begin

$display("%M %t EROARE: data 1 asteptata=%0d, citita=%0d", $time,d1_t, data_i);$stop;

end@(posedge clk_i);if ((^d2_t !== 1’bx) && (data_i !== d2_t)) begin

$display("%M %t EROARE: data 2 asteptata=%0d, citita=%0d", $time,d2_t, data_i);$stop;

end@(posedge clk_i);if ((^(d3_t) !== 1’bx) && (data_i !== d3_t)) begin

$display("%M %t EROARE: data 3 asteptata=%0d, citita=%0d", $time,d3_t, data_i);

Page 243: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

5.11. Controller pentru memorie SDRAM 233

$stop;end@(posedge clk_i);

endendtask

// *** lipsa cerere ***************************************task break;// parametrii formali ai task-uluiinput[31:0] nrClocks_t;begin

rq_o <= 1’b0;rw_no <= 1’bx;addrClient_o <= ’bx;data_o <= ’bx;repeat (nrClocks_t)

@(posedge clk_i);endendtask

Pentru o testare intensiva, task-urile pot fi apelate fie individual, fie ın modrepetat, fie ın mod aleatoriu. In exemplul urmator clientul cere un acces de scrierela adresa 0, urmat de o cerere de citire de la aceeasi adresa (cu asteptarea acelorasidate). Ulterior, se lanseaza o simulare infinita a unor scrieri si citiri aleatorii. Pen-tru verificarea datelor citite, s-a optat pentru solutia scrierii unor date provenite dinbitii de adresa (ın acest mod, se pot determina datele asteptate la citire ın functie deadresa accesata).

integer crtVector = 1;reg[1:0] baTmp;reg[11:0] rowTmp;reg[7:0] colTmp;reg[21:0] adsTmp;

initialbegin

break(10);// write(adresa, data0, data1, data2, data3);// read (adresa, data0, data1, data2, data3);// break (nrTacte);

// scriere si citire adresa 0write(22’h0, 0, 1, 2, 3);break(5);read (22’h0, 0, 1, 2, 3);break(5);

if (nrVectors_p === 0) begin

Page 244: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

234 CAPITOLUL 5. PROBLEME REZOLVATE

$display("%M %t NOTA: Incepe o simulare infinita.", $time);$stop;

endelse begin

$display("%M %t NOTA: Numar de vectori de test = %0d.", $time,nrVectors_p);

$stop;end

// testare intensivawhile ((nrVectors_p==0) || (crtVector<nrVectors_p)) begin

baTmp = $random;rowTmp = {$random} % (1<<nrRows_p);colTmp = {{$random}%64, 2’b00};adsTmp = {baTmp, rowTmp, colTmp};if ($random%2) begin

/* write(adsTmp, {16’b0, adsTmp[15:0]},{16’b0, adsTmp[15:0]+16’d1},{16’b0, adsTmp[15:0]+16’d2},{16’b0, adsTmp[15:0]+16’d3});

*/write(adsTmp, $random, $random, $random, $random);break({$random}%5+1);

endelse begin

/* read(adsTmp, {16’b0, adsTmp[15:0]},{16’b0, adsTmp[15:0]+16’d1},{16’b0, adsTmp[15:0]+16’d2},{16’b0, adsTmp[15:0]+16’d3});

*/read(adsTmp, 32’bx, 32’bx, 32’bx, 32’bx);break({$random}%5+1);

endif (nrVectors_p !== 0) begincrtVector <= crtVector + 1;end

end$display("%M %t NOTA: Terminare simulare.", $time);$stop;

end

O alternativa la corelarea datelor cu adresa la care se afla o constituie prezenta unuimodul de monitorizare si verificare a datelor vehiculate la interfata client-controller.Modulul monitor are doar porturi de intrare si nu influenteaza functionarea celorlaltemodule. Monitorul detine ın interior o matrice de memorie echivalenta SDRAM-ului. Aceasta memorie este actualizata simultan cu scrierile ce sunt comandate lainterfata client-controller SDRAM. In cazul unei citiri, monitorul primeste data citita

Page 245: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

5.11. Controller pentru memorie SDRAM 235

din SDRAM si o compara cu cea din memoria interna. Daca cele doua nu coincidınseamna ca modulul testat nu functioneaza corect.

De remarcat faptul ca pentru scurtarea timpului de simulare si a memoriei alocatede simulator se poate decide micsorarea artificiala a spatiului de memorie accesat decatre client, fara ca aceasta sa necesite o modificare asupra controllerului SDRAM.

Tnµ´¶³

module monitor(clk_i, // semnal de ceasreset_ni, // semnal de reset asincron, activ in 0// interfata clientrq_i, // cerere catre sdramCntrlack_i, // confirmare de la sdramCntrlrw_ni, // 1=citire, 0=scriereaddrClient_i, // adresa de la clientdataFromSdram_i, // date citite de clientdataToSdram_i // date scrise de client

);

parameter memSizeLog = 22;

input clk_i;input reset_ni;// interfata clientinput rq_i;input ack_i;input rw_ni;input[21:0] addrClient_i;input[31:0] dataFromSdram_i;input[31:0] dataToSdram_i;

// stocarea adresei curente de scriere/citirereg[21:0] addrClientReg;// matrice de memorie de referintareg[31:0] mirrorMem[(1<<memSizeLog)-1:0];reg[2:0] wrPend; // semnal activ pe durata burst-ului de scrierereg[2:0] rdPend; // semnal activ pe durata burst-ului de citire

wire acceptWr; // semnal activ in momentul confirmarii// unei scrieri

wire acceptRd; // semnal activ in momentul confirmarii// unei citiri

assign acceptWr = rq_i & ack_i & ~rw_ni;always @(posedge clk_i or negedge reset_ni)if (~reset_ni) wrPend <= 3’b0; else

wrPend <= {wrPend[1:0], acceptWr};

Page 246: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

236 CAPITOLUL 5. PROBLEME REZOLVATE

// actualizare memorie de referinta la burst de scrierealways @(posedge clk_i)if (acceptWr) begin

mirrorMem[addrClient_i] <= dataToSdram_i;addrClientReg <= addrClient_i;

endelse begin

if (wrPend[0]) beginmirrorMem[addrClientReg+1] <= dataToSdram_i;

endelse begin

if (wrPend[1]) beginmirrorMem[addrClientReg+2] <= dataToSdram_i;

endelse beginif (wrPend[2]) begin

mirrorMem[addrClientReg+3] <= dataToSdram_i;end

endend

end

assign acceptRd = rq_i & ack_i & rw_ni;always @(posedge clk_i or negedge reset_ni)if (~reset_ni) rdPend <= 3’b0; else

rdPend <= {rdPend[1:0], acceptRd};

// verificare memorie de referinta la burst de citirealways @(posedge clk_i)if (acceptRd) begin

if (mirrorMem[addrClient_i] !== dataFromSdram_i) begin$display("%M %t EROARE adresa=%d, dataExp=%h, dataSdram=%h.",$time, addrClient_i, mirrorMem[addrClient_i], dataFromSdram_i);

$stop;endelse begin

$display("%M %t NOTA adresa=%d, dataExp=%h, dataSdram=%h.",$time, addrClient_i, mirrorMem[addrClient_i], dataFromSdram_i);

endaddrClientReg <= addrClient_i;

endelse begin

if (rdPend[0]) beginif (mirrorMem[addrClientReg+1] !== dataFromSdram_i) begin$display("%M %t EROARE adresa=%d, dataExp=%h, dataSdram=%h.",

$time, (addrClientReg+1), mirrorMem[addrClientReg+1],

Page 247: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

5.11. Controller pentru memorie SDRAM 237

dataFromSdram_i);$stop;

end;endelse begin

if (rdPend[1]) beginif (mirrorMem[addrClientReg+2] !== dataFromSdram_i) begin

$display("%M %t EROARE adresa=%d, dataExp=%h, dataSdram=%h.",$time, (addrClientReg+2), mirrorMem[addrClientReg+2],\dataFromSdram_i);

$stop;end;

endelse beginif (rdPend[2]) begin

if (mirrorMem[addrClientReg+3] !== dataFromSdram_i) begin$display("%M %t EROARE adresa=%d,dataExp=%h,dataSdram=%h.",

$time, (addrClientReg+3), mirrorMem[addrClientReg+3],dataFromSdram_i);

$stop;end;

endend

endend

// initializare memorie de referintainteger i;integer sfertSpatiuAdresare = (1<<(memSizeLog-2));

initialfor (i=0;i<=(sfertSpatiuAdresare-1);i=i+1) begin

mirrorMem[i] <= {16’b0, i[15:0]};mirrorMem[i+sfertSpatiuAdresare] <= {16’b0, i[15:0]};mirrorMem[i+2*sfertSpatiuAdresare] <= {16’b0, i[15:0]};mirrorMem[i+3*sfertSpatiuAdresare] <= {16’b0, i[15:0]};

endendmodule

Page 248: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...
Page 249: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

Anexa A

MODELAREA SPICE AUNUI INVERSOR CMOS

Cu contributia lui Corneliu ZAHARIA.

A.1 Modelul SPICE al tranzistoarelor MOS

Pentru modelarea SPICE a unui circuit CMOS trebuie alese modelele potrivite pen-tru tranzistoarele NMOS si PMOS. Instantierea unui tranzistor MOS ıntr-un modelSPICE se face folosind urmatoarea sintaxa:

<numeInst> <nodDrena> <nodGrila> <nodSursa> <nodSubstrat> <model>L=<lungime> W=<latime>

Numele tranzistorului MOS, <numeInst>, trebuie sa ınceapa cu litera M.<nodDrena> <nodGrila> <nodSursa> <nodSubstrat> sunt numerele nodurilor

pentru drena, poarta, sursa si substrat. <model> este numele modelului de tranzistorfolosit (descris ın continuare). L si W sunt lungimea si latimea portii, exprimate ınmetri.

SPICE pune la dispozitie 4 modele de dispozitive MOSFET, care difera prinmodul de descriere a caracteristicilor (vezi sectiunea 1.5.1.2 din volumul I). Para-metrul LEVEL (”nivel”, ın limba engleza) specifica modelul care trebuie folosit:

• LEVEL=1: Model bazat pe ecuatiile dispozitivului idealizat, fara considerareatuturor efectelor secundare (efecte de ordin 2);

• LEVEL=2: Model fizic, care include majoritatea efectelor secundare;

• LEVEL=3: Semi-Empiric - ıncearca sincronizarea curbelor calculate cu celemasurate;

239

Page 250: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

240 ANEXA A. MODELAREA SPICE A UNUI INVERSOR CMOS

• LEVEL=4: Empiric.

Pentru modelele de nivelurile 1, 2 si 3, caracteristicile de curent continuu suntdefinite de parametrii tranzistorului: VTO, KP, LAMBDA, PHI si GAMMA. Acestiparametri sunt calculati de SPICE, daca parametrii de proces (NSUB, TOX, ...) suntdisponibili, dar valorile definite de utilizator suprascriu valorile calculate. In tabelulA.2 se prezinta lista completa a parametrilor dispozitivelor MOSFET pentru nivelurile1, 2 si 3.

In SPICE, modelul unui tranzistor are sintaxa:

.MODEL <nume_model> <tip_tranzistor> <lista_parametri>

Parametrii tipici de nivel 3 ai unor tranzistoare MOS ın tehnologia 1.2 µm sunt:

• Modelul unui tranzistor NMOS

.MODEL CMOSN NMOS LEVEL=3 PHI=0.600000 TOX=2.1200E-08+XJ=0.200000U+TPG=1 VTO=0.7860 DELTA=6.9670E-01 LD=1.6470E-07 KP=9.6379E-05+UO=591.7 THETA=8.1220E-02 RSH=8.5450E+01 GAMMA=0.5863+NSUB=2.7470E+16 NFS=1.98E+12 VMAX=1.7330E+05 ETA=4.3680E-02+KAPPA=1.3960E-01 CGDO=4.0241E-10 CGSO=4.0241E-10+CGBO=3.6144E-10 CJ=3.8541E-04 MJ=1.1854 CJSW=1.3940E-10+MJSW=0.125195 PB=0.800000

• Modelul unui tranzistor PMOS

.MODEL CMOSP PMOS LEVEL=3 PHI=0.600000 TOX=2.1200E-08+XJ=0.200000U+TPG=-1 VTO=-0.9056 DELTA=1.5200E+00 LD=2.2000E-08 KP=2.9352E-05+UO=180.2 THETA=1.2480E-01 RSH=1.0470E+02 GAMMA=0.4863+NSUB=1.8900E+16 NFS=3.46E+12 VMAX=3.7320E+05 ETA=1.6410E-01+KAPPA=9.6940E+00 CGDO=5.3752E-11 CGSO=5.3752E-11+CGBO=3.3650E-10 CJ=4.8447E-04 MJ=0.5027 CJSW=1.6457E-10+MJSW=0.217168 PB=0.850000

Semnul ”+” la ınceputul liniei ın modelul SPICE reprezinta o continuare a linieianterioare.

A.2 Ridicarea caracteristicii de sarcina IDS(VDS)pentru tranzistorul NMOS

O schema electrica pentru studiul caracteristicilor IDS(VDS) ale tranzistorului NMOSeste prezentata ın figura A.1.

Pentru descrierea SPICE a acestui circuit se foloseste modelul urmator:

Page 251: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

A.2. Ridicarea caracteristicii de sarcina IDS(VDS)pentru tranzistorul NMOS 241

NR Nume Parametru Unit. Implicit Ex.1 LEVEL identificator de nivel - 12 VTO tensiunea de prag la polarizare V 0.0 1.0

zero3 KP factorul de castig al procesului A/V2 2.0e-5 3.1e-54 GAMMA parametrul prag de substrat V1/2 0.0 0.375 PHI potentialul la suprafata V 0.6 0.656 LAMBDA modulatia lungimii canalului 1/V 0.0 0.02

(doar la MOS1 si MOS2)7 RD rezistenta ohmica de drena ohm 0.0 1.08 RS rezistenta ohmica de sursa ohm 0.0 1.09 CBD capacitatea jonctiunii F 0.0 20fF

drena-substrat (la polarizarede substrat zero)

10 CBS capacitatea jonctiunii F 0.0 20fFsursa-substrat (la polarizarede substrat zero)

11 IS curentul de saturatie al A 1.0e-14 1.0e-15jonctiunii de substrat

12 PB potentialul jonctiunii de V 0.8 0.87substrat

13 CGSO capacitatea de suprapunere F/m 0.0 4.0e-11grila-sursa pe unitatea delatime a canalului

14 CGDO capacitatea de suprapunere F/m 0.0 4.0e-11grila-drena pe unitateade latime a canalului

15 CGBO capacitatea de suprapunere F/m 0.0 2.0e-10grila-substrat pe unitatea delungime a canalului

16 RSH rezistenta pe patrat a zonelor ohm/[] 0.0 10.0difuzate drena si sursa

17 CJ capacitatea pe metru pentru F/m2 0.0 2.0e-4jonctiunea de substrat (lapolarizare de substrat zero)

18 MJ coeficientul de gradare a - 0.5 0.5jonctiunii de substrat

19 CJSW capacitatea de perete lateral a F/m 0.0 1.0e-9jonctiunii de substrat pe metru(la polarizare de substrat zero)

20 MJSW coeficientul de gradare pentru - 0.50peretele lateral a jonctiunii 0.33de substrat

21 JS curentul de saturatie aljonctiunii de substrat

Tabelul A.1Parametrii modelului SPICE a tranzistorului MOS (partea ıntai).

Page 252: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

242 ANEXA A. MODELAREA SPICE A UNUI INVERSOR CMOS

22 TOX grosimea stratului de oxid m 1.0e-7 1.0e-723 NSUB coeficientul de dopare a 1/cm3 0.0 4.0e15

substratului24 NSS densitatea starii de suprafata 1/cm2 0.0 1.0e1025 NFS densitatea starii de suprafata 1/cm2 0.0 1.0e10

(rapida)26 TPG tipul materialului grilei: - 1.0

+1 diferit de substrat-1 acelasi ca la substrat0 de Al

27 XJ adancimea jonctiunii metalurgice m 0.0 1Mmetalurgice

28 LD difuzia laterala m 0.0 0.8M29 UO mobilitatea de suprafata cm2/Vs 600 70030 UCRIT campul critic pentru degradarea V/cm 1.0e4 1.0e4

mobilitatii (doar la MOS2)31 UEXP exponentul campului critic ın - 0.0 0.1

degradarea mobilitatii(doar la MOS2)

32 UTRA coeficientul campului transversal - 0.0 0.3transversal pentru mobilitati(eliminat la MOS2)

33 VMAX viteza maxima de drift m/s 0.0 5.0e4a purtatorilor

34 NEFF coeficientul de sarcina (fixa si - 1.0 5.0mobila) pe lungimea totala acanalului (doar la MOS2)

35 KF coeficientul de zgomot aleatoriu - 0.0 1.0e-2636 AF exponentul coeficientului de - 1.0 1.2

zgomot aleatoriu37 FC coeficientul pentru formula - 0.5

capacitatii de saracirela polarizare directa

38 DELTA efectul de largire pe tensiunea - 0.0 1.0de prag (MOS2 si MOS3)

39 THETA modulatia mobilitatii 1/V 0.0 0.1(doar la MOS3)

40 ETA reactia ın regim static - 0.0 1.0(doar la MOS3)

41 KAPPA factorul pentru campul de - 0.2 0.5saturatie (doar la MOS3)

42 TNOM valoarea temperaturii C 27 50Tabelul A.2

Parametrii modelului SPICE a tranzistorului MOS (partea a doua).

Page 253: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

A.2. Ridicarea caracteristicii de sarcina IDS(VDS)pentru tranzistorul NMOS 243

Figura A.1 Schema electrica pentru ridicarea caracteristicii de sarcina a tranzistoruluiNMOS.

* Definirea modelului tranzistorului NMOS* Numele modelului este CMOSN.MODEL CMOSN NMOS LEVEL=3 PHI=0.600000 TOX=2.1200E-08 XJ=0.200000U+TPG=1 VTO=0.7860 DELTA=6.9670E-01 LD=1.6470E-07 KP=9.6379E-05+UO=591.7 THETA=8.1220E-02 RSH=8.5450E+01 GAMMA=0.5863+NSUB=2.7470E+16 NFS=1.98E+12 VMAX=1.7330E+05 ETA=4.3680E-02+KAPPA=1.3960E-01 CGDO=4.0241E-10 CGSO=4.0241E-10+CGBO=3.6144E-10 CJ=3.8541E-04 MJ=1.1854 CJSW=1.3940E-10+MJSW=0.125195 PB=0.800000

* Instantierea tranzistorului M1* Drena este legata la nodul VDD* Grila este legata la nodul IN* Sursa este legata la nodul GND* Substratul este legat la nodul GND* Modelul de tranzistor este CNOMSN* Lungimea portii este 4 um* Latimea portii este 6 umM1 VDD IN GND GND CMOSN L=4U W=6U

* Instantierea sursei de tensiune VDD* Sursa de tensiune triunghiulara* Perioada de 30 msvdd VDD GND pwl (0ns,0V 15000ns,5V 30000ns,0V r

* Instantierea sursei de tensiune VGS* Sursa de tensiune constanta: 30 ms - 0V, 30 ms - 1V* 30 ms - 2V, 30 ms - 3V, 30 ms - 4V, 30 ms - 5Vvi1 IN GND pwl (0ns,0V 30000ns,0V 30001ns,1V 60000ns,1V 60001ns,2V+90000ns,2V 90001ns,3V 120000ns,3V 120001ns,4V 150000ns,4V 150001ns,5V+180000ns,5V

Page 254: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

244 ANEXA A. MODELAREA SPICE A UNUI INVERSOR CMOS

Caracteristica de sarcina a acestui tranzistor este prezentata ın figura A.2.

Figura A.2 Caracteristica de sarcina a tranzistorului NMOS.

A.3 Modelul SPICE al inversorului CMOS

Dupa ce modelele tranzistoarelor folosite au fost definite (sau alese dintr-o bibliotecade tehnologie), se poate descrie circuitul de studiat. Descrierea SPICE a inversoruluiCMOS urmareste schema din figura A.3.

Modelul SPICE este urmatorul:

* Modelul tranzistorului NMOS.MODEL CMOSN NMOS LEVEL=3 PHI=0.600000 TOX=2.1200E-08 XJ=0.200000U+TPG=1 VTO=0.7860 DELTA=6.9670E-01 LD=1.6470E-07 KP=9.6379E-05+UO=591.7 THETA=8.1220E-02 RSH=8.5450E+01 GAMMA=0.5863+NSUB=2.7470E+16 NFS=1.98E+12 VMAX=1.7330E+05 ETA=4.3680E-02+KAPPA=1.3960E-01 CGDO=4.0241E-10 CGSO=4.0241E-10+CGBO=3.6144E-10 CJ=3.8541E-04 MJ=1.1854 CJSW=1.3940E-10+MJSW=0.125195 PB=0.800000

* Modelul tranzistorului PMOS.MODEL CMOSP PMOS LEVEL=3 PHI=0.600000 TOX=2.1200E-08 XJ=0.200000U+TPG=-1 VTO=-0.9056 DELTA=1.5200E+00 LD=2.2000E-08 KP=2.9352E-05+UO=180.2 THETA=1.2480E-01 RSH=1.0470E+02 GAMMA=0.4863

Page 255: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

A.4. Determinarea caracteristicii de transfer si a parametrilor inversorului CMOS 245

CGSn CSBn

VDD CGSp

D

S

D

SCCOX CGB

iDp

VDD

iDn

CL

b)a)

CDBpCDBnCGDn

CGDp

vI

CSBp

vI

vO

iC

vO vI

nMOS

pMOS

pMOS

nMOS

Figura A.3 Inversor CMOS.

+NSUB=1.8900E+16 NFS=3.46E+12 VMAX=3.7320E+05 ETA=1.6410E-01+KAPPA=9.6940E+00 CGDO=5.3752E-11 CGSO=5.3752E-11+CGBO=3.3650E-10 CJ=4.8447E-04 MJ=0.5027 CJSW=1.6457E-10+MJSW=0.217168 PB=0.850000

* Tranzistorul NMOS legat in schema inversorului CMOSM1 OUT IN GND GND CMOSN L=4U W=3U

* Tranzistorul PMOS legat in schema inversorului CMOSM2 OUT IN VDD VDD CMOSP L=4U W=6U

* Sursa de tensiune de alimentare a circuitului inversorvdd VDD GND 5V

A.4 Determinarea caracteristicii de transfer si a pa-rametrilor inversorului CMOS

Urmatorii parametrii vor fi calculati pentru inversorul CMOS:

• Nivelurile de tensiune;

• Marginea de zgomot;

• Timpul de propagare;

• Consumul de putere;

Page 256: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

246 ANEXA A. MODELAREA SPICE A UNUI INVERSOR CMOS

Figura A.4 Caracteristica de transfer a tranzistorului CMOS.

• Factorul de merit.

A.4.1 Nivelurile de tensiune

Nivelurile de tensiune se pot determina folosind caracteristica statica a inversoruluiMOS, folosind ca semnal de intrare o tensiune triunghiulara:

* Sursa de tensiune triunghiulara* Cu perioada de 60 msvi1 IN gnd pwl (0ns,0V 30000ns,5V 60000ns,0V r

Se poate determina caracteristica statica Vout = f(Vin) prezentata ın figura A.4.Rezulta parametrii statici:

Page 257: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

A.4. Determinarea caracteristicii de transfer si a parametrilor inversorului CMOS 247

VIL = 1.75 VVIH = 2.5 VVOL = 0.8 VVOH = 4.6 V

A.4.2 Marginea de zgomot

Marginea de zgomot se calculeaza ca:

MH = VOH-VIHML = VIL-VOL

Pentru inversorul studiat, acesta este:

MH = 4.6 V - 2.5 V = 2.1 VML = 1.75 V - 0.8V = 0.95 V

A.4.3 Timpul de propagare

Timpul de propagare se determina folosind diferite scenarii pentru factorul de ın-carcare de iesire. Pentru aceasta se adauga o capacitate pe sarcina. Bibliotecile detehnologie folosite pentru sinteza circuitelor integrate digitale folosesc un model decaracterizare a timpilor de propagare ın functie de timpul de tranzitie a semnalului deintrare si a capacitatii totale de iesire. Timpul de tranzitie reprezinta timpul ın caresemnalul de intrare ısi modifica amplitudinea ıntre 10 si 90 procente din tensiunea dealimentare. Capacitatea totala de iesire reprezinta suma capacitatilor pe care circuitulde studiat genereaza semnalul de iesire.

Un exemplu de astfel de matrice pentru caracterizarea timpilor de propagare este:

lu_table_template(inv_template) {variable_1 : input_net_transition;variable_2 : total_output_net_capacitance;index_1 ("1.000, 2.000, 3.000");index_2 ("0.100, 0.400, 0.700");

}

Rezulta ca, pentru o caracterizare completa, este necesara o masurare a timpilorde propagare folosind fiecare din combinatiile timpului de tranzitie a semnalului deintrare si capacitatii totale de iesire.

Daca timpul de tranzitie a semnalului de intrare este 1ns si capacitatea de iesireeste de 0.1 pF, modelul SPICE care masoara timpii de propagare ai inversoruluiCMOS este urmatorul:

* instantierea tranzistoarelor MOS care formeaza inversorul CMOSM1 OUT IN GND GND CMOSN L=4U W=3UM2 OUT IN VDD VDD CMOSP L=4U W=6U

* Instantierea capacitatii de sarcina (0.1 pF)C OUT GND 0.1p

Page 258: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

248 ANEXA A. MODELAREA SPICE A UNUI INVERSOR CMOS

Figura A.5 Diagramele de tensiune la intrare (a) si la iesire (b) ale inversorului CMOS.

* Sursa de tensiune de alimentare a circuitului inversorvdd VDD GND 5V

* Tensiunea de intrare dreptunghiulara,* cu timpul de tranzitie de 1 ns* si perioada de 601 nsvi1 IN GND pwl (0ns,0V 300ns,0V 301ns,5V 600ns,5V 601ns,0V r

Graficul tensiunii de intrare si de iesire este prezentat ın figura A.5.Masurarea pe grafic a timpului de propagare poate fi inexacta, de aceea se pre-

fera masurarea automata a acestuia. In SPICE, aceasta masurare se face folosindurmatoarele comenzi:

* Masurarea timpului tlh intre valoarea de* 0.5 V si 4.5 V (10% - 90%) a tensiunii de iesire* pe prima panta ascendenta a semnalului de iesire

Page 259: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

A.4. Determinarea caracteristicii de transfer si a parametrilor inversorului CMOS 249

.measure tran tlh trig v(out) val=0.5 td=10n rise=1+ targ v(out) val=4.5 td=10n rise=1

* Masurarea timpului thl intre valoarea de* 4.5 V si 0.5 V (90% - 10%) a tensiunii de iesire* pe prima panta descendenta a semnalului de iesire.measure tran thl trig v(out) val=4.5 td=10n fall=1+ targ v(out) val=0.5 td=10n fall=1

* Masurarea timpului tplh intre valoarea de* 2.5 V a tensiunii de intrare si 2.5 V a* tensiunii de iesire (50% - 50%)* intre prima panta descendenta a semnalului de intrare* si prima panta ascendenta a semnalului de iesire.measure tran tplh trig v(in) val=2.5 td=10n fall=1+ targ v(out) val=2.5 td=10n rise=1

* Masurarea timpului tphl intre valoarea de* 2.5 V a tensiunii de intrare si 2.5 V a* tensiunii de iesire (50% - 50%)* intre prima panta ascendenta a semnalului de intrare* si prima panta descendenta a semnalului de iesire.measure tran tphl trig v(in) val=2.5 td=10n rise=1+ targ v(out) val=2.5 td=10n fall=1

Rezultatele sunt afisate ın raportul SPICE:

****** transient analysis tnom= 25.000 temp= 25.000 ******tlh = 3.4572E-09 targ= 6.4571E-08 trig= 6.1114E-08thl = 1.8614E-09 targ= 3.2904E-08 trig= 3.1043E-08tplh = 1.8225E-09 targ= 6.2323E-08 trig= 6.0500E-08tphl = 1.2219E-09 targ= 3.1722E-08 trig= 3.0500E-08

Rezulta:

Timpul de tranzitie low-high: tlh = 3.45 nsTimpul de tranzitie high-low: thl = 1.86 nsTimpul de propagare low-high: tplh = 1.82 nsTimpul de propagare high-low: tphl = 1.22 ns

Similar, daca timpul de tranzitie a semnalului de intrare este 1ns si capacitateade iesire de 0.4 pF, circuitul care masoara timpii de propagare se modifica astfel:

* Instantierea capacitatii de sarcina (0.4 pF)C OUT GND 0.4p

Rezulta raportul SPICE:

tlh = 1.0969E-08 targ= 7.2840E-08 trig= 6.1871E-08

Page 260: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

250 ANEXA A. MODELAREA SPICE A UNUI INVERSOR CMOS

Figura A.6 Caracteristica de transfer si caracteristica curentului de drena pentru inversorulCMOS.

thl = 5.8944E-09 targ= 3.7388E-08 trig= 3.1493E-08tplh = 5.4046E-09 targ= 6.5905E-08 trig= 6.0500E-08tphl = 3.3103E-09 targ= 3.3810E-08 trig= 3.0500E-08

Rezulta timpii de transfer si de propagare:

tlh = 10.96 nsthl = 5.89 nstplh = 5.40 nstphl = 3.31 ns

A.4.4 Consumul de putere

Figura A.6 prezinta grafic dependenta curentului IDD, ca functie de tensiunea deintrare.

Asa cum se observa pe grafic, consumul de curent are loc doar la tranzitia tensiuniide intrare. Puterea maxima disipata de circuit este:

Pd= Vdd*Idd = 5V x 54uA = 270uW

Page 261: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

A.4. Determinarea caracteristicii de transfer si a parametrilor inversorului CMOS 251

Curentul de intrare este foarte mic, deci puterea consumata la intrare este negli-jabila.

A.4.5 Factorul de merit

Factorul de merit se calculeaza ca fiind:

PDP = Pd*tp

Pentru o sarcina de iesire de 0.1 pF:

tPLH = 1.82 ns, tPHL = 1.22 ns

Timpul de propagare mediu este:

tp = (1.82 ns + 1.22 ns)/2 = 1.52ns

Rezulta factorul de merit:

PDP = 270uW x 1.52ns = 410.4E-15 J

Page 262: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...
Page 263: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

Anexa B

CUVINTE CHEIEREZERVATE ALEVERILOG HDL

Limbajul Verilog are un numar de cuvinte cheie rezervate. Acestea sunt scrise ın-totdeauna cu minuscule. Cuvintele rezervate nu pot fi folosite pentru a desemnaidentificatori.

always and assign begin bufbufif0 bufif1 case casex casezcmos deassign default defparam disableedge else endspecify end endcaseendfunction endmodule endprimitive endtable endtaskevent for force forever forkfunction highz0 highz1 if initialinout input integer join largemedium module macromodule nand negedgenmos nor not notif0 notif1or output parameter pmos posedgeprimitive pulldown pullup pull0 pull1rcmos reg release repeat rnmosrpmos rtran rtranif0 rtranif1 scalaredsmall specify specparam strength strong0strong1 supply0 supply1 table tasktime tran tranif0 tranif1 tritriand trior trireg tri0 tri1vectored wait wand weak0 weak1while wire wor xnor xor

253

Page 264: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...
Page 265: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

Anexa C

MEMENTO LIMBAJVERILOG

Aceasta anexa prezinta limbajul Verilog foarte condensat. S-au inclus doar acelespecificatii folosite frecvent ın modelarea sistemelor digitale ce urmeaza a fi sintetizate.

Forma grafica permite copierea paginii pentru o referinta rapida.Versiunea electronica poate fi accesata de pe situl cartii:

http://vega.unitbv.ro/electronica_digitala

255

Page 266: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

256 ANEXA C. MEMENTO LIMBAJ VERILOG

Figura C.1 Memento limbaj Verilog.

Page 267: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

Anexa D

CONTINUT SIT CARTE

Situl web al acestei cartii este:

http://vega.unitbv.ro/electronica_digitala

Pe situl cartii pot fi gasite:

• Modelele Verilog ale tuturor circuitelor prezentate ın carte.

• Mediile de testare Verilog ale tuturor circuitelor prezentate ın carte.

• Bibliotecile de simulare specifice tehnologiei eASIC.

• Forma electronica a paginii cu descrierea condensata a limbajului Verilog.

• Referinta web la o versiune de evaluare a unui simulator Verilog. O licentade evaluare pentru 30 de zile se poate obtine urmand indicatiile din pagina deweb si folosind parola:

ElectronicaDigitalaSimulatorHDL

257

Page 268: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...
Page 269: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

Bibliografie

[1] J. Bhasker. A Verilog HDL Primer, 2nd Edition. Star Galaxy Publishing, ISBN0-9650391-7-X, 1999.

[2] eASIC Corp. www.easic.com. Referinta web.

[3] Mentor Graphics. www.model.com. Referinta web.

[4] Micron Technology Inc. www.micron.com. Referinta web.

[5] Synplicity Inc. www.synplicity.com. Referinta web.

[6] Open Verilog International. OVI Verilog HDL LRM Version 1.0. 1991.

[7] Z. Navabi. Verilog Digital System Design. McGraw-Hill, ISBN 0-07-047164-9,1999.

[8] D. Smith. HDL Chip Design. Doone Publications, ISBN 0-9651934-3-8, 1996.

[9] S. Sutherland. The Verilog PLI Handbook, 1th Edition. Kluwer Academic Pub-lisher, ISBN 0-7923-8489-X, 1999.

[10] D. Thomas, P. Moorby. The Verilog Hardware Description Language, 4th Edition.Kluwer Academic Publisher, ISBN 0-7923-8166-1, 1998.

259

Page 270: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

Index

abreviereASIC, 3EDA, 6HDL, 1LRM, 7PLI, 127RTL, 2VHDL, 2

baze de numeratie, 27

cod Verilogcodificator, 83decodificator, 43, 84multiplexor, 18–20, 81numarator, 13registru cu functii multiple, 55sumator, 15–17vot majoritar, 12

comentarii // /* */, 25concurenta evenimentelor, 7

directivedefine/undefine, 63ifdef/ifndef/else/endif, 65include, 66timescale, 6, 66

functii sistemrandom, 123time, 123

functionalitateautomate

cu ıntarziere, 96imediate, 96Mealy, 96Moore, 96

bistabil, 86bistabil T, 88

codificator, 83decodificator, 84latch, 86multiplexor, 81

glitch, 13

ierarhieaccesarea semnalelor, 126modul memorie, 111

mediu de simulare/testare, 21model SPICE

inversor CMOS, 240tranzistor NMOS, 240tranzistor PMOS, 240

modelareautomate sincrone, 94bistabil D, 86bistabil T, 88circuite logice combinationale

always, 80assign, 79

codificator, 81cu tranzistoare definite ın limbaj, 115decodificator, 84latch, 85memorii, 107multiplexor, 81numarator, 90porti logice definite ın limbaj, 113primitive definite de utilizator, 124reset sincron/asincron, 87

modul, 7, 25

netlist, 2, 157, 213numere aleatorii, 123

one-hot, 217

260

Page 271: Dan Nicula Gheorghe Toacse ELECTRONIC˘A DIGITAL˘A VOL. II ...

INDEX 261

proiectarebottom-up, 3top-down, 4

sintaxaalways, 46assign, 44descriere modul, 9functie, 105initial, 46instantiere modul, 11specificatii secventiale, 47task, 104

specificatii concurentealways, 46assign, 44generate, 109initial, 46

specificatii secventialeatribuire, 47

blocanta =, 48neblocanta <=, 49

control temporal, 59ıntarziere, 60evenimente (posedge/negedge), 61

if, 53iterative

for, 58forever/disable, 57repeat, 58while, 58

lista de senzitivitati, 80selectie

case, 56casex, 56casez, 56

task, 207task-uri sistem

display, 119finish, 122fopen/fclose/fmonitor/fdisplay/fstrobe/fwrite,

120monitor, 119readmemb/readmemh, 120stop, 122strobe, 119verificari temporale, 122

write, 119

Verilog, 1, 133