Avtor: Klemen Bravhar
Sodobni digitalni sistemi zahtevajo vedno večjo procesno moč, nizko zakasnitev in visoko stopnjo prilagodljivosti.
V tem okolju igrajo ključno vlogo polja programabilnih logičnih vrat oziroma FPGA vezja (ang. Field Programmable Gate Arrays). Za razliko od klasičnih procesorjev, kjer programsko opremo prilagajamo fiksni arhitekturi, nam FPGA omogoča, da strojno opremo dobesedno »ukrojimo« po meri specifične naloge. Vendar pa pot od ideje do delujočega silicija ni neposredna; zahteva strukturiran in večplasten pristop.
Arhitekturna zasnova kot temelj uspeha: Pri večini projektov, še posebej tistih z visoko stopnjo kompleksnosti, se proces ne začne s pisanjem kode, temveč z načrtovanjem visokonivojske arhitekture. V tej fazi inženirji določijo pretok podatkov, hierarhijo modulov in komunikacijske protokole. Brez premišljene arhitekture tvegamo, da bo končni dizajn neučinkovit, težaven za razhroščevanje ali pa sploh ne bo dosegel zahtevanih specifikacij. Ko je načrt potrjen, sledi njegova realizacija v digitalno obliko z uporabo opisnih jezikov strojne opreme, med katerimi še vedno prevladuje VHDL.
Ta vsebina je samo za naročnike
Več kot le koda: Prehod v fizični svet
Pogosta zmota začetnikov je prepričanje, da je pisanje sintaktično pravilne VHDL kode zadnji korak pred zagonom sistema. V resnici je to le polovica opravljenega dela. Digitalno vezje v VHDL jeziku obstaja v idealiziranem, abstraktnem svetu, medtem ko mora končni izdelek delovati na fizičnem čipu z omejenimi viri. Tu nastopi kritični element načrtovanja: datoteka z omejitvami (ang. constraint file).
Brez te datoteke razvojno orodje nima informacij o tem, kako naj virtualni dizajn preslika v realnost. Datoteka z omejitvami definira:
Fizično lokacijo: Na kateri pin čipa je povezan določen vhod ali izhod?
Uporabo virov: Katere notranje komponente (npr. DSP bloki, RAM bloki) naj se uporabijo in kje v strukturi čipa naj bodo postavljene.
Električne standarde: Kakšne napetostne nivoje in hitrosti morajo podpirati vhodno-izhodne enote.
Časovno skladnost (Timing Closure): Morda najzahtevnejši del implementacije, zlasti pri sekvenčnih vezjih, pa je doseganje časovne skladnosti (ang. timing closure). V svetu visokih frekvenc signali potrebujejo določen čas, da prepotujejo pot od enega pomnilnega elementa do drugega. Če so te poti predolge ali če so zakasnitve (ang. skew) prevelike, sistem ne bo deloval zanesljivo.
Z uporabo datoteke z omejitvami orodju postavimo stroge časovne okvirje, v katerih morajo signali doseči svoj cilj. Doseganje teh zahtev je pogosto iterativen proces, ki zahteva globoko razumevanje tako arhitekture kot tudi fizikalnih lastnosti izbranega FPGA vezja. Le s popolnim usklajevanjem kode, arhitekture in fizičnih omejitev lahko zagotovimo, da bo končni digitalni sistem deloval robustno in brez napak.



V pričujočem članku se bomo poglobili v praktično uporabo datotek z omejitvami (ang. constraints file), ki so nepogrešljiv del načrtovanja digitalnih sistemov. V prvem delu se bomo osredotočili na konfiguracijo vhodno-izhodnih (I/O) enot. Spoznali bomo, kako pravilno določiti fizične pine na FPGA vezju, ter definirati električne lastnosti, kot so napetostni nivoji (npr. LVCMOS33), hitrosti preklopov (ang. slew rate) in zmogljivost krmiljenja (ang. drive strength).
Nadalje bomo obravnavali osnove časovne skladnosti. V tej sekciji bomo pojasnili, kako v datoteko z omejitvami zapisati definicije ur (ang. clock constraints), ki so nujne, da razvojno orodje zagotovi pravilno delovanje sekvenčnih logičnih povezav znotraj zastavljenih časovnih okvirov.
Iz vsebine tokratnega prispevka smo namenoma izpustili napredne tehnike fizične postavitve internih komponent, kot so namenski bloki za digitalno obdelavo signalov (DSP) ali pomnilniški bloki (BRAM). Ročna razporeditev teh elementov na specifične lokacije znotraj silicijeve strukture je namreč kompleksna naloga, ki zahteva predhodno poznavanje arhitekture samega FPGA vezja in je primerna za zahtevnejše optimizacije.
Ker trg FPGA tehnologij ponuja pestro izbiro razvojnih okolij, od katerih ima vsako svoje specifične sintaktične zahteve za zapis omejitev, bomo v naših primerih uporabili okolje AMD Vivado. To orodje uporablja standardni format XDC (ang. Xilinx Design Constraints), ki temelji na industrijskem standardu SDC (Synopsys Design Constraints), kar pomeni, da bo pridobljeno znanje v veliki meri prenosljivo tudi na druga sorodna orodja.
Praktični primer: Veriga negatorjev za preizkus časovnih omejitev
Da bi v praksi najbolje ponazorili izzive, s katerimi se srečujejo načrtovalci digitalnih sistemov pri zagotavljanju časovne skladnosti, si bomo ogledali namerno zasnovan, a poučen primer. Uporabili bomo vezje, ki na prvi pogled deluje trivialno, vendar v svoji strukturi skriva ključno težavo za algoritme postavitve in usmerjanja (place and route).
Arhitektura testnega vezja
Naše testno vezje (slika 1) temelji na dveh sekvenčnih elementih – registrih tipa D-flip-flop (DFF). Prvi (izvorni) register ob naraščajoči fronti sistemske ure zajame podatek z vhodnega priključka (pina d_in), drugi (ponorni d_out) register mora ta podatek varno shraniti ob naslednji fronti ure (clk).
Ključni del primera se nahaja med njima: v to kombinatorno pot bomo vstavili verigo stotih zaporedno vezanih logičnih negatorjev (vrat NE). Da bi zagotovili celovitost poti, smo izhod drugega flip-flopa povezali s fizičnim izhodnim priključkom na čipu. Primer VHDL kode se lahko najde na github.com [1].
Implementacija v okolju AMD Vivado: Pri implementaciji v orodju AMD Vivado moramo biti pozorni na napredne algoritme za optimizacijo. Ker bi orodje hitro ugotovilo, da sto zaporednih negatorjev logično ustreza zgolj eni negaciji (ali celo neposredni povezavi, če bi bilo število vrat sodo), bi celotno verigo med postopkom sinteze odstranilo. Da to preprečimo in orodje prisilimo v dejansko uporabo fizičnih virov čipa (tabel LUT), bomo v kodi uporabili atribut DONT_TOUCH.



S tem preprostim, a učinkovitim primerom bomo v nadaljevanju analizirali poročila o časovnih parametrih (timing reports) in opazovali, kako se orodje trudi – ter včasih spodleti – pri poskusu umeščanja takšnega načrta v tesne časovne okvirje sodobnih FPGA vezji.
Praktični primer uporabe datoteke omejevanja za vhodno izhodne priključke
Kot je razvidno iz zgornje sheme,smo za naš praktični primer uporabili vhodne in izhodne signale, ki so poenostavljeni in omejeni na en sam bit. Čeprav so v kompleksnejših projektih ti signali pogosto del širših podatkovnih vodil, nam enobitna zasnova omogoča lažji fokus na same fizikalne omejitve.
V strokovni literaturi je pogosto poudarjeno, da je ena največjih prednosti vezij FPGA prav izjemna prilagodljivost njihovih vhodno-izhodnih priključkov (pinov). Ti priključki služijo kot most med notranjo logiko vezja in zunanjim svetom, zato se morajo prilagajati specifičnim zahtevam tako pasivnih kot aktivnih komponent, ki so fizično povezane s vezjem FPGA.
Poleg standardnih nastavitev napetosti in toka, datoteka z omejitvami določa naslednje ključne fizikalne lastnosti:
Bidirekcionalnost (Dvosmernost): Mnogi protokoli, kot sta I2C ali krmiljenje zunanjih pomnilnikov, zahtevajo, da isti pin deluje tako kot vhod kot izhod. Te bidirekcionalne priključke v jeziku VHDL definiramo s tipom inout. Ključ do njihovega delovanja je stanje visoke impedance (označeno z ‘Z’), ki fizično odklopi izhodni gonilnik in priključku omogoči, da »posluša« signale, ki jih pošiljajo druge komponente na istem vodilu.
Napetostni nivoji in standardi: I/O enote podpirajo standarde, kot so LVCMOS, LVTTL ali SSTL. Izbira je odvisna od napajalne napetosti banke (npr. 1,8 V, 2,5 V ali 3,3 V).
Diferenčni pari: Za visoke hitrosti prenosa podatkov lahko pini delujejo v parih (npr. standard LVDS). Tukaj se informacija prenaša kot napetostna razlika med dvema priključkoma, kar drastično zmanjša vpliv elektromagnetnega šuma in omogoča večje hitrosti.
Izhodni tok (Drive Strength): V datoteki z omejitvami lahko določimo, kolikšen tok lahko posamezen priključek v izhodnem načinu dostavi (npr. 4 mA, 8 mA, 12 mA), kar vpliva na integriteto signala.
Hitrost preklopa (Slew Rate): Določimo lahko, kako strme so fronte signala. Hitrejši preklop je nujen za visoke frekvence, medtem ko počasnejši preklop (Slow) zmanjšuje odboje in elektromagnetne motnje (EMI).
Notranji upori (Pull-up/Pull-down): Programsko lahko aktiviramo notranje upore, ki poskrbijo, da signal ne »lebdi« v nedoločenem stanju (ang. floating), ko na vodilu ni aktivnega krmiljenja.
V našem primeru bomo na poenostavljenem vezju definirali vhodne in izhodne priključke glede na specifikacije razvojne plošče Arty 7 [2] katere glavna komponenta je FPGA AMD Artix-7 (XC7A100T-1CSG324C). Če se osredotočimo na pina B9 in H5, nam priključek B9 služil kot vhod (d_in) povezan s stikalom. Nahaja se na banki 16, ki je napajana z napetostjo 3,3 V. Medtem ko priključek H5 nam bo služil kot izhod (d_out) povezan na LED in se nahaja na banki 35, kjer znaša napajalna napetost 3,3 V.
Poleg podatkovnih signalov ne smemo pozabiti na ključni vhodni urin signal (clk). Ta je povezan z oscilatorjem IC2 z generirano frekvenco 100MHz, katerega izhod je povezan na FPGA-ajev priključek E3. Tudi ta se nahaja na banki 35 z napajalno napetostjo 3,3 V. Različne napetosti na bankah so kritičen podatek, saj moramo v orodju pravilno nastaviti standarde I/O (npr. LVCMOS33 ali LVCMOS18), da ne poškodujemo komponent.
Načini vnosa omejitev v projekt
Omenjene lastnosti lahko v projekt Vivado vnesemo na dva načina:
Grafični vmesnik (GUI): Ta način je uporabniku prijazen in intuitiven, saj Vivado na podlagi naših klikov samodejno generira ustrezno datoteko z omejitvami.
Ročni zapis (XDC datoteka): Če poznamo pravilne ukaze (Tcl), lahko datoteko z omejitvami spišemo sami, kar nam omogoča hitrejše delo pri večjem številu priključkov.
Vnos preko grafičnega vmesnika izvedemo po naslednjem postopku: Najprej zaženemo sintezo načrta (Run Synthesis). Ko se postopek zaključi, izberemo možnost za odpiranje rezultatov sinteze (Open Synthesized Design). V zgornji orodni vrstici nato spremenimo pogled na Layout -> I/O Planning. Odprlo se bo okno, ki je prikazano na sliki1, kjer lahko za vsak pin določimo njegovo lokacijo (Package Pin) in napetostni standard (I/O Std).
Po določitvi vseh lastnosti in fizične razporeditve vhodno-izhodnih priključkov nastavitve shranimo, nakar orodje samodejno generira datoteko omejitev (angl. Constraint File) s končnico .xdc. Ta datoteka predstavlja ključen most med vašo kodo in strojno opremo, saj določa, na katere fizične priključke FPGA vezja se bodo povezali signali iz načrta. Pri obsežnejših in zahtevnejših projektih načrtovalci te datoteke pogosto urejajo ali pišejo ročno, saj to omogoča hitrejše spreminjanje parametrov in natančnejše določanje časovnih omejitev, ki so nujne za stabilno delovanje kompleksnih digitalnih sistemov. Sedaj ko smo določili lasnosti in pozicijo vhodno izhodnih priključkev lahko shranimo in nam bo oradje zgeneriralo datoteko omejitev z končnico ».xdc«. To datoteko lahko napišemo tudi kadar so projekti bolj zahtevni in kompleksni. V našem primeru je zgeneriral datoteko z imenom zakasnilni_clen.xdc in zgleda kot prikazuje slika 3.
Časovne omejitve (Timing constraints)
Nato se posvetimo časovnim izzivom (angl. timing challenges), ki predstavljajo enega najzahtevnejših vidikov načrtovanja vezji FPGA. Podobno, kot vsa druga integrirana vezja, so tudi FPGA omejena z najvišjo delovno frekvenco, pri kateri implementirana digitalna struktura še zagotavlja zanesljivo in stabilno delovanje.
S tem namenom mora načrtovalec digitalnih sistemov poglobljeno razumeti soodvisnost med posameznimi logičnimi sklopi. Vsaka logična funkcija, ki se izvede znotraj iskalnih tabel (LUT), in vsaka fizična povezava med njimi, namreč vnašata določeno zakasnitev širjenja signala (angl. propagation delay). Ko načrtujemo sisteme, ki delujejo pri visokih frekvencah, postane ključno obvladovanje t.i. ‘kritične poti’ (angl. critical path). To je najdaljša pot, ki jo mora signal preteči med dvema registroma v enem urinem ciklu. Če je ta pot predolga, signal ne doseže cilja pravočasno, kar privede do napak v delovanju. Zato je za uspešno implementacijo kompleksnih struktur nujno poznavanje arhitekture FPGA vezja in optimizacija kode za doseganje zahtevanih časovnih parametrov.
Pri načrtovanju visokofrekvenčnih FPGA sistemov se moramo soočiti z dvema kritičnima parametroma: Setup time Tsetup in Hold time Thold.


Setup time določa, kako dolgo mora biti signal stabilen pred prihodom urinega takta. Če je naša logična pot (npr. veriga 100 negatorjev) prepočasna, signal ne doseže ciljnega registra pravočasno, kar povzroči t.i. setup violation. Po drugi strani pa Hold time zahteva, da signal ostane nespremenjen še kratek čas po udarcu ure, kar preprečuje napake pri samem vpisu podatka.
V orodju Vivado te omejitve spremljamo preko parametra Slack. Če je Slack negativen, pomeni, da smo kršili časovne pogoje in da naš dizajn pri izbrani frekvenci ne bo deloval zanesljivo. Rešitev v takšnih primerih je bodisi znižanje frekvence ure bodisi uporaba tehnike ‘pipelining’, kjer logično pot razbijemo na več manjših delov z dodatnimi registri (v tem primeru moramo paziti na funkcionlano skladnost).
Primer izračuna časov priprave in zadržanja (Setup and Hold time)
Čeprav vsa sodobna orodja za načrtovanje vezij FPGA te izračune izvajajo samodejno, je za razumevanje sporočil o neuspešnem časovnem zapiranju projekta (timing closure) nujno poznavanje teorije o izračunavanju časov priprave (ang. Setup) in zadržanja (ang. Hold). Spodnja Slika 4 prikazuje časovne zakasnitve posameznih komponent in povezav med njimi, ki ključno vplivajo na stabilnost sistema.
Čas zadrževanja – Hold time
Pri izračunu časa zadržanja (ang. Hold time) v digitalnem vezju moramo upoštevati dve različni poti. Prva je podatkovna pot (ang. data path), ki poteka preko sekvenčnih vezij in kombinatorne logike, druga pa je pot urinega signala (ang. clock path). Da pravilno izračunamo časovno rezervo (ang. Hold Slack), moramo analizirati najslabši možni scenarij: upoštevati moramo najkrajšo (najhitrejšo) možno zakasnitev na podatkovni liniji in najdaljšo (najpočasnejšo) zakasnitev na poti ure.
Zakasnitev ure:
Tclk = tmax1 + tmaxbuff + tmax3 + tholdff2 = 3ns + 9ns + 3ns +2ns = 17ns
Zakasnitev podatkovne poti:
Td = tmin2+ tmin_clk-2-q_ff1 + tmin4 + tmin_neg + tmin5 = 1ns + 9ns + 1ns + 6ns + 1ns = 18ns
Thold = Td – Tclk = 18ns – 17ns = 1ns
Ker je vrednost Thold večja od 0, na podatkovni poti ni kršitev časa zadržanja. V primeru, da bi bil zahtevan čas zadržanja Thold_ff2 na primer 4ns namesto 2ns, kar bi Tclk_max povečalo na 19ns, bi bila vrednost negativna -1ns. To bi pomenilo časovno napako, ki bi jo bilo treba odpraviti, saj bi se podatek na vhodu drugega sekvenčnega vezja spremenil prehitro.
Čas priprave – Setup time
Podobno kot pri času zadržanja moramo tudi pri analizi časa priprave (ang. Setup time) podrobno pregledati vezje, vendar z nekoliko drugačnim pristopom. Upoštevati moramo ravno obratne pogoje kot v prejšnjem primeru: pri analizi časa priprave iščemo »najslabši možni scenarij« za hitrost delovanja. To pomeni, da moramo na podatkovni poti upoštevati najdaljše (maksimalne) zakasnitve, ki jih prispevajo komponente in povezave, na poti urinega signala pa uporabimo minimalne zakasnitve
Zakasnitev ure
Tclk = tfreq + tmin1 + tminbuff + tmin3 – tsetupff2 = 15ns + 2ns + 5ns + 2ns -4ns = 20ns
Zakasnitev podatkovne poti:
Td = tmax2+ tmax_clk-2-q_ff1 + tmax4 + tmax_neg + tmax5 = 2ns + 11ns + 2ns + 9ns + 2ns = 26ns
Tsetup = Tclk – Td = 20ns – 26ns = -6ns
V tem primeru orodje ni uspelo časovno zapreti projekta, saj je bila vrednost Setup Slack manjša od 0. Da bi to popravili, bi morali povečati periodo urinega signala s 15 ns na 22 ns, kar bi Setup Slack postavilo na vrednost 1 ns.
Definiranje časovnih omejitev v okolju Vivado
Frekvenco ure oziroma časovne omejitve lahko v Vivadu definiramo na dva načina: preko grafičnega vmesnika ali pa z neposrednim vpisom v datoteko omejitev (XDC file).
Preko grafičnega vmesnika: Najprej poženemo in odpremo sintezo načrta (Synthesized Design). V zgornji orodni vrstici izberemo Tools -> Timing -> Edit Timing Constraints.
Ustvarjanje ure: V oknu, ki se odpre, pod razdelkom Create Clock določimo ime ure, njeno periodo in pripadajoči vhodni priključek (port).
Shranjevanje: Ko vnesene parametre potrdimo in shranimo, orodje samodejno posodobi datoteko omejitev (v našem primeru zakasnilni_clen.xdc) s pripadajočo ukazno vrstico create_clock.
Ta proces je ključen za vsakega razvijalca, saj orodju Vivado sporoči, kakšna so naša pričakovanja glede hitrosti vezja, na podlagi česar lahko sintetizator poskuša optimizirati postavitev komponent na FPGA vezju.
Praktični primer: Veriga 100 negatorjev
Za praktično demonstracijo smo uporabili vezje z github.com [1], ki vsebuje verigo 100 zaporedno vezanih negatorjev, umeščenih med dve sekvenčni komponenti. Glavni namen takšne konfiguracije je umetno ustvariti ekstremno dolgo kritično pot (ang. critical path). V digitalni tehniki vsaka logična vrata, ne glede na njihovo tehnološko naprednost, prispevajo določeno zakasnitev širjenja signala (ang. propagation delay). Ko teh sto negatorjev povežemo zaporedno, se njihove posamezne zakasnitve (vključno z zakasnitvami na povezavah znotraj vezja) seštejejo v znatno časovno zamudo.
Če je delovna frekvenca ure visoka – v našem primeru smo začeli s 50 MHz (perioda 20 ns) – postane perioda ure krajša od časa, ki ga signal potrebuje, da prepotuje celotno verigo od izhoda prvega registra do vhoda drugega. V tem trenutku pride do kršitve časa priprave (setup time violation). To je potrdilo tudi orodje Vivado, ki je po opravljeni implementaciji izračunalo negativno časovno rezervo (Slack), ki je znašala -17,622 ns.
Celotno pot, ki je povzročila tolikšno zakasnitev, lahko podrobno analiziramo znotraj orodja po poti: Open Implemented Design -> Layout -> Timing -> zavihek Timing.
Tukaj nam orodje grafično in tabelarično prikaže, koliko pikosekund/nanosekund je signal porabil v vsakem posameznem negatorju (LUT) in na vsaki povezavi (net). Da bi odpravili omenjeno napako in dosegli pozitiven Slack, smo morali zmanjšati frekvenco ure na 25 MHz (perioda 40 ns), kar je rezultiralo v pozitivni časovni rezervi 0,846 ns. To pomeni, da ima signal sedaj dovolj časa, da se stabilizira pred naslednjo pozitivno flanko ure.
Zaključek in pogled naprej: Od teorije k realnim sistemom
Primeri, ki smo jih obravnavali v tem članku, so temeljili na namenoma poenostavljenih strukturah. Čeprav so nam omogočili jasen vpogled v delovanje časovnih omejitev (constraints) in kritičnih poti, se moramo zavedati, da smo pri tem delovali v izoliranem, skoraj idealnem okolju. V profesionalni praksi načrtovanje digitalne logike v vezjih FPGA zahteva upoštevanje številnih dodatnih dejavnikov, ki jih prinaša realni svet.
Vplivi zunanjega sveta in I/O standardi: Pri kompleksnejših projektih fizični priključki niso le preproste vhodno-izhodne točke. Načrtovalec se mora soočiti z različnimi napetostnimi nivoji in standardi, kot je LVDS (nizkonapetostno diferencialno signaliziranje), ki je nujno za visoke hitrosti prenosa podatkov. Poleg tega moramo upoštevati I/O zakasnitve (vhodno-izhodne zakasnitve), ki nastanejo na sami poti od priklučka FPGA vezja do notranje logike. Brez pravilno definiranih vhodnih in izhodnih omejitev (Input/Output Delays), naša logika nebi znotraj vezja delovala popolno, komunikacija z drugimi komponentami na tiskanem vezju (PCB) pa bi zaradi časovnih zamikov odpovedala.
Izziv večkratnih urinih domen (CDC): Ena največjih kompleksnosti sodobnih sistemov FPGA je uporaba različnih urinih domen. V enem samem čipu lahko sočasno deluje več ur z različnimi frekvencami in fazami (npr. ura za procesor, ura za pomnilnik in ura za komunikacijski vmesnik). Ko ti deli vezja med seboj izmenjujejo podatke, nastopi nevarnost metastabilnosti.
Prehajanje podatkov med domenami (Clock Domain Crossing – CDC) zahteva posebno pozornost in uporabo namenskih tehnik, kot so (za to je potreben celoten prispevek zaradi kompleksnosti reševanja CDC problemov):
Sinhronizatorji (zaporedno vezani flip-flopi),
Asinhroni FIFO pomnilniki za prenos večje količine podatkov,
Handshaking protokoli.
Pomen celostnega načrtovanja: Časovno zapiranje projekta (ang. timing closure) v takšnih razmerah postane iterativni proces, kjer orodja, kot je Vivado, potrebujejo zelo natančna navodila v obliki naprednih XDC omejitev. Razumevanje osnov, ki smo jih spoznali skozi primer s 100 negatorji, je nujna odskočna deska za obvladovanje teh zahtevnih izzivov. Le s pravilno kombinacijo teorije, poznavanja arhitekture FPGA vezja in natančnega pisanja omejitev lahko zagotovimo, da bo naš digitalni sistem deloval zanesljivo v vseh pogojih, ki jih narekuje realno okolje.
Reference:
[1] https://github.com/klemenkomedenko/FPGA_constrain_primer_svet_elektronike
[2] https://digilent.com/reference/programmable-logic/arty-a7/start?srsltid=AfmBOopV4TtlSkqtZoId_CGrJwWDjgBj6xQkDTSLt1nW4RGZQB5Aqf-E
[3] https://www.vlsi-expert.com/2011/05/example-of-setup-and-hold-time-static.html
