Videoalgoritmes worden vaak in software ontwikkeld en getest door ’s nachts een deel van een film te processen. ’s Ochtends kan dan het resultaat worden afgespeeld om vervolgens aanpassingen te doen en de volgende dag het resultaat weer te bekijken. Als dit algoritme productrijp is, wil marketing het zo snel mogelijk als nieuwe feature verwerken in de volgende productgeneratie.
Op dat moment komen de hardware- en fpga-designers erbij om de C++-code om te zetten in hardware. Voor de algoritme- en softwareontwikkelaars lijkt dat eeuwen te duren; toen ik een for-loop van vijf regels referentiecode in drie weken had geïmplementeerd in de fpga, keken mijn softwarecollega’s me raar aan.
Dan moet je hun uitleggen dat je in C++ wel een pointer naar het geheugen kunt gebruiken om data te lezen, te bewerken en terug te schrijven, maar dat je in hardware die data werkelijk naar de block-ram van je fpga moet halen voordat je hetzelfde kunt. En ‘even een videoframe’ aflopen gaat ook niet in hardware. Hooguit kun je een aantal videolijnen opslaan in je fpga. En dan heb ik het nog niet eens over floating point-berekeningen, een deling uitvoeren of even een bestand wegschrijven naar een harddisk. C++-code is geen hardwarebeschrijving, maar een algoritme in een sequentiële taal.
Totdat je high-level synthesis (hls) gaat gebruiken. En dan met een echte hls-tool, geen macrosubstitutie in een C++-sausje met een precompiled library voor een specifieke fpga, zoals ik dat tot op heden had gezien. Wij zijn Catapult van Mentor Graphics gaan gebruiken en het is verbluffend om te zien dat je daarmee een stuk code simpelweg kunt selecteren om er hardware van te maken. De rest van de designcode plus de bestaande softwaretests fungeren vervolgens als testbench, en het is onvoorstelbaar dat de gegenereerde rtl in de simulator dan echt functioneert zoals je ontworpen had in C++. Ik stel me voor dat de mensen in de jaren zeventig zich zo gevoeld moeten hebben toen de allereerste C-compiler op een PDP-11 assemblycode genereerde die echt werkte.
Het is ook mooi om te zien hoe het ontvangen wordt binnen ons bedrijf. Mijn jonge collega ging er enthousiast mee aan de slag: ‘Dit is gaaf!’ Onze systeemarchitect verdiepte zich in de C++-algoritmes en toen hij onze echte deling in tien minuten in hardware had, en de waveforms in de simulatie aantoonden dat het echt werkte, was ik echt verbaasd. En helemaal toen hij in de hls-tool de deler veranderde in een pipelined versie, het schedule aanpaste en het ook nog eens kleiner werd zonder functionele penalty door de extra latency. Dat is met System Verilog niet mogelijk in een middagje.
Ik ben twee dagen van de wereld geweest toen de mogelijkheden echt tot me doordrongen. Hls vervangt niet het digitale ontwerp, maar brengt de algoritmeontwikkeling en de hardware-implementatie samen. Het vraagt van de digitaalontwerper om ook C++-code te schrijven en te snappen hoe zich dat vertaalt in hardware.
Van de algoritmeontwikkelaar en softwaredesigner wordt verlangd om digitaal ontwerpen te begrijpen. Het was leuk om te zien dat onze softwarejongens er ook enthousiast mee aan te slag gingen, maar dat de backend-tool dramatisch lagere klokfrequenties rapporteerde dan beoogd. Hls is niet just another C-compiler; het is een tool om vanuit C++-code hardware te ontwikkelen. Net als in een hdl kun je in C++ een slecht digitaal design opschrijven dat te veel resources vraagt of waarmee je nooit je benodigde frequentie haalt.
En net zoals in een hdl moet je C++-code kunnen lezen als een hardware-implementatie. Dit heb je nodig om te kunnen bepalen waar je flipflops wilt tussenvoegen als je je timing niet haalt omdat je te lange paden hebt tijdens place & route en hoe je resources kunt optimaliseren door je C++-code anders op te schrijven of je hls-compiler anders in te stellen. Je ziet nu ook dat de samenwerking en het overleg tussen algoritme-, software- en hardwaredesigners cruciaal is om deze technologie succesvol toe te kunnen passen in een project. En dan is het resultaat een spectaculaire stap vooruit in productiviteit en flexibiliteit!