Xilinx ChipScope ismertető Szántó Péter BME Méréstechnika és Információs Rendszerek Tanszék 2011-09-01 Tartalom 1. ChipScope Core Insterter... 2 1.1. ChipScope ICON... 4 1.2. ChipScope ILA... 5 2. ChipScope analizátor... 11 2.1. Trigger Setup Match... 13 2.2. Trigger Setup - Trigger Condition Equation... 13 2.3. Trigger Setup Capture... 14 3. Trigger feltételek példák... 15 A Xilinx ChipScope egy olyan szoftver komponens, amely az FPGA erőforrásainak felhasználásával egy logikai analizátort implementál, mellyel lehetőségünk van az FPGA belső jeleinek vizsgálatára, a nélkül, hogy a mért jeleket ki kellene vezetni az FPGA 1-1 lábára, hogy egy külső analizátorral vizsgáljuk őket. Természetesen a ChipScope nincs ingyen mivel a logikai analizátor funkciókat az általános FPGA erőforrások valósítják meg, így a vizsgálandó terv mellett az analizátornak is bele kell férnie az FPGA-ba. Ebből a szempontból általában az FPGA belső memóriája (BRAM) a kritikus a ChipScope ezt felhasználva hozza létre a mintatárat; azaz ide menti el a vizsgált jelek hullámformáit. A ChipScope használata két lépésből áll: A ChipScope Core Inserter segítségével a terv implementációja során meg kell adni az implementálni kívánt logikai nalizátor paramétereit. Ezek közül a leglényegesebbek: mi legyen a mintavételező órajel; milyen jelek használatával szeretnénk trigger feltételt megfogalmazni; milyen jelek hullámformáit szeretnénk vizsgálni. A ChipScope Analyzer a logikai analizátor funkciókat megvalósító GUI. 1
1. ChipScope Core Insterter A már ismert új forrás file hozzáadása menüben az eddig megszokott Verilog Module helyett válasszuk a ChipScope Definition and Connection File-t. Ennek hatására egy ChipScope ikonnal ellátott almodul kerül a terv hierarchiába, mint a legfelső szintű modulunk egy almodulja. Duplán kattintva a ChipScope almodulra elindul a Core Insterter (amely egyébként futása alatt egy CPU magot 100%-ban leterhel). Az leső ablakon nincs módosítani való, nyomjunk Next gombot. 2
3 BME MIT, FPGA Labor, 2011
1.1. ChipScope ICON A következő ablak az ICON (Intergrated Controller) paramétereket állíthatjuk. Ez a modul kommunikál a PC-vel a JTAG kábelen kersztül, s ez vezérli a tényleges analizátor funkciókat megvalósíto ILA (Integrated Logic Analyzer) modulokat. Spartan-3 FPGA esetén semmiféle konfigurációs lehetőség nincs. ICON modulból egy terv csak egyet tartalmazhat. 4
1.2. ChipScope ILA Az ILA konfigurációjánál (amelyből akár 16 is csatalkozhat egy ICON-hoz) már sokkal beállítani valónk van. Az ablak bal felső sarkában azt látjuk, hogy éppen melyik ILA modul paramétereit állítjuk, ez alatt pedig a ChipScope erőforrás igényét követhetjük nyomon. Ez utóbbi természetesen annál magasabb, minél több/bonyolultabb funkciót használunk. 1.1.1. Trigger paraméterek A ChipScope képes minden egyes trigger portjára kötött jel felhasználásával több feltételt is vizsgálni. A trigger port a rá kötött jeleket határozza meg, míg az ún. MatchUnit-ok ezen jelek felhasználásával egy-egy feltételt értékelnek ki. Egy ILA-nak legfeljebb 16 trigger portja lehet, melyekhez 16 Match Unit kapcsolódhat. Az ezekhez kapcsolósó Trigger Parameters fülön az alábbi beállításokat végezhetjük el. Numer of Input Trigger Ports: a trigger portok száma. A különböző trigger portokra más-más jeleket köthetünk. Trigger port paraméterek: o Trigger Width: A port szélessége (bitben). o # Match Unit: Trigger komparátorok száma. Az adott trigger port esetén annyi különböző trigger feltételt adhatunk meg, ahány Match Unit van. Az egyik Match Unit pl. triggerelhet egy jel felfutó élére, míg a másik a lefutó élre. o Counter Width: Az egyes Match Unit-okhoz kapcsolódó számláló bit-szélességének beállítása, mellyel az adott Match Unit-ban teljesült trigger események számolhatók. Akkor történik a tényleges triggerelés, amikor a számláló egy adott értéket elér. Ezzel 5
tehát egyzerűen megoldható például, hogy egy adott jelen a 42. felfutó él legyen a trigger esemény. Enable Trigger Sequencer: Időben egymást követő trigger esemény sorozatok engedélyezése. Lehetőség van pl. M0 M1 M0 szekvencia beállítására, minek hatására a tényleges triggerelés akkor történik, amikor a Match Unit 0 után a Match Unit 1, majd ismét a Match Unit 0 beállított feltétele teljesül. Enable Storage qualification: Alapesetben a ChipScope minden egyes órajelre mintát vesz az adatvonalakból. Ezen opció lehetővé teszi, hogy csak akkor történjen mintavétel, ha egy Match Unit-ban beállított feltétel teljesül. A Match Type legördülő menüben az adott Match Unit által biztosított feltétel-típusok állíthatók be. Ezek a következők: Basic: 0, 1, X (don t care) bit értékek Basic w/edges: 0, 1, X bit értékek, R (rising edge felfutó él), F (falling edge lefutó él), B (both edges bármelyik él), N (no transition nincs él) Extended: a bit értékek mellett lehetőség van a teljes trigger port értékére komparálni (egyenlő, kisebb, nagyobb, stb) Extended W/edges: Extended + élváltások Range: Extended plusz adott tartámányra történő komparálás Range W/edges: Range + éldetektálás 6
1.1.2. Mintavétel paraméterei A Capture Parameters fülön a mintatár (a hullámformákat tároló memória) paramétereit állíthatjuk be. Ezek: Data Depth: A mintatár mélysége (a szó-szélesség mindig annyi, ahány jelet vizsgálunk). Sample On Rising/Falling Clock Edge: a mintavételező órajel mely élére történjen a mintavételezés. Data Same As Trigger: A lusta ember kedvenc opciója. Amennyiben be van kapcsolva, akkor az adatbemenetre ugyanazon jelek kerülnek, mint amit a trigger portok esetén beállítunk. Ha ez az opció ki van kapcsolva, akkor a trigger portokra és az adatvonalakra szabadon köthetünk tetszőleges (egymástól különböző) jeleket. Az adat port teljes szélessége, valamint a mintatár mélysége szabja meg, hogy hány darab Block RAM memória (BRAM) szükséges az implementációhoz. Értelemszerűen maximum annyi használható a ChipScope által, amennyi az adott terv és FPGA esetén rendelkezésre áll. Amennyiben van elegendő FPGA erőforrás (tehát vagy kevés jelet vizsgálunk, vagy nagy kapacítású és ebből kifolyólag nagyon drága FPGA-t használunk), akkor célszerű ugyanazon jeleket kötni a trigger és adatbemenetre. Ha viszont bármi miatt szűkösek az erőforrásaink, akkor előbb célszerű átgondolni, hogy mit szeretnénk vizsgálni, s ennek megfelelően kialakítani a trigger és adat bemeneteket. 7
1.1.3. Bemeneti jelek konfigurálása A Modify Connections gombra klikkelve állíthatjuk be, hogy az egyes ChipScope portokra mely jeleket szeretnénk kötni. FONTOS: a következő ablakban szintézis utáni jelneveket találunk. Ökölszabályként az mondható el, hogy a regiszterek mindig megtalálhatók (vagy a Verilog kódban szereplő nevükön, estleg ha kimenetet hajtanak meg, akkor a kimeneti port nevével) a szintézis utáni listában (ha nem, akkor kiegyszerűsítette a szintézer, ami nem bíztató). Kombinációs logikák ezzel ellentétben nem mindig fedezhetők fel, ez ellen a KEEP attribútummal lehet védekezni. Tehát például a reg q; always @ (posedge clk) q <= a & b; kód szintézise után a q változó megtalálható a huzalozási listában. Ezzel ellentétben a wire u,v; assign u = a & b; assign v = u & c; kód implementációja után u garantáltan nem jelenik meg, hiszen egy három bemenetű logikai függvényt egyetlen 4 bemenetű LUT felhasználásával meg lehet valósítani (a helyzeten természetesen mit sem változtat, hogy a kombinációs logika assign értékadással vagy always blokkal van leírva). 8
A bal oldali listában a szintetizált terv jeleit látjuk. Net Name: A jel neve. Source Instance: A jelet meghajtó áramköri elem neve. Source Component: A jelet meghajtó modul neve (itt előfordulhat pl. egy almosul példány neve). Base Type: a jelet meghajtó elem típusa. Néhány példa: o BUFGP: órajel meghajtó buffer. A ChipScope órajel bemenetére MINDIG BUFG kimenetet kell kötni. o IBUF: bemeneti buffer, ami egy bemenetként használt FPGA lábhoz csatlakozik. o OBUF: kimeneti buffer, ami egy kimenetként használt FPGA lábhoz csatlakozik. o IOBUF: kétirányú buffer, nem használható a ChipScope-ban. o GND: fix logikai 0 (föld). o VCC: fix logikai 1 (táp). o FDx: D flip-flop különböző verziói. Az FDRSE például egy olyan D FF, aminek használjuk a Reset, Set és Enable bemeneteit is. o LUTx: különböző konfigurációjú LUT-ok. A LUT4 pl. egy olyan LUT, aminek mind a négy bemenete használt. A Pattern szövegmezőt használva lehetőség van a jelnévre történő szűrésre, a * karakter a tetszőleges hosszúságú nem definiált szövegrészt jelenti (wildcard). 9
Miután az összes porthoz rendeltünk megfelelő jelet (nincs piros szöveg a képernyőn), a Return to Project Navigator opcióval elmenthetjük a ChipScope project-t és visszatérhetünk az ISE GUI-ba. 10
2. ChipScope analizátor A ChipScope-t tartalmazó tervet a szokásos módon kell lefordítani, s konfigurációs file-t készíteni. Megjegyzendő, hogy a Core Inserter paraméterek megváltoztatása a ChipScope almodulok újragenerálását vonja maga után, ami viszonylag hosszú időt vesz igénybe (géptől függően akár 5-10 perc is lehet). Az FPGA felkonfigurálása után indítható a ChipScope Analyzer GUI. A felső menüben válasszuk a JTAG Chain/Xilinx Platform USB Cable opciót. Ezután a ChipScope detektálja a JTAG kábelt, s az arra kötött eszközöket, illetve az eszközben található ChipScope modult (a felugró ablakokon nyomjunk OK-t). 11
A nem túl beszédes DataPort* + elnevezéseket akár kézzel is átírhatjuk, de lehetőség van a Core Inserter project file importálására is a File/Import opcióval. A jelnevek importálása mellett a vektor jelek buszba foglalását is automatikusan elvégzi a ChipScope amennyiben az Auto-create buses opció be van kapcsolva. Mivel példánkban a két trigger port egy 12 bites (órajel osztó) és egy 4 bites vektort tartalmaz (anód shift regiszter), így az eredmény mindössze két jel. A Trigger Setup ablakban a két trigger port összesen 4 Match Unit-ját látjuk, a trigger feltételünk jelenleg minden bitre don t care, azaz feltétel nélkül triggerel az analizátor. Nézzük végig az egyes beállítási lehetőségeket. 12
2.1. Trigger Setup Match A Match Unit-ok komparálási feltételeit állíthatjuk be. A don t care érték használata megengedett amennyiben a Match Unit komparálás feltétele egyenlő (==) vagy nem-egyenlő (<>), a többi esetben azonban a trigger port teljes bitkészletére lehet feltételt megfogalmazni. Ezért szükséges az, hogy azokat a buszokat, amelyekre kisebb/nagyobb vagy tartomány feltételt szeretnénk beállítani külön trigger portra kerüljenek. 2.2. Trigger Setup - Trigger Condition Equation A bekarikázott részre klikkelve a trigger feltételt állíthatjuk össze. Egyrészt lehetőség van a Match Unit-ok kombinálására, az alább látható beállításban például akkor triggerel az analizátor, ha az M0 és az M1 Match Unit-ban beállított feltétel egyidejűleg teljesül. A Sequencer fülre klikkelve a TriggerSequencer beállításába jutunk. Itt egy maximum 16 hosszú listát állíthatunk össze a Match Unit-ok felhasználásával (a lista tényleges maximális hossza a megfelelő Core Inserter beállítástól függ). Az alábbi ábra esetén akkor történik triggerelés, ha sorrendben teljesül az M0, M1 majd M2 Match Unit-ban beállított feltétel. 13
Alapesetben a beállított szekvencia lépései között bármilyen esemény történhet, tehát a fenti példa az M0 M1 M1 M2 esemény-sorozatra is triggerelni fog. A Use Contiguous Match Events opció bekapcsolásával csak akkor történik trigger, ha pontosan a beállított szekvencia játszódik le. 2.3. Trigger Setup Capture A mintavételezésnek két üzemmódja van (Type): a Window, illetve az N Samples. Előbbi esetén megadhatjuk, hogy a teljes mintatárban hány darab trigger feltételt szeretnénk látni, utóbbi esetben pedig azt, hogy egy trigger hatására hány mintát tároljon az analizátor (értelemszerűen mindkét beállítással elérhető ugyanaz). Window üzemmód esetén a Position a mintavételi ablakon belüli trigger poziciót jelöli, tehát ha például 512 mintát veszünk egy trigger hatására, s a pozíciót 100-ra állítjuk, akkor lehetőségünk van a trigger előtti 100 érték vizsgálatára is. A Storage Qualification opcióval (alapértelmezett beállítás: All Data minden órajelben eltárolja a mintákat) lehetőségünk van a mintavételhez egy engedélyező jelet megfogalmazni. Az alábbi ábrán például csak akkor fog mintát venni a ChipScope, ha az M3 Match Unit-ban beállított feltétel teljesül. 14
3. Trigger feltételek példák Az első példában a 12 bites számláló legfelső bitjének felfutó élére triggerelünk. Az M0 Match Unit komparálási funkciója egyenlőség, míg a komparálási értékben a legfelső bit értéke R (rising edge felfutó él), a további bitek értéke don t care. Az analizátor indítása a bekarikázott lejátszás gombbal történik. Az ezt követő két gombbal lehetőség van a triggerre várakozást leállítani, illetve azonnali (feltétel nélküli) mintavételezést indítani. A következő ikon-csoporttal az X és O kurzorok pozíciójára, illetve trigger pozícióra lehet ugrani, valamint csökkenthetjük illetve növelhetjük a hullámforma ablakban megjelenített minták számát. A Trigger Run Mode menüpont alatt választhatunk egyszeri triggerelést (Single), vagy többszöri triggerelést (Repetitive). Utóbbi esetben a mintavételezés utánaz analizátor automatikusan újra triggerre várakozás állapotba kerül (a Startup móddal most nem foglalkozunk). 15