En avancerad riscprocessor helt utan klocka? Det låter utopiskt, men finns faktiskt redan idag. En forskargrupp på University of Manchester utgick från riscprocessorn ARM6, från Advanced Risc Machines, och utvecklade en asynkron, det vill säga klocklös, variant som döptes till Amulet1.
Huvudsyftet var att visa att det över huvud taget går att konstruera avancerade klocklösa kretsar. Och det lyckades man med. Amulet1 är fullt kodkompatibel med sin klockstyrda föregångare, och kan alltså användas i en dator.
I dagens datorer är synkron logik näst intill allenarådande. Huvudskälet är att klockstyrda konstruktioner är lättare att utveckla. Varför ger man sig då på asynkrona konstruktioner över huvud taget? Ett skäl är att man slipper klockförskjutning, en stor stötesten i synkrona kretsar.
Alla signaler fördröjs när de fortplantas över kislet. Klockan är inget undantag och i värsta fall kan systemet komma i otakt. Dagens konstruktörer tvingas därför ta till bastanta klockdrivare och klocknät, vilket kostar kisel. Utan klocka slipper man dessa problem.
Klockor slösar effekt
Men det främsta argumentet för asynkrona konstruktioner är att de är så effektsnåla. Vid varje klockpuls i en synkron krets förbrukas effekt oavsett om något arbete utförs eller inte.
En asynkron krets är däremot helt händelsestyrd. Ett antal logikblock arbetar fritt och synkroniseras med handskakning för att hantera gemensamma tillgångar, exempelvis minnet. När inget arbete utförs bränner man ingen effekt alls.
Båda problemen förvärras när kretsarnas dimensioner krymper och frekvenserna ökar. Processorer som Digitals Alpha och Texas Instruments Viking Sparc drar mellan 20 och 30 W. Och det dröjer nog inte många år förrän processorerna förbrukar flera hundra W.
Ett av målen med det Esprit-stödda Amuletprojektet var därför att undersöka hur mycket effektsnålare en asynkron konstruktion är jämfört med en synkron.
Nu visade det sig att Amulet1 förbrukar något mer effekt än sin klockstyrda föregångare. ARM6 slår faktiskt Amulet1 på fingrarna på de flesta områden. Den asynkrona varianten kan endast erbjuda 70 procent av föregångarens prestanda, och ytan är dubbelt så stor.
Men Manchestergruppen låter sig inte nedslås. Man pekar på att ARM6 är en fjärde generationens processor, medan Amulet1 är den första i sitt slag. Och gruppen närmar sig nu slutfasen i utvecklingen av en efterföljare, Amulet2, som förhoppningsvis skall stå sig bättre vid en jämförelse.
Rör i risc lockade
Att man valde just en riscprocessor till projektet är ganska naturligt. Dessa har oftast en rörarkitektur, pipeline, vilket lämpar sig väl för asynkrona tillämpningar.
Den grundläggande skillnaden mellan processorerna är att flera instruktioner kan exekveras parallellt i varsitt rörsteg i Amulet. I den synkrona kusinen ARM6 kan bara en instruktion åt gången exekveras.
Även utvecklingsarbetet skiljer sig från traditionell konstruktion. I Amulet1 används övergångssignalering - transition signalling - vilket innebär att signalens nivå helt saknar betydelse. Det enda intressanta är huruvida signalen ändras, oavsett om den stiger eller faller. Konstruktörerna fick ta fram ett eget asynkront bibliotek för att ro processorn i hamn.
Amulet1, som är en skräddarsydd krets - full custom - utvecklades med verktyg från Compass. Man tillverkade kretsarna i två CMOS-processer: 1 μm hos ES2 samt i GEC Plesseys 0,7 μm-process. Båda varianterna fungerade direkt, men man fick göra smärre rättningar i både maskin- och programvara för att klara avbrottshanteringen. Steve Furber
Författaren är professor vid University of Manchester.
Artikeln är översatt och bearbetad av Charlotta von Schultz.
Specialutvecklat bibliotek för klocklös konstruktion
För att konstruera Amulet1 användes ett speciellt bibliotek med byggblock som stöder övergångssignalering, transition signalling. Det innebär att en signals nivå helt saknar betydelse. Det enda intressanta är om signalen ändras.
För varje signal användes två separata ledningar. En ändring på den ena ledningen betyder en logisk etta medan en ändring på den andra indikerar en nolla.
Här är ett axplock ur biblioteket:
En Muller C-grind väntar tills den tagit emot en händelse på båda ingångarna innan utgången ändrar värde.
En XOR-grind ändrar värde på utgången om någon av ingångarna ändras.
När oberoende logikblock skall samsas om exempelvis ett minne behövs en arbitrerare som ser till att endast ett logikblock i taget skriver i minnet.
Dessutom finns händelsestyrda register, som spelar en nyckelroll i de asynkrona rörledningarna - pipelines. Registren håller data stabilt och kan kopplas ihop till ett fifo. Genom fifot kan data strömma mycket snabbt då man inte är låst till en klocka.
För att skapa en rörledning blandar man in logik mellan de händelsestyrda registren.