FPGA s Verilog na PCIe kartě

PanVP

  • *****
  • 892
    • Zobrazit profil
    • E-mail
FPGA s Verilog na PCIe kartě
« kdy: 14. 10. 2021, 15:53:26 »
Ahoj,

mám jeden projekt, který by si zasloužil předělat na FPGA, VHDL je na mě asi moc, ale Verilog mi přijde snesitelnější.

Jsou různé PCIe karty s FPGA:



Potřebuji do FPGA dostat blok o velikosti ~32MB, zpracovat ho, dostat ho zpátky do RAM.
Ideální tak zpracovat 20 až 30 takových bloků za vteřinu.

Jenže jak dostat data z té karty přes PCIe do RAM?
Předpokládám, že by znamenalo:
- ve Verilogu "napsat" funkční interface pro PCIe
- napsat si vlastní primitivní driver do Linux (včetně naučit se ovládat DMA v Linux)
- "nějak" do svého programu přidat tu kartu

Jinými slovy, přijde mi, že by to mělo tuto náročnost:
10% práce na naprogramování vlastního problému (není to až tak světoborné)
90% práce na omáčcce okolo, abych dostal data po PCIe do paměti té FPGA karty a jak data dostat data z paměti karty

Nějaký nápad, jak se tomu vyhnout?
Aby to mělo smysl předělávat na FPGA, potřebuji stream ~800 MB/s z FPGA do PC,
případně obráceně, protože data jdou dovnitř a pak ven.

Tento projekt je vesměs solitér.
« Poslední změna: 14. 10. 2021, 15:58:40 od PanVP »


RDa

  • *****
  • 1 500
    • Zobrazit profil
    • E-mail
Re:FPGA s Verilog na PCIe kartě
« Odpověď #1 kdy: 14. 10. 2021, 16:09:39 »
Ve FPGA nebyva 32MiB pameti (ram), takze to nemas vlatne KAM prenest. A pokud to bude externi DDR, tak to bejva 32bit, nekdy 64... jako single channel ddr3/ddr4. PC je na tom s pameti lepe :-)

PanVP

  • *****
  • 892
    • Zobrazit profil
    • E-mail
Re:FPGA s Verilog na PCIe kartě
« Odpověď #2 kdy: 14. 10. 2021, 19:00:00 »
externi DDR, tak to bejva 32bit, nekdy 64... jako single channel ddr3/ddr4

Ano, koukal jsem výhradně na karty s paměťovým slotem.
A teď mě to nějak dost vyděsilo, to musím naprogramovat i paměťové rozhraní ? ??? :o
Že nejsou právě rychlé, to by nevadilo, koukal jsem na karty s DDR3, i kdyby to bylo jen 32 bit, tak se bavíme o ~4GB/s, resp cca ~8 GB/s při 64bitech pro nejpomalejší moduly ne?

Doufám, že to paměťové rozhraní je alespoň hotové tzn. člověk se k tomu chová jako "ke kusu jedniček a nul".
Jestli se jim musí posílat clock, select a vůbec celý ten bambilion blbin, které ram potřebuje, aby fungovala, tak to potěš koště. Doufám, že ty ramky jsou selfrefresh...protože jestli bych musel řídit i to, tak bych měl co dělat do důchodu  :o

Co ta komunikace s PCIe? Je tam nějaké jednoduché rozhraní + základní ovladač nebo jen nějaký template a vše od píky?
« Poslední změna: 14. 10. 2021, 19:04:34 od PanVP »

RDa

  • *****
  • 1 500
    • Zobrazit profil
    • E-mail
Re:FPGA s Verilog na PCIe kartě
« Odpověď #3 kdy: 14. 10. 2021, 19:13:33 »
Ke vsemu existuji generatory od vyrobcu, pripadne 3rd party IP jadra. Neni to uber-optimalni, ale pokud nejsi narocny tak to staci.

Vetsina "API" je asynchronni, neco tam cpes jednim koncem a o nahodnou casovou prodlevu ti pada vysledek druhym koncem. Pak zalezi zda dane jadro umi zpracovat vicero veci naraz, nebo ne. Vetsinou ano.

Se podivej do dokumentace prece, ma to jen par tisic stran k tomu co potrebujes :-)


Re:FPGA s Verilog na PCIe kartě
« Odpověď #4 kdy: 14. 10. 2021, 19:22:11 »
tipnu si, že přes GPU to budeš mít rychleji hotový a mnohem levnější


Re:FPGA s Verilog na PCIe kartě
« Odpověď #5 kdy: 14. 10. 2021, 19:26:15 »
tipnu si, že přes GPU to budeš mít rychleji hotový a mnohem levnější

a mozna podle problemu to muze jit i na CPU.
mohl by nam popsat o co jde.

Re:FPGA s Verilog na PCIe kartě
« Odpověď #6 kdy: 14. 10. 2021, 19:30:17 »
nemusíš programovat ani řadič rozhraní DDR a už vůbec ne řadič rozhraní PCIe. Dokonce i kdyby jsis je fakt chtěl (a věř mi, že fakt nechtěl. DDR možná, ale PCIe fakt ne) napsat ručně, tak smůla (vysvětlím v třetím odstavci). Obecně se to dělá, že si ve vývojovém nástroji přidáš blok, který je obvykle poklikáním konfigurovatelný a v konfigurátoru si naklikáš jaké to má mít vlastnosti. Blok pak bude mít nějaké "vodiče" na které přivedeš adresy, data, transakce, .... Většinou tak implementuješ jen něco, co do těch bloků bude cpát data, což je mnohem jednodušší než implementovat ten samotný blok.

Ten konfigurovatlený blok, který si tam vložíš je speciální blok (podobně jako DSP bloky, malé RAMky, atd) ve skutečnosti není syntetizován na samotném hradlovém poli. Důvod je ten, že ta sběrnice je extrémně rychlá a není rozumně reálné implementovat obsluhu tak rychlých signálů v tak komplexní struktuře hradel. Místo toho je to tam natvrdo zadrátované v mnohem přímočarejší, ale neupravitelné struktuře.

Jen pro představu hodiny uvnitř té hradlové struktury dokáží běžet na frekvencích okolo 500 MHz. Není tedy možné zpracovat rychlejší signál než 500 MHz. Signály, které ale používají zmíněné sběrnice běžně používají hodiny na frekvencích daleko přes GHz (např. DDR běžně 1600 MHz, dnes klidně i víc). Obecně si to předdstav tak, že je to řešeno způsobem, že do toho speciálního bloku popsaného v prnvím odstavic posíláš nebo čteš z něj paralelně třeba 32 bitů na frekvenci 50 MHz (což je na většine FPGA v pohodě zvládnutelné s prstem v nose), ale na druhé straně na vodíčích ven z FPGA ten speciální natvrdo zadrátovaný blok generuje nebo čte jeden (nejčastěji diferenciální) signál na grekvenci 1600 MHz serializovaný z těch dat co jsi tam pralelně poslal.

Ten blok je ve skutečnosti složitějíš a řeší i nějaké věci ohledně protokolu, který se tam používá. K tomu tě většinou navede to co ten konfigurátor toho bloku umožňuje naklikat.

Ok a teď abych zodpověděl tvůj dotaz: Najdi si na stránkách výrobce FPGA, které používáš uživatelskou příkazu (u Xilinx se to jmenuje User Guide - UG, u jiných výrobcí většinou Application Node - AN) a měl bys najít příručky věnované PCIe i příručku věnovanou DDR. Tyto příáručky nebývají step-by-step tutorial, ani tam nebývá detailní popis toho protokolu, ale vše podstatné k základnímu zprovoznění by tam mělo být.

PanVP

  • *****
  • 892
    • Zobrazit profil
    • E-mail
Re:FPGA s Verilog na PCIe kartě
« Odpověď #7 kdy: 14. 10. 2021, 19:52:46 »

Dík! Mrknu na to.
Přiznám se, že výrobce je podružný, zatím jsem ho neřešil, spíš abych prototyp pořídil za rozumné peníze.
Pak, jestli bude samotná karta stát 100 nebo 200, tisíc mi je jedno. Když to bude fungovat, tak se to zaplatí.

přes GPU to budeš mít rychleji hotový
GPU je specifická a méně vyhovuje tomu, co dělám (netvrdím že jsem nejlepší programátor na světě).
S GPU vezmeš naráz paralelně milion "lidí" a všechny ostříháš.
Mně víc vyhovuje serializovaný postup, kdy vezmeš milion lidí, kdy první ti chytá za kliku, druhý otvírá dveře, třetí si sedá, poslední odchází, předposlední děkuje, ten před ním právě zaplatil, ten předním právě platí...
« Poslední změna: 14. 10. 2021, 19:56:25 od PanVP »

mhi

  • ****
  • 329
    • Zobrazit profil
Re:FPGA s Verilog na PCIe kartě
« Odpověď #8 kdy: 14. 10. 2021, 20:25:32 »
Ja jsem takovy lepic lowcost reseni, neznam danou ulohu, atd. Nebylo by resenim nejake levnejsi FPGA a pres nejaky cypress to krmit daty z USBcka ? A tech zarizeni mit diky nizsi cene vic, aby to dalo pozadovanou rychlost zpracovani.

PanVP

  • *****
  • 892
    • Zobrazit profil
    • E-mail
Re:FPGA s Verilog na PCIe kartě
« Odpověď #9 kdy: 14. 10. 2021, 20:37:35 »
lowcost reseni

To by asi řešení bylo, líp by to i škálovalo.
Koukal jsem, že obyčejnější FPGA mají asi 100k prvků (hodně hrubě), bohužel netuším, jestli by se to vešlo nebo ne.
Nebo kolik mají ty lowcost řešení prvků, jestli to lowcost nemá taky třeba jen 1/10 frekvenci a podobně.

Popravdě, postavil jsem se k tomu hodně naivně, vím, jak velký blok dat chci zpracovat a protože zpracovat ho naráz je výhodnější, mám představu dostat ho do paměti, zpracovat ho v ram a výstup hodit do ram. Něco jako: Zatímco blok A leze do karty, blok B se zpracovává a blok C si stahuju z karty....
« Poslední změna: 14. 10. 2021, 20:41:20 od PanVP »

mhi

  • ****
  • 329
    • Zobrazit profil
Re:FPGA s Verilog na PCIe kartě
« Odpověď #10 kdy: 15. 10. 2021, 01:10:42 »
Chtelo by to asi vedet vic informaci o tom co vlastne chcete delat. Kdybych to delal ja ... a ze nevim "co bych delal", moji snahou by bylo eliminovat ty drahe prvky, treba tim, ze bych se snazil vyhnout pouziti nejake DDR okolo, a nejak to jen prohnal predkousane tim FPGAckem. Vsechno je pak o dost jednodussi. A idealne treba tak, ze bych to napojil primo na nejakou ARM desticku, cimz bych se vyhnul problemum s PCIe nebo pomalosti USB. MediaTek ma SoC s periferiemi, ktere jsou takovy svycarsky nozik na komunikaci (slouzi to treba na vystup LCD/HDMI/... ale presvedcite to k temer cemukoliv).

Alternativne nejake vetsi FPGA s hard ARM core, nicmene s tim mam nulove zkusenosti, nikdy jsem s tim nedelal. https://www.xilinx.com/products/silicon-devices/soc/zynq-7000.html

Re:FPGA s Verilog na PCIe kartě
« Odpověď #11 kdy: 15. 10. 2021, 07:04:59 »
Zkusím popsat svoje zkušenosti, byť malé.
Hrál jsem si s FPGA cca před deseti lety, takže situace se mohla značně zlepšit, přesto je asi dobré si dát pozor na to, co zmíním.

- vývojová prostředí pro FPGA byla mnohdy zadarmo, ale s omezenou funkčností, např. jen pro učitá, spíše malá FPGA.
- pro přístup k DRAM nebo PCI byly dostupné generované obvody, jak řekl předřečník, ale mám dojem, že to bylo placené, čili byste stejně asi potřeboval plné IDE, ne žádnou free verzi.

O vlastní implementeci přístupu k periferiím ani neuvažujte, jednak to nejde kvůli pomalosti, jednak je to absolutně pekelná práce, začátečníkem prakticky nezvládnutelná.
- profesionální FPGA pro výkon s taktem >500 Mhz budou drahá, až bych si místo nich radši koupil desku s několika výkonými x86 a programoval multicore ...

No a dále k algoritmu vašeho úkolu. Bylo by dobré si přečíst něco o tom, jak jsou FPGA implementovaná. Brzy zjistíte, že jakýkoli obvod sice na FPGA naimplementujete, ale některé operace využíjí extrémně mnoho zdrojů FPGA, takže se vám to custom CPU ani nevleze.
Levné operace jsou sčítání, odčítání, různé přesuny a výměny bitů. Násobení je už horší, ale jsou tam dedikované násobičky typu 16x16bitů (nebo o něco více). Pokud násobíte větší integery, kvadraticky vám poroste počet zkonzumovaných násobiček. A těch tam tolik zase není.
Dělení je samozřejmě nutné se obloukem vyhýbat, na to dedikovaný obvod není a sežere vám to kus FPGA.

Nepověděl jste nám, zda pracujete s celočíselnými daty nebo floating pointem.
Pokud chcete pracovat s floaty, ani o FPGA nepřemýšlejte. Jen implementace jednoduchého FPU vám sežere hrůznou část FPGA (tedy zejména malé FPGA).
Proto FPGA mívají dnes často dedikované třeba ARM jádro na běžnou logiku - implemnetovat i RISC CPU třeba sežere i celou FPGA. Vím, že nechcete implementovat celé vlastní CPU, ale píšu to jen pro ilustraci, jak rychle můžete vyplýtvat zdroje FPGA. A kromě jednoduchých operací vám budou docházet integrované bloky SRAM (např. na registry), přičemž k jednotlivým blokům interní SRAM je omezený počet paralelních přístupů (třeba dva).

Dále k vašemu algoritmu. Říkáte, že máte radši sériovou implementaci algoritmu, ale pak spíše naznačujete, že byste chtěl paralelní frontu (pipeline). Dobře si rozmyslete, zda dokážete algoritmus vyjádřit jako pipeline s mnoha kroky.
Čím více kroků, tím lépe - využijete paralelních schopností FPGA.
Pokud pipeline nebude dost hluboká, budete to mít pomalé, protože FPGA je na čistě sériové operace pomalá (vyplývající z frekcence v řádu stovek MHZ, a toho, že na jeden takt frekvence toho mnoho nespočítáte).

Pokud tedy nemáte algoritmus, který počítá jen v integerech a fikaně nakládá s bity a je dobře paralelizovatelný do hlubokých pipeline, myslím, že si nepolepšíte a budete nepříjemně překvapen.
Na obecnou akcelaraci výpočtů bych skutečně radši nakoupil GPU nebo slušné desktopvé/serverové CPU.
FPGA dokáže urychlit jen určité, správně napsané algoritmy. Není vhodné to použít jako generalizovaný akcelerátor algoritmu, který jste si někde nachystal v C ...

Re:FPGA s Verilog na PCIe kartě
« Odpověď #12 kdy: 15. 10. 2021, 11:12:01 »
Alternativne nejake vetsi FPGA s hard ARM core, nicmene s tim mam nulove zkusenosti, nikdy jsem s tim nedelal. https://www.xilinx.com/products/silicon-devices/soc/zynq-7000.html

Toto není můj obor - jenom z doslechu od jednoho dodavatele vím, že používají Altera Arria. A že na Zynq před lety taky koukali, ale tehdy byl dost rozdíl v komfortu a dotaženosti vývojových nástrojů (softwaru), Arria vyhrála na celé čáře...

Re:FPGA s Verilog na PCIe kartě
« Odpověď #13 kdy: 15. 10. 2021, 11:26:02 »
...je potřeba, aby FPGA ten 32MB "balík" vidělo naráz? Jako že data uvnitř toho bloku spolu souvisí a jsou potřeba ke zpracování? Protože pro efektivní PCI-e DMA přenos by stačil mnohem menší blok, střelím od boku třeba 1 kB...

BTW OT: ten expanzní konektor na kartách, to je FMC bus? Jako tady? Jasně, pro Vaše potřeby irelevantní...

RDa

  • *****
  • 1 500
    • Zobrazit profil
    • E-mail
Re:FPGA s Verilog na PCIe kartě
« Odpověď #14 kdy: 15. 10. 2021, 11:41:32 »
...je potřeba, aby FPGA ten 32MB "balík" vidělo naráz? Jako že data uvnitř toho bloku spolu souvisí a jsou potřeba ke zpracování? Protože pro efektivní PCI-e DMA přenos by stačil mnohem menší blok, střelím od boku třeba 1 kB...

BTW OT: ten expanzní konektor na kartách, to je FMC bus? Jako tady? Jasně, pro Vaše potřeby irelevantní...

PCIe je efektivni uz pri naplneni Max Payload - tj. 128B pri desktop, 256B pri server zeleze (nyni to ma amd i v desktopu).

Ale z pohledu OS a aplikace, je optimalni velikost bloku "nekonecna" (tedy prakticky omnoho vyssi nez hw optimum) - protoze je nutno provest preklad na fyzicke adresy, zajistit ze se data neodswapuji a jine pausalni ukony v OS, per blok. Delat to po vlastni ose prinese jiste vykon, ale pro laiky je snazsi pouzit neco klikaciho a hotoveho, i za ztratu deset - dvacet procent vykonu.

Jo, vypada to jako FMC, ale neni jiste ktera varianta (LPC,HPC) a kolik a jak rychlych seriovych linek to ma.