Abstrakt: Dokument popisuje jak lze debugovat hardware běžící uvnitř FPGA s využitím nástroje ChipScope
Občas může nastat situace, kdy máte napsanou aplikaci pro FITKit, která bez problému funguje v simulacích avšak po přeložení a nahrání do FPGA nefunguje tak, jak by měla. Důvodů, proč se toto může stát, je několik. Jedním z nejčastějších zdrojů problémů je stav, kdy nebyly v simulacích podchycené všechny situace, které skutečně můžou nastat. Dalším, o mnoho zákeřnějším problémem, je situace, kdy překladové nástroje zoptimalizovaly část kódu do té míry, že se změnila funkčnost aplikace. Oba z uvedených problému se velice obtížně ladí. I proto vznikl nástroj Chipscope, který slouží pro ladění aplikací přímo na čipu FPGA. Po vložení ICON (integrated controller core) a ILA (integrated logic analyzer) pasivních sond do laděné aplikace a jejích správném zapojení je možné monitorovat libovolný signál při reálné činnosti FPGA.
mít nainstalovaný ChipScope,
mít kabel pro propojení JTAG FPGA a počítače (např. Xilinx Platform Cable na obrázku 2.1),
vygenerovat ILA a ICON sondy,
přidat vygenerované komponenty do aplikace a zahrnout je do překladu,
přeložit aplikaci, nahrát ji do FPGA, připojit se k sondám a analyzovat
Pro připojení k FPGA využíva Chipscope port JTAG Boundary Scan. Tento je na FITkitu do FPGA přiveden skrze pinheader JP1. Je zapotřebí připojit všechny piny (GND, TDO, TDI, TCK, TMS, VCC). Druhou stranu kabelu je nutné zapojit do USB počítače, kde je nainstalovaný Chipscope.
Předtím, než se pustíte do tohoto kroku, si je potřebné ujasnit, kolik signálů budeme monitorovat. ICON slouží pro připojení ILA sond. V celém FPGA může být jen jediný ICON, ke kterému lze připojit až 15 ILA sond. Ty mohou snímat signály do datové šířky 4096 bitů a frekvence 500MHz. Sondy jsou schopny zaznamenat až 131072 vzorků. Je však zapotřebí myslet na to, že čím více budeme chtít zaznamenat, tím více zdrojů na FPGA zabereme. Konkrétní parametry sond se volí při jejich generováni pomocí Xilinx CORE Generator (součást ISE), kde je možné zjistit i zdrojové obsazení (počet BRAM apod.).
Spustíme CORE Generátor a založíme nový projekt (Ctrl+N), který si pojmenujeme a uložíme na zvolené místo. Následně nastavíme parametry podle obrázku 4.1:
V pravé části programu vybereme ICON (obrázek 4.2)
Následující okno nám dovolí měnit parametry. Je možné zadat název, pod kterým se bude ICON přidávat do aplikace a počet připojených ILA komponent (Control Ports). Ostatní parametry neměníme. Potvrzením "Generate" se ICON vygeneruje spolu s dodatečnými soubory. Jejich obsah je popsán v souboru README po úspěšném dokončení generování. Pro nás důležité soubory budou vysvětleny dále.
Tak jako při generováni ICON, je nutné použít CORE Generátor. Už však není potřeba zakládat nový projekt, ale je možné použít projekt již založený. Všechna nastavení (typ FPGA atd.) tak zůstanou zachována. Z nabídky vybereme sondu ILA.
Zvolíme jméno komponenty a následující nastavení (obrázek 4.3):
počet trigrovacích portů, do kterých se zapojí signály, na které bude sonda reagovat (až 16 na jednu ILA, obvykle stačí 1)
počet sekvenčních stupňů je parametr, kterým určujeme, jak moc komplexní události chceme monitorovat (obvykle stačí 1, detekuje konkrétní událost bez předcházející/následující sekvenční události)
použití relativních maker (RPMs) je vhodné pro ošetření problému s časováním
někdy je vhodné zapnout trigrovací výstup z ILA, který je aktivní při splnění podmínky monitorování (je možné spustit jinou událost)
vzorkování je možné zapnout na vzestupnou i sestupnou hranu
hloubka dat určuje maximální počet vzorků, který bude sonda schopna zaznamenávat (pozor na počet zdrojů zabraných sondou)
shodnost dat a triggeru je vhodné volit v situacích, kdy se velikost dat a trigrovacích portů se příliš nedliší (obvykle vyhovuje nastavit shodnost)
V dalším okně můžeme měnit následující parametry (obrázek 4.4):
velikost trigrovacího portu závisí na tom, kolik signálů (když jsme zvolili data shodné s trigerem) anebo kolik trigerů potřebujeme
počet "match" jednotek volíme vyšší než 1, pokud chceme na trigrovacím portu zaznamenat i podmínky jako je logický OR a jiné
velikost čítače udává, za jak dlouho po vyvoláni trigrovací podmínky se má triger vykonat (je možné nastavit šíři až 32, přičemž tuhle podmínku je možné nastavit i později pomocí nástroje Chipscope a už předtím nastavené dostatečně velké datové hloubky)
typ shody obvykle stačí nastavit na "basic". Stavy, které je sonda schopná analyzovat jsou zobrazené ihned pod výběrem
poslední možnost není vhodné povolit v případe, že máme data stejné s trigrovacím portem
Před generováním ILA sondy je vhodné zjistit její zdroje. To se docílí výběrem "Core Resource Usage" na levé dolní straně okna. Následně je možné spustit generování.
Vygenerované soubory, pro ICON anebo ILA sondy jsou potřebné *.vho
, popisují jak zapojit vygenerované komponenty do aplikace. Soubory *.ngc
obsahují popis komponent pro samotné FPGA.
Nejprve je zapotřebí do zdrojového kódu aplikace vložit definici vygenerované komponenty ICON a ILA (k nalezení v souborech chipscope_icon.vho a chipscope_ila.vho):
component chipscope_icon PORT ( CONTROL0 : INOUT STD_LOGIC_VECTOR(35 DOWNTO 0) ); end component; component chipscope_ila PORT ( CONTROL : INOUT STD_LOGIC_VECTOR(35 DOWNTO 0); CLK : IN STD_LOGIC; TRIG0 : IN STD_LOGIC_VECTOR(7 DOWNTO 0) ); end component;
Dále je nutné dodat definici signálu (dle počtu připojených sond):
signal TRIG0 : std_logic_vector(7 downto 0); signal CONTROL0 : std_logic_vector(35 downto 0);
a jejich parametry, aby je syntetizátor nezoptimalizoval (jde o pasivní sondy)
attribute dont_touch : boolean; attribute dont_touch of chipscope_icon : component is TRUE; attribute dont_touch of chipscope_ila : component is TRUE;
Téměř na závěr stačí dodat zapojení komponent a datových (pokud jsou obsaženy) a trigrovacích signálů, např.:
ICON_0 : chipscope_icon port map ( CONTROL0 => CONTROL0 ); ILA_0 : chipscope_ila port map ( CONTROL => CONTROL0, CLK => CLK, TRIG0 => TRIG0 ); TRIG0 <= "0" & -- 1 sdram_busy & -- 1 sdram_addr_mux & -- 1 sdram_data_out & -- 3 sdram_data_out_vld & -- 1 sdram_rd_en; -- 1
Nyní je nutné přidat vygenerované komponenty (*.ngc) do procesu překladu aplikace pro FITKit. To je možné udělat úpravou souboru /base/Makefile.inc, kde přidáme řádek:
CHIPSCOPE_PATH ?= $(BASE)fpga/chipscope
Dále řádek:
$(NGDBUILD) $(NGDBUILDFLAGS) -uc "$(FPGAUCF)" $< $@ && $(RM) -rf netlist.lst xlnx_auto*
nahradíme řádkem:
$(NGDBUILD) $(NGDBUILDFLAGS) -uc "$(FPGAUCF)" -sd $(CHIPSCOPE_PATH) $< $@ && $(RM) -rf netlist.lst xlnx_auto*
Samozřejmě je nezbytné aby fpga/chipscope obsahoval všechny vygenerované *.ngc soubory (v našem případě chipscope_icon.ngc a chipscope_ila.ngc).
Takto pozměněnou aplikaci přeložíme a nahrajeme do FPGA obvyklým způsobem.
Spustíme nástroj ChipScope a připojíme se k FPGA (obrázek 6.1):
Zvolíme rychlost (zde postačí 3MHz) a USB port (přednastavený) a potvrdíme. Po úspěšném připojení se zobrazí seznam dostupných zařízení. V našem případě se jedná o FPGA XC3S50.
Následně je možné vidět všechny připojené ILA sondy. V tuto chvíli je vhodné nastavit jména signálů na které je sonda skutečně připojena, vytvořit sběrnice (skupiny stejně pojmenovaných signálu) a projekt uložit. Každá ILA má vlastní nastavení, ze kterých nás nejvíc zajímá Waveform a Trigger Setup.
Do Waveformu je možné pouhým přetažením přidat monitorované signály (obrázek 6.2):
Kurzor T
ukazuje, kdy byla splněna monitorovací podmínka a kurzory O
a X
jsou uživatelsky nastavitelné. Dále je potřebné nastavit trigger poklepáním na Trigger Setup (obrázek 6.3):
Podle vlastností vygenerované ILA sondy je možné volit následující parametry:
"Match Unit" – nastavení jednotek. V případě existence více match jednotek je množné každou nastavovat samostatně
Funkce udává, za jakých podmínek se na monitorovaném signálu bude generovat trigger (shoda, neshoda, vetší-menší než apod., v našem případe shoda ==
)
Hodnota udává, při které hodnotě bude trigger spouštěn. Buď na konkrétní hodnoty (1,0) anebo, pokud nás daný signál nezaujímá, (X). Dále je možné volit mezi F – falling edge, R – rising edge apod. Závisí však na vlastnostech vygenerované jednotky.
Radix udává zápis hodnoty vícebitových signálu pro lepší čitelnost (BIN, HEX apod.).
Hodnota čítače udává, jak už bylo vysvětleno, sekvenční závislosti.
Dále je možné volit výsledný logický výraz přes všechny použité Match Unit a způsob, kterým se budou data zachytávat. Je možné vybrat "Window", kdy se zaznamená daný počet oken o dané hloubce s udaným počátkem a nebo zvolit "N Samples", kdy se nastaví pouze počet vzorků, který se uloží při vyvolání trigeru.
Po tomto nastavení je možné spustit zaznamenávání, např. pomocí ovládacích tlačítek (obrázek 6.4):
Popis (zleva doprava): První tlačítko spustí komunikaci přes JTAG kabel (při zapnutí Chipscope). Následující vypne/zapne lištování statusu sondy (při přehrávání FPGA je vhodné vypnout). Další skupinka zapne trigger, zastaví trigger a zobrazí zachycené data a nebo způsobí zachycení jednoho aktuálního vzorku dát bez ohledu na splnění podmínky (T!). Další tlačítka v pořadí přepnou na zobrazení oblasti s uživatelským kurzorem X a kurzorem O. Další přejdou na předchozí nebo následující vzorek, kde byla splněná podmínka. Poslední tři tlačítka poslouží k nastavení přiblížení nebo oddálení zobrazené plochy.
Zaznamenaná data je možné exportovat (FILE->Export) a tak uložit k další analýze.
Pro více informací ohledně ChipScope analyzátoru je možné nahlédnout do oficiální dokumentace ChipScopeDoc.
ChipScope Pro 11.3 Software and Cores, User Guide [online] Dostupný na WWW: http://www.xilinx.com/support/documentation/sw_manuals/xilinx11/chipscope_pro_sw_cores_ug029.pdf