Dnešní FPGA čipy nabízí velké množství konfigurovatelné logiky. Součástí FPGA začínají být i relativně výkonná procesorová jádra, což umožňuje konstruovat komplexní systémy na čipu. Problémem návrhu takovýchto systémů je relativně dlouhá doba vývoje, což může prodražit výsledné zařízení a ohrozit termín uvedení nového zařízení na trh.
Jedním ze způsobů, jak urychlit vývoj, je vyjít z čistě softwarového řešení a postupně přesouvat časově kritické části do FPGA logiky. Návrh hardware je tak řešen pouze pro části, které to skutečně vyžadují. K identifikaci kritických míst je dobré použít profilaci softwarové implementace.
Z těchto důvodů je jádrem dnešních zařízení většinou procesor, který je obklopen sadou hardwarových jednotek řešicích urychlení výpočtů nebo připojení periferií. Na procesoru běží operační systém zajišťující přístup k hardwarovým prostředkům a spouštění aplikací. My se zaměříme na operační systém Linux, který je udržován širokou komunitou vývojářů a nabízí řadu volně dostupných odladěných aplikací, které můžeme snadno využít ve vytvářených zařízeních. Například je možné na zařízení jednoduše spustit webový server a využít funkce jádra operačního systému pro zajištění síťové komunikace.
Pokud zařízení využívá Linux, je velkou výhodou také možnost implementace a ladění aplikace na běžném počítači s Linuxem s tím, že na cílovou platformu je převáděna již hotová aplikace. Kromě jednoduššího a rychlejšího vývoje je tak možné snížit i počet hardwarových přípravků potřebných k vývoji a sekundárně tak ušetřit náklady.
Dnešní vývojové nástroje se snaží zkrátit dobu vývoje prostřednictvím vysokoúrovňové syntézy (HLS – High Level Synthesis), kdy algoritmus popsaný nejčastěji v jazyce C je syntézou převáděn nejprve do hardwarového zapojení na úrovni RT (meziregistrových přenosů) a následně logickou syntézou převeden do cílové technologie, v našem případě FPGA. HLS umožňuje výrazně zkrátit dobu vývoje hardwarových bloků a je vhodná pro postupné přesouvání algoritmů do hardware, neboť přesouvané bloky jsou již implementovány v jazyku C.
Obr. 1 Architektura Xilinx Zynq (převzato z www.xilinx.com)
Nicméně HLS ještě nedokáže efektivně řešit rozdělení systému mezi hardware a software a nenabízí ani prostředky pro efektivní komunikaci. Obojí tak zůstává zcela v rukou návrháře a stává se značnou komplikací při návrhu nových systémů.
V tomto článku se proto zaměříme na komunikaci mezi procesorem s operačním systémem Linux a FPGA logikou. Nejprve si ukážeme způsob komunikace v případě zařízení složeného ze standardního počítače s PCI Express akcelerační kartou. Následně se zaměříme na nové SoC architektury od firem Xilinx a Altera, které obsahují na FPGA čipu výkonná ARM jádra.
V různých aplikačních oblastech (síťové prvky, měřicí technika atd.) jsou zařízení konstruována jako počítač s jednou nebo více akceleračními kartami osazenými výkonným FPGA. Počítač zajišťuje běh cílové aplikace a akcelerační karty požadovaný výkon, reakci v reálném čase nebo jiné parametry, kterých nelze čistě softwarově dosáhnout.
Dnešní FPGA jsou navržena tak, aby podporovala rychlé přenosy přes sběrnici PCI Express (PCIe). Obsahují hned několik PCIe endpoint bloků, které realizují fyzickou vrstvu sběrnice. Například technologie Virtex-7 umožňuje připojit jeden PCIe endpoint ke sběrnici PCIe třetí generace s až osmi paralelními linkami. Počet využitých linek je možné konfigurovat. S využitím platformy NetCOPE od české firmy INVEA-TECH jsme experimentálně ověřili, že rychlost přenosu dat přes jeden endpoint přesahuje 50 Gb/s i pro relativně krátké 64B bloky dat.
Dalšího zvýšení přenosové kapacity přes sběrnici se dá dosáhnout využitím dvou endpointů spojených na kartě pomocí PCIe switche nebo s využitím bifurkace. Bifurkace umožňuje připojit v rámci jednoho PCIe slotu více fyzických zařízení s tím, že každé zařízení je připojeno na jiných linkách sběrnice. Můžeme tak do jednoho slotu připojit hned několik endpointů a dosáhnout tak vyšší agregované propustnosti přes sběrnici.
Dosažení vysoké propustnosti ale není jenom otázkou vhodného připojení PCIe endpointů na sběrnici. Důležité je také dobře navrhnout řízení přenosů na kartě i v Linuxu. Obojí vyžaduje pečlivý návrh a zkušeného odborníka na návrh hardware a jádro Linuxu.
Pro dosažení vysoké propustnosti je potřeba dát pozor na zbytečné zatěžování procesoru, který může komunikaci brzdit. V první řadě nesmí docházet ke kopírování dat nebo k časté alokaci paměti. Obojí způsobuje výrazné zatížení procesoru a paměti, čímž se snižuje propustnost komunikace. Je potřeba si také dát pozor na počet přerušení za sekundu. Pokud procesor informujeme přerušením o přenosu každého bloku dat, může se nám u krátkých bloků snadno stát, že procesor bude zahlcen pouze obsluhou přerušení. Na jinou činnost už nebude mít čas. Problém se dá řešit různými přístupy. Jedním z řešení je v případě velkého počtu přerušení vyvolat přerušení po přenosu více bloků dat. Počet bloků na jedno přerušení je možné dynamicky měnit v závislosti na množství přenášených dat.
Samostatnou kapitolou při návrhu komunikace zůstává datová struktura, se kterou musí umět pracovat karta i software. Typicky se jedná o frontu, která je fyzicky umístěna v paměti počítače ve formě bloků dat uspořádaných do kruhového bufferu. Fronta musí být řízena ze strany FPGA i Linuxu, což znamená náročné ladění celé komunikace. Na kartě je nutné v FPGA logice implementovat transakční vrstvu PCIe a DMA modul s řízením fronty.
Je zřejmé, že problematika návrhu komunikace procesoru s akcelerační kartou není jednoduchá. Proto je vhodné při návrhu zařízení s akcelerační kartou vyjít z již odladěného řešení komunikace přes PCIe. Příkladem takového řešení může být již dříve zmíněná platforma NetCOPE.
V oblasti vestavěných systémů, které používají FPGA technologii, je dlouhodobým trendem využití procesoru. Jedná se buď o tzv. soft procesory implementované přímo v programovatelné logice (např. Xilinx MicroBlaze nebo Altera Nios), nebo procesorová jádra přímo na čipu (např. PowerPC v FPGA Xilinx Virtex II). Tyto procesory mají ale obecně menší výkon. Slouží tedy k řízení ostatní logiky (komponent FPGA) nebo implementují pouze tu specifickou část akcelerovaného algoritmu, která je svým charakterem vhodnější pro běh v procesoru.
Nejnovější architektury obsahují výkonnější procesorová jádra, zejm. ARM Cortex-A9 MPCore, taktovaná až na frekvenci 1 GHz. U těchto architektur již plní úlohu hlavního prvku spíše procesor, který ovládá nebo jinak (datově) komunikuje s FPGA částí. Příkladem tohoto přístupu jsou SoC architektury Xilinx Zynq nebo Altera Cyclone V SoC.
Procesor u těchto architektur obsahuje dvě výkonná jádra se SIMD rozšířením a podporu pro pohyblivou řádovou čárku. Dále pak obsahuje i mnoho dalších periférií využitelných v celé řadě vestavěných systémů. Příkladem je gigabitový Ethernet, USB řadič, radiče sběrnic SPI, UART, IIC, CAN apod. V případě použití operačního systému Linux, který je v dnešní době běžně dostupný i pro architektury ARM, nemá vývojář většinou problém uvedené periférie oživit a použít. Je to dané tím, že existuje mnoho již implementovaných softwarových ovladačů, které jsou pro linuxový systém vytvořené a volně dostupné.
FPGA část SoC čipu je s procesorovou částí propojena interně na čipu. Používá se přitom standardizovaných rozhraní dle specifikace AMBA AXI od firmy ARM. Tyto jsou dostupné v několika variantách podle účelu. Pro intenzivní datové přenosy je tedy možné zvolit vysokorychlostní až 128bitové spoje nebo speciální paměťově koherentní port ACP. Naopak pro pomalejší komunikaci s FPGA komponentami mohou být použity nízkorychlostní 32bitové spoje. Výhodou těchto propojení je, v porovnání s předešlým přístupem využívajícím akceleračních karet, velice nízká latence přístupu k FPGA. Pomocí RSoC Frameworku od české společnosti RehiveTech, který je určen pro rychlé prototypování aplikací nad těmito čipy, jsme odměřili, že latence dosahuje přibližně 200 ns (čtení nebo zápis registru v FPGA). Propustnost, které je možné dosáhnout při komunikaci mezi procesorem a FPGA logikou (na frekvenci 100 MHz), dosahuje až 8 Gb/s.
Typickým problémem, se kterým se setká každý vývojář, je nedostupnost přímé podpory pro předávání dat mezi softwarovou aplikací a FPGA komponentami (např. akceleračními jednotkami). Uvažujeme-li operační systém postavený nad Linuxem, musí vývojář implementovat aplikačně specifický ovladač pro řízení akcelerátoru. Samotný akcelerátor pak musí disponovat řadičem, který zajistí efektivní přístup ke sběrnicím, zejména k dynamické paměti. Jedná se o určitou mezivrstvu (a de facto režii), která přímo nepřispívá k funkci, ale bez které není možné aplikaci realizovat. Primárně je třeba navrhnout právě hardwarový řadič zajišťující přímé přenosy mezi FPGA a pamětí (DMA). Tím je omezeno vytěžování procesoru, který může získaný čas využít pro jiné výpočty. DMA lze navíc optimalizovat dle dostupných rozhraní. Na platformách Xilinx Zynq i Altera Cyclone V SoC např. najdeme ACP port, který dovoluje přistoupit z FPGA do L2 cache sdílené oběma jádry ARM. Přístupy do této paměti je výhodné přizpůsobit velikostem jejích řádků. Samotný princip DMA však negativně ovlivňuje latenci přenosů díky nezbytné konfigurační režii řadiče. Proto může být u tohoto spoje vhodnější použít i jednodušší způsob komunikace. Od toho se dále odvíjí i implementace ovladačů pro operační systém.
Tuto problematiku musí ovšem řešit prakticky každý projekt využívající komunikaci mezi procesorem a FPGA logikou. To vyžaduje znalosti nejen z oblasti FPGA, ale také z oblasti ovladačů pro linuxový nebo i jiný operační systém. Je tedy vhodné využít nějaký existující a odladěný systém pokrývající nejběžnější způsoby komunikace. Příkladem takového řešení je RSoC Framework, který tuto problematiku pokrývá.