Skriv ut
Högnivåsyntes är ett effektivt sätt att minimera strömförbrukningen i en kretskonstruktion, skriver Anil Khanna och Shawn McCloud på Mentor Graphics.
 Areaoptimering och tid till färdig implementation har länge varit de vanligaste utmaningarna i digital konstruktion för vanliga digitala integrerade kretsar. Man har analyserat och dokumenterat hur man bäst kan lösa dessa utmaningar vid olika nivåer från RTL vidare till grindnivå ner till layout.
Nu när applikationer har blivit allt mer portabla och effektkänsliga, så har effektutforskning och smarta konstruktionssätt för att reducera effektförbrukningen hamnat i fokus.

Abstraktion möjliggör konstruktionsoptimering. Låt oss först se fördelarna med högnivåsyntes. På samma sätt som för optimering mot area och tid, så är det bättre ju tidigare man tar hand om effektproblematiken, då mer flexibilitet ges konstruktören att finna en optimal lösning. Nu med tillgängligheten av ANSI C++ och nästa generations högnivåsyntesverktyg kan man möta effektoptimeringar på en mycket högre nivå än traditionell RTL.

Hastigheten och enkelheten med vilket ett högnivåsyntesverktyg kan generera RTL från en given källkod i ANSI C++ ger konstruktören flexibiliteten att jämföra flera olika arkitekturimplementationer för att plocka ut den optimala. Specifikt så kan man med högnivåsyntes effektivt utforska area, prestanda och effektförbrukning genom att använda olika algoritmer samt generera olika konstruktionsarkitekturer. Konstruktören kan jämföra prestanda, area och effekt över olika implementationer från fullständigt parallella till fullt seriella samt olika lösningar däremellan. Antalet olika lösningar som kan skapas kan vara allt från ett tiotal till hundratals olika. Att försöka göra en sådan utforskning för bara en handfull lösningar med traditionella manuella RTL-metoder är omöjligt med dagens projekttidsplaner.

Att arbeta på en högre abstraktionsnivå ger konstruktören en avsevärt högre produktivitet, alltifrån 10 till 100 gånger jämfört med RTL eller andra C-baserade hårdvaruspråk, som begränsar källan genom att hårdkoda parallellitet, tid och struktur direkt i källkoden.

En ANSI C++ källkod är av naturen en rent funktionell beskrivning av algoritmen och är därför oberoende av målarkitektur och teknologi (ASIC eller FPGA), mängden av parallellitet och önskad prestanda.

Ett konstruktionsflöde baserat på högnivåsyntes gör det möjligt för konstruktören att finjustera konstruktionen till att exakt passa de prestanda krav som finns för en given applikation, inklusive fördröjning, dataprocessningshastigher, effektförbrukning och frekvens och undviker på samma gång ett vanligt problem att ”överbygga” hårdvaran. Eftersom C- beskrivningen är helt frånkopplad från den slutliga lösningen kan konstruktörer använda styrregler under högnivåsyntesen för att enkelt bygga om lösningar för olika mikroarkitekturer och ASIC/FPGA- implementationer.

Lika viktigt är att kvaliten på den genererade RTL-koden blir avsevärt högre. Detta eftersom koden genereras automatiskt från systemspecifikationen och därför finns upp till 60% färre fel i den slutliga koden. Genom att eliminera fel som alltid dyker upp under manuell RTL-beskrivning, så hjälper högnivåsyntes att minska verifikationstiden och ger därmed också en snabbare väg till färdigt resultat.

För de fel som kommer från konstruktionsrelaterade beslut så kan samma högnivåbeskrivning även generera en konsistent verifikationsmiljö inklusive högpresterande systemmodeller. Avancerade högnivåsyntesverktyg skapar automatiskt en SystemC-testmiljö, vilket gör det möjligt för konstruktören att verifiera deras konstruktion 20 till 100 gånger snabbare än med de traditionella RTL-modellerna. En testbänk kan också genereras som automatiskt jämför ANSI C/C++-modellens utdata med RTL-modellens utdata.

Fokus på effektoptimering.
Konstruktörer av algoritmiska applikationer har tills nyligen främst varit fokuserade på att antingen förbättra konstruktionens prestanda, fördröjning, klockfrekvens eller att reducera kiselarean för att reducera tillverkningskostnaden. Men batteridrivna konsumentprodukter som förlitar sig på effekteffektiva algoritmer, såsom mobiltelefoner, handdatorer och MP3- spelare, gör numera att effektoptimeringar är det viktigaste. Typiska RTL-metoder för effektoptimeringar involverar välkända scheman såsom klockgrindning, optimering av minnesaccesser, styrning av klockhastigheter och ändrad tillståndsmaskinskodning.

De flesta av dessa tekniker kan automatiskt genereras med högnivåsyntesverktyg. En högnivåsyntesanvändare kan göra effektiva konstruktionskompromisser mellan alla tre nyckelmål – tid, area och effekt.

Noggrannheten av en effektuppskattning är typiskt sett omvänt proportionell mot en konstruktions abstraktionsnivå. Med andra ord, ju högre upp man kommer i konstruktionsmetodik, desto sämre uppskattning får man av area, fördröjning och effekt. Turligt nog är man vid högre nivåer mer intresserad av relativa effektestimeringar än absoluta värden. Möjligheten att jämföra effektförbrukningar för olika algoritmer eller mikroarkitekturer inom en algoritm ger konstruktören en ovärderlig fördel och gör det möjligt att tidigt i konstruktionsskedet göra rätt beslut för att reducera effektförbrukningen.

Enklaste sättet att demonstrera kraften och flexibiliteten i att utforska effektförbrukning vid en högre abstraktionsnivå är att ta ett enkelt exempel. Vi väljer ett enkelt FIR-filter för att belysa olika möjliga kompromisser mellan effektförbrukning och prestanda. FIR-filter är ett av de vanligaste filtren i vardagliga signalbehandlingstillämpningar, där de återskapar klarheten i digitala signaler då de  färdats genom ett överföringsmedium.

FIR-filtret är en enkel algoritm som kan implementeras på flera sätt. De flesta implementationer inriktar sig mot att antingen maximera prestanda eller att säkerställa bäst utnyttjande av kiselarea. Det exempel som vi använder oss av är ett 8-tappars FIR filter med ett klockhastighetskrav på 400 MHz och målteknologin är en 90 nm asicprocess.

En av de vanligaste strukturerna av ett FIR-filter är en direktformsimplementation, där data flyttas genom en skiftregisterbaserad fördröjningskedja och där varje registers utgång multipliceras med motsvarande koefficient. Resultatet summeras ihop och ger filtrets utresultat. Den här implementationen ger typiskt den högsta databeräkningshastigheten. Då de flesta FIR-filterkoefficienter är symmetriska så kan man optimera den traditionella arkitekturen genom att vika strukturen och därmed reducera antalet multiplicerare.

En annan implementation av ett FIR-filter, som oftast används då filtret har ett litet antal tappar, är en struktur där tapparna roteras genom ett skiftregister där endast sluttappen indexeras. Den här implementationen ger oftast resultat i en mindre area. Det finns även andra logiskt ekvivalenta FIR-implementationer såsom “transpose”-formatet eller att använda sig av ett cirkularbufferminne (då det är ett stort antal tappar) och det är upp till konstruktören att välja det som bäst passar prestandakraven. I denna artikel används direktformsregister och register baserade på rotationsimplementationen för att experimentera med samt se hur effektförbrukningen påverkas.

Genom att använda ett högnivåsyntesverktyg, såsom Catapult Synthesis från Mentor Graphics, kan man snabbt skapa flera mikroarkitekturer för en given algoritm. Till exempel så kan man med ett traditionellt FIR-filter konstrueras för att ta minimal area eller maximera prestanda i form av maximalt pipelinat och parallelliserat. Trots att funktionaliteten är densamma så är effektförbrukningen för dessa implementationer tydligt olika. Den fullt pipelinade implementationen kan köras med högsta datatakten, men har samtidigt större area och högre effektförbrukning.

Liknande experimentella implementationer kan skapas för den registerroterade versionen av FIR-filteralgoritmen. Den här implementationen tar mindre area men använder sig också av lägre effektförbrukning jämfört med skift-registerversionen.

Genom att använda ett högnivåsyntesverktyg kan man på en kort tid utforska konstruktionsrymden för dessa två algoritmer och samtidigt skapa ett flertal implementationer. Automatisk uppskattning av effektförbrukningen på RTL-nivå kunde nås genom använding av verktyget Power Theater från Sequence Design.

Baserat på vilka kriterier som finns för konstruktionen har konstruktören ett stort antal alternativ. Som väntat är area och estimerad effektförbrukning högst för den fullt pipelinade lösningen (DIRECT_FORM_THRUPUT_1) som läser och skriver data varje klockcykel. Andra lösningar ger olika areor, dataflödeshastigheter och effektförbrukningar. En högnivåsyntes användare kan sedan göra konstruktions avvägningar baserade på dessa data och välja lämplig implementation för deras givna behov.

Att se på effektförbrukning på en högre nivå. Det här enkla exemplet visar nyttan av arkitekturell utforskning vid en högre nivå med hänsyn till effektförbrukning. Före uppkomsten av högnivåsyntesverktyg var det inte praktiskt att utforska en mängd olika arkitekturer genom att använda traditionella RTL-konstruktionsmetoder. Nu kan konstruktörer utforska olika arkitekturer för att hitta den som bäst passar area, prestanda och speciellt effektkrav. Resultatet är en mer optimal konstruktion för även de mest komplexa applikationerna utan att för den skull offra möjligheten att snabbt komma ut på marknaden.