4 ORGANIZACIJA IN IZVEDBA ARMA ......................................................................................... 1 4.1 ORGANIZACIJA 3-STOPENJSKEGA CEVOVODA .............................................................................. 1 3-stopenjski cevovod ............................................................................................................................. 2 Delovanje programskega števca ........................................................................................................... 5 4.2 ORGANIZACIJA 5-STOPENJSKEGA ARM CEVOVODA..................................................................... 5 Pomnilniško ozko grlo (Von Neumann-ovo ozko grlo) ......................................................................... 6 5-stopenjski cevovod ............................................................................................................................. 6 Posredovanje podatkov naprej.............................................................................................................. 7 Delovanje programskega števca ........................................................................................................... 8 4.3 IZVAJANJE ARM UKAZOV ............................................................................................................ 9 Ukazi za obdelavo podatkov ................................................................................................................. 9 Ukazi za prenos podatkov ....................................................................................................................10 Ukazi vejitev .........................................................................................................................................12 4.4 ARM IZVEDBA ............................................................................................................................13 Shema ure ............................................................................................................................................13 Časovna uskladitev podatkovnih poti...................................................................................................13 Zasnova seštevalnika ...........................................................................................................................14 ALU funkcije ........................................................................................................................................16 ARM6 seštevalnik .................................................................................................................................16 Struktura ARM6 ALU ...........................................................................................................................17 Seštevalnik s poravnavo bitov ..............................................................................................................18 Pomikalna enota ..................................................................................................................................19 Zasnova množilnika .............................................................................................................................20 Visoko zmogljivi množilniki .................................................................................................................21 Polje registrov......................................................................................................................................23 Ureditev podatkovnih poti....................................................................................................................25 Nadzorne strukture...............................................................................................................................25 4.5 ARM KOPROCESORSKI VMESNIK.................................................................................................27 ARM7TDMI koprocesorski vmesnik ....................................................................................................27 Prenos podatkov...................................................................................................................................28 Izvajanje vnaprej..................................................................................................................................29 Uredil: Janez Podobnik, korekcije: Marko Munih Univerza v Ljubljani, Fakulteta za elektrotehniko, Laboratorij za robotiko 4 Organizacija in izvedba ARMa 4.1 Organizacija 3-stopenjskega cevovoda Osnovna organizacija ARM jedra s 3-stopenjskim cevovodom je prikazana na sliki 4.1. Glavni gradniki so: • Polje registrov (ang. register bank), ki shranjuje stanja procesorja. Ima dvoje vrat za branje in ena vrata za pisanje, ki se lahko uporabijo za dostop do katerega koli registra, poleg tega pa še dodatna vrata za branje in dodatna vrata za pisanje, ki omogočajo poseben dostop do r15 (programski števec). Dodatna vrata za pisanje na r15 omogočajo, da je programski števec, ko je naslov za prenos ukaza inkrementiran tudi osvežen, dodatna vrata za branje pa omogočajo, da se prenos ukaza nadaljuje po definicijo naslova podatka. • Pomikalna enota (ang. barrel shifter), ki lahko bite operanda pomika ali rotira za poljubno določeno število bitov. 1 • • • • ALU, ki opravlja aritmetične in logične operacije, ki so določene z naborom ukazov (ang. instruction set). Naslovni register (ang. address register) in inkrementer (ang. incrementer), ki izbere in zadrži vse naslove in tvori naslednji naslov, ko je to potrebno. Podatkovni register (ang. data register), ki hrani podatke, ki potujejo v ali iz pomnilnika. Dekoder ukazov (ang. instruction decoder) in podporno logično vezje. Pri ukazu, ki traja en cikel ure (eno-ciklični ukaz), se dostopa do dveh operandov registrov (ang. register operand), vrednost na B vodilu je premaknjena (ang. shifted) in združena z vrednostjo na vodilu A v ALU, potem pa se rezultat zapiše nazaj v polje registrov. Vrednost programskega števca je v naslovnem registru, od koder se potem premakne v inkrementer, nato pa se povečana vrednost prepiše nazaj v r15 v polju registrov ter v naslovni register kot naslov za naslednji zajem ukaza (ang. instruction fetch). 3-stopenjski cevovod ARM procesorji do ARM7 uporabljajo preproste 3-stopenjske cevovode z naslednjimi stopnjami: • Zajem – ukaz je dostavljen iz pomnilnika in naložen v cevovod. • Dekodiranje – ukaz je dekodiran, prav tako so kontrolni signali podatkovnih linij (ang. datapath) pripravljeni za naslednji cikel. V tej stopnji ukaz zavzema dekodirno logiko, ne pa tudi podatkovnih linij. • Izvajanje – ukaz zavzema tudi podatkovne linije; prebere se polje registrov, operand je pomaknjen, izračuna se rezultat ALU, ki se vpiše nazaj v naslovni register. 2 Slika 4.1 Shema organizacija 3-stopenjskega ARM cevovoda 3 V vsakem trenutku lahko trije različni ukazi zasedajo vsako od teh treh stopenj (vsak ukaz svojo stopnjo), tako da mora biti strojni del v vsaki stopnji sposoben samostojnih operacij. Ko procesor izvaja preprost ukaz obdelave podatkov, cevovod omogoča, da je v vsakem ciklu navidezno izveden en ukaz. Posamezni ukaz potrebuje sicer tri cikle, da se izvede do konca, tako ima torej zamik treh ciklov, skupni pretok ukazov pa je torej zaradi 3-stopenjskega cevovoda enak enemu ukazu na cikel. Slika 4.2 prikazuje 3-stopenjsko operacijo za eno-ciklični ukaz. Slika 4.2 3-stopenjska operacija eno-cikličnega ukaza. Pri izvajanju več-cikličnih ukazov je pretok ukazov skozi cevovod manj reden, kar prikazuje slika 4.3. Slika prikazuje niz eno-cikličnih ukazov ADD ter ukaz za shranjevanje podatkov STR, ki sledi prvemu ukazu ADD. Cikli v katerih se dostopa do glavnega pomnilnika so osenčeni, iz slike pa je razvidno, da se do pomnilnika dostopa v vsakem ciklu. Prav tako so v vsakem ciklu v uporabi podatkovne linije, ki so vključene v vse izvajalne cikle, izračunavanje naslovov in prenose podatkov. Dekodirna logika generira kontrolne signale za uporabo podatkovnih linij v naslednjem ciklu, tako da poleg kontrolnih signalov za trenutni cikel, generira tudi kontrolne signale za prenos podatkov med ciklom, ko se izračunava naslova za ukaz STR. V takem nizu ukazov so vsi deli procesorja aktivni v vsakem ciklu. Pomnilnik je tisti faktor, ki omejuje, saj določa število ciklov potrebnih za izvedbo zaporedja ukazov. Za boljše razumevanje zgornjega je mogoče dodati naslednje: • Vsi ukazi zasedajo podatkovne linije za en ali več dodatnih ciklov. • Ukaz, ki v nekem ciklu zaseda podatkovno linijo, zaseda tudi dekodirno logiko v naslednjem ciklu. • Vsak ukaz v izvajanju povzroči zajem naslednjega ukaza. • Ukazi vejitev počistijo in ponovno naložijo ukazni cevovod. 4 Slika 4.3 Izvajanje več-cikličnega ukaza v 3-stopenjskem cevovodu. Delovanje programskega števca Posledica uporabe cevovodov v ARM sistemih je, da mora programski števec, uporabniku viden kot r15, prehitevati trenutni ukaz. Kot je omenjeno zgoraj mora ukaz v izvajanju povzročiti zajem naslednjega ukaza. To pomeni, da mora programski števec kazati osem bajtov (dva ukaza) naprej od trenutnega ukaza. To je pravzaprav ravno tisto kar se zgodi in programer, ki poskuša dostopati do programskega števca neposredno prek r15, mora to upoštevati. Vsekakor pa zbirnik (ang. assembler) in prevajalnik sama poskrbita za te podrobnosti v večini primerov praktične uporabe. Še bolj zapleten primer se pojavi, če r15 ni uporabljen v prvem ciklu ukaza, temveč v ostalih ciklih ukaza, saj bo ukaz sam inkrementiral programski števec med prvim ciklom. Taka uporaba programskega števca ni prav dosti prikladna, zato definicija ARM arhitekture določa, da je rezultat nepredvidljiv. Torej bi se ga morali izogibati, še posebno ker se kasnejši ARMi v takih primerih ne obnašajo na isti način. 4.2 Organizacija 5-stopenjskega ARM cevovoda Zahteve po boljši zmogljivosti procesorjev narekujejo njihov nadaljnji razvoj. 3-stopenjski cevovodi, ki so se uporabljali v ARM jedrih do ARM7 sistemov so učinkoviti, vendar pa zahteve po boljši učinkovitosti narekujejo ponoven razmislek o organizaciji procesorja. Čas potreben za izvedbo nekega programa je odvisen od števila ukazov v programu, povprečnega števila ciklov, potrebnih za izvedbo ukaza do konca (ang. CPI – clock cycles per instruction), ter frekvence ure procesorja. Na število ukazov v programu načrtovalci ne morejo vplivati, saj je sestava programa odvisna od uporabnika, ki napiše program, za izvajanje na ARM, zato lahko vplivajo na zmogljivost le na dva načina: 5 • • Povečanje frekvence procesorja oziroma frekvence ure procesorja. To zahteva poenostavitev logike v vsaki stopnji cevovoda, kar pomeni povečanje števila stopenj cevovoda. Zmanjšanje povprečnega števila ciklov na ukaz. To pomeni, da je potrebno ukaze, ki zasedajo več kot eno polje cevovoda v 3-stopenjskih cevovodih, na novo zasnovati, tako da zasedajo manjše število polj, ali pa da zmanjšamo zastoje (ang. stall) cevovodov, ki jih povzročajo soodvisnosti med ukazi ali pa najbolje kar kombinacija obojega. Pomnilniško ozko grlo (Von Neumann-ovo ozko grlo) 3-stopenjsko ARM jedro dostopa do pomnilnika v skoraj vsakem ciklu, bodisi ob dostavljanju ukaza ali pa pri prenosu podatkov. Morebitno skrajšanje časa izvajanja v ciklih v katerih ne prihaja do uporabe pomnilnika, ne prinaša posebnega povečanja zmogljivosti. Da bi znatno zmanjšali povprečno število ciklov na ukaz, je potrebno iz pomnilnika v vsakem ciklu naložiti več kot eno vrednost. To lahko dosežemo na dva načina. Prvi je, da se v enem ciklu naloži več kot 32-bitov iz pomnilnika, drugi pa, da povečanje števila naloženih vrednosti pomnilniku v enem ciklu, dosežemo z ločitvijo enega samega pomnilnika v katerem so shranjeni tako ukazi kot podatki na dva ločena pomnilnika. Enega za ukaze in enega za podatke. Bolj zmogljiva ARM jedra zato uporabljajo 5-stopenjske cevovode in imajo ločene pomnilnike za ukaze in podatke. Razčlenitev izvajanja ukazov v pet stopenj v primerjavi s tremi, zmanjša maksimalno potrebno delo, ki mora biti opravljeno v enem ciklu, in zato omogoča uporabo višje frekvence procesorja (seveda morajo višjo frekvenco omogočati tudi ostali deli ARM sistema, še posebej pomnilnika za ukaze (ang. instruction memory). Ločena pomnilnika za ukaze in podatke omogočata znatno zmanjšanje povprečnega števila ciklov na ukaz. To je lahko izvedeno tudi z dvema ločenima predpomnilniškima enotama, ki zajemata iz istega pomnilnika. Tipičen 5-stopenjski ARM cevovod je uporabljen v ARM9TDMI. Organizacija ARM9TDMI je prikazana na sliki 4.4. 5-stopenjski cevovod Stopnje v ARM sistemih, ki uporabljajo 5-stopenjske cevovode so sledeče: • Zajem – ukaz je prenesen iz pomnilnika in naložen v cevovod. • Dekodiranje – ukaz je dekodiran, iz registrov se naložijo operandi. Registri imajo troje vrat za branje operandov, tako da lahko večina ARM ukazov dostopa do vseh operandov v enem ciklu. • Izvajanje – operand se pomakne, izračuna se rezultat v ALU. Če je ukaz povezan s shranjevanjem ali nalaganjem, se v ALU izračuna ustrezni naslov. 6 • • Vmesni pomnilnik za podatke – dostop do podatkovnega pomnilnika, če je potrebno. V nasprotnem se rezultat iz ALU samo zadrži v medpomnilniku za en cikel, da imajo vsi ukazi enako število ciklov na poti skozi cevovod. Zapiši – rezultati, ki jih vrne ukaz, se zapišejo nazaj v registre, vključno z vsemi podatki, ki so bili naloženi iz pomnilnika. 5-stopenjske cevovode uporablja veliko število RISC procesorjev, tako da njihova uporaba predstavlja klasični pristop k načrtovanju teh procesorjev. Dasiravno nabor ARM ukazov ni bil načrtovan z mislimi na tak način organizacije cevovodov, pa je mogoče prenesti nabor ukazov na 5-stopenjske cevovode razmeroma enostavno. Klasična RISC arhitektura ima dvoje vrat za branje operandov in ena za pisanje, medtem ko ima ARM troje vrat za branje operandov in dvoje za pisanje ter dodan strojni del za inkrementacijo naslovov v stopnji Izvajanja, kar omogoča nalaganje in shranjevanje večih ukazov. Posredovanje podatkov naprej Glavni vir kompleksnosti v organizaciji 5-stopenjskih cevovodov v primerjavi z njihovimi 3-stopenjskimi bratranci, se skriva v dejstvu, da je izvajanje ukazov razpršeno kar na tri stopnje 5-stopenjskega cevovoda. Edini način, da razrešimo problem medsebojne odvisnosti podatkov, ne da bi pri tem povzročali zastoje v pretoku cevovoda je uvedba poti za preddostopanje. Do medsebojnih odvisnosti podatkov pride, ko določen ukaz potrebuje rezultat prejšnjega ukaza, ta pa še ni bil zapisan v ustrezen register. Poti za posredovanje podatkov naprej omogočajo odpošiljanje rezultatov takoj po njihovi razpoložljivosti. Zasnova 5-stopenjskega ARM cevovoda omogoča posredovanje podatkov med posameznimi stopnjami iz treh vmesnih registrov z rezultati takoj ko se ti izračunajo (glej sliko 4.4). Obstaja pa en primer, ko se tudi pri odpošiljanju rezultatov po poteh za posredovanje podatkov naprej ne moremo ogniti zastojev v cevovodu. Poglejmo si naslednje zaporedje ukazov: LDR rN, [..] ; naloži od nekod rN ADD r2, r1, rN ; in ga takoj uporabi Procesor se ne more izogniti zastoju za en cikel, ker vrednost shranjena v rN lahko vstopi v procesor šele na koncu cikla/stopnje z Vmesnim pomnilnikom, naslednji ukaz pa jo potrebuje že na začetku stopnje Izvajanja. Temu se izognemo tako, da prevajalnik (ali programer, ki programira direktno v zbirnem jeziku) ne postavlja soodvisnih ukazov neposredno za ukazom za nalaganje podatkov. Ker tako zaporedje ukazov ne vpliva na izvajanje v ARM jedru s 3stopenjskim cevovodom, jih obstoječi ARM programi še vedno uporabljajo. Ti programi bodo tekli pravilno tudi na ARM jedrih s 5-stopenjskim cevovodom, 7 vendar pa bi z preureditvijo zaporedja teh ukazov dosegli hitrejše izvajanje, saj bi na ta način odstranili omenjene medsebojne odvisnosti ukazov. Slika 4.4 Shema organizacije 5-stopenjskega ARM9TDMI cevovoda. Delovanje programskega števca Obnašanje registra r15, kot je že bilo omenjeno, temelji na zasnovi izvajanja 3-stopenjskega ARM cevovoda. 5-stopenjski cevovod pa bere operande ukazov 8 eno stopnjo cevovoda prej in bi zato dobil drugačno vrednost (PC+4 in ne PC+8). Ker bi to vodilo do nesprejemljive nezdružljivosti programskih kod, vsi 5-stopenjski ARM cevovodi emulirajo (oponašajo) obnašanje 3-stopenjskih cevovodov. Slika 4.4 kaže, da je inkrementirana vrednost programskega števca iz stopnje Zajem vpisana direktno v registre v stopnji Dekodiraj in tako preskoči vmesni register med tema dvema fazama. PC+4 za naslednji ukaz je tako enak PC+8 za trenutni ukaz, s čimer je pravilna vrednost r15 dobljena brez dodatnega vezja. 4.3 Izvajanje ARM ukazov Za razumevanje izvajanja ARM ukazov si bomo pomagali s sliko 4.1, ki prikazuje organizacijo podatkovnih poti. Shemo bomo nekoliko poenostavili, saj bomo izpustili kontrolno logiko, aktivna vodila pa bomo osvetlili, da prikažemo pretok operandov skozi posamezne sestavne dele procesorja. Začnimo torej s preprostim ukazom za procesiranje podatkov. Ukazi za obdelavo podatkov Ukaz za procesiranje podatkov potrebuje dva operanda, eden od njiju je vedno register, drugi pa je ali drugi register ali fiksna vrednost (ang. immediate value). Drugi operand najprej potuje skozi pomikalno enoto, kjer se nad njim izvede splošna operacija pomika, potem pa se nad prvim in drugim operandom v ALU izvede operacija za obdelavo podatkov. Rezultat iz ALU se nato zapiše nazaj v ciljni register, postavijo se tudi zastavice v registru stanja. Vse te operacije se zgodijo v enem samem ciklu, glej sliko 4.5. Vrednost programskega števca v naslovnem registru se inkrementira in prekopira nazaj tako v naslovni register kot v r15 v polju registrov, naslednji ukaz pa se naloži na dno ukaznega cevovoda. Trenutna vrednost pa se, ko je to potrebno, naloži z vrha ukaznega cevovod. Pri ukazih za procesiranje podatkov je samo spodnjih osem bitov ([7:0]) ukaza uporabljenih kot vrednost konstante. 9 Slika 4.5 Podatkovnih poti med izvajanjem ukaza za obdelavo podatkov. Leva slika prikazuje operacijo register-register, desna slika pa operacijo register-fiksna vrednost Ukazi za prenos podatkov Ukaz za prenos podatkov (naloži ali shrani) izračunava naslov pomnilnika na podoben način, kot to poteka pri izračunavanju rezultata med procesiranjem podatkov. Register je uporabljen kot bazni naslov, temu se mu doda (ali odvzame) odmik, ki je prav tako lahko drugi register ali trenutna vrednost konstante. Vendarle pa se tokrat uporabi 12-bitna trenutna vrednost brez operacije pomika in ne pomaknjena 8-bitna trenutna vrednost kot pri ukazu za obdelavo podatkov. Naslov se pošlje v naslovni register, v naslednjem ciklu pa pride do prenosa podatkov. Da ne bi med ciklom prenosa podatkov podatkovne poti ostale več ali manj nerabljene, ALU zadrži naslove iz prvega cikla in je na voljo za izračun avtomatskega indeksiranja s spremembo baznega registra, če je to potrebno. Če avtomatsko indeksiranje ni potrebno, izračunana vrednost ni zapisana nazaj v bazni register v drugem ciklu. Operacija podatkovne poti za dva cikla operacije shranjevanja (STR) s trenutnim zamikom je prikazana na sliki 4.6. Bodite pozorni kako se inkrementirana vrednost programskega števca shrani v polje registrov na koncu prvega 10 cikla, s čimer je naslovni register prazen. Tako lahko sprejme naslov na katerega bo prenesen podatek v naslednjem ciklu, nato pa se na koncu drugega cikla programski števec shrani nazaj v naslovni register, kar omogoči pripravo za zajem naslednjega ukaza. Slika 4.6 Podatkovne poti med operacijami prenosa podatkov. Leva slika prikazuje prvi cikel – računanje naslova, desna slika pa drugi cikel – shranjevanje podatkov in avto-indeksiranje. Ravno tako bi bilo tukaj potrebno opozoriti, da je vrednost poslana v naslovni register, tudi vrednost v naslednjem ciklu uporabljena za dostopanje do pomnilnika. Naslovni register je tako pravzaprav register na cevovodu med procesorjevimi podatkovnimi potmi in zunanjim pomnilnikom. Če ukaz določa shranjevanje podatkovnega tipa bajt, potem blok za izhodne podatke izbere spodnji zlog iz registra in ga štirikrat prekopira preko 32bitnega podatkovnega vodila (4x8 bitov = 32 bitov). Kontrolna logika zunanjega pomnilnika lahko potem uporabi spodnja dva bita naslovnega vodila za aktiviranje pravega bajta v pomnilniku. Ukazi za nalaganje sledijo podobnem vzorcu, le da podatki iz pomnilnika v drugem ciklu pridejo le do registra vhodnih podatkov, zato sta potrebna za 11 prenos podatka iz registra vhodnih podatkov v ciljni register še drugi in tretji cikel. Ukazi vejitev Ukazi vejitev izračunajo ciljni naslov v prvem ciklu, kot je to prikazano na sliki 4.7. 24-bitno polje je vzeto iz ukaza in nato premaknjeno v levo za dva bita, da dobimo na ustrezen, besedo poravnan zamik za prištevanje k programskemu števcu. Rezultat predstavlja naslov za Zajem naslednjega ukaza in medtem, ko se ukazni cevovod ponovno polni, se naslov za povratek prekopira v povezovalni register (r14), če je to potrebno. Slika 4.7 Prva dva cikla (od treh) ukaza vejitev. Leva slika prikazuje prvi cikel – računanja mesta vejitve, desna slika pa prikazuje drugi cikel – shranjevanje vrnjenega naslova. V tretjem ciklu, potrebnem za dokončanje polnjenja cevovoda, pride tudi do manjših popravkov vrednosti, shranjenih v povezovalnem registru tako, da ta kaže neposredno na naslednji ukaz po vejitvi. To je potrebno, ker r15 vsebuje PC+8, medtem ko je pravilni naslov naslednjega ukaza PC+4. 12 Ostali ARM ukazi delujejo na podoben način kot zgoraj opisani ukazi. V nadaljevanju je pokazan bolj podrobno pretok po podatkovnih poteh. 4.4 ARM izvedba Izvedba ARMa je precej podobna izvedbi jedra MU0. Ta je sestavljen iz podatkovnih vodil (ang. datapath section), kot RTL (register transfer level) in nadzornega dela (ang. control section), kot FSM (finite state machine). Shema ure Za razliko od MU0 pa večina ARM sistemov ne deluje z registri proženimi z prehodom pulza (ang. edge-sensitive registers). Namesto tega je zasnova načrtana okoli dvofazne ne-prekrivajoče se ure, kot to prikazuje slika 4.8. Dvofazna ura je izvedena interno iz enega samega vira ure. Ta shema omogoča uporabo nivojsko-občutljivega prepustnega zadrževalnika. Nadzor nad pretokom podatkov poteka s pretokom podatkov izmenično skozi zadrževalnike, ki so odprti med fazo 1, in zadrževalniki odprtimi med fazo 2. Lastnost neprekrivanja prve in druge faze ure zagotavlja, da ne pride do tveganih stanj v vezju. Slika 4.8 Shema dvofazne ne-prekrivajoče se ure. Časovna uskladitev podatkovnih poti Običajna časovna uskladitev komponent na podatkovni poti pri 3-stopenjskih cevovodih je prikazana na sliki 4.9. Vodila za branje registrov so dinamična in se napolnijo vnaprej med fazo 2. Z izrazom 'dinamična' je mišljeno, da so občasno plavajoča in ohranjajo svoja logična stanja prek električnega naboja. Uporabljena so vezja za zadrževanje električnega naboja, kar pomeni, da podatki niso izgubljeni v primeru zaustavitve ure v katerokoli točki cikla. Ko gre faza 1 v visoki nivo, izbrani register izprazni vodila za branje, ki postanejo veljavna prej v začetku faze 1. Eden od operandov gre skozi pomikalno enoto, ki ravno tako uporablja dinamični način izvajanja, izhod pomikalne enote pa postane veljaven nekoliko kasneje v fazi 1. ALU ima vhodne zadrževalnike odprte med fazo 1, kar omogoča operandom obdelavo v ALU takoj ko postanejo veljavni. Vendar se zadrževalniki zaprejo na koncu faze 1, tako da zgodnje polnjenje za fazo 2 ne pride do ALU. ALU 13 nadaljuje s procesiranjem operandov skozi fazo 2. Proti koncu faze 2 je na voljo veljaven izhod, ki se shrani v ciljni register na koncu faze 2. Slika 4.9 Časovna uskladitev podatkovnih poti pri 3-stopenjskih cevovodih. Čeprav podatki potujejo skozi vhodne zadrževalnike ALU, ne vplivajo na časovno usklajenost podatkovnih poti. Te so odprte ob prihodu veljavnega podatka. Pri načrtovanju ARM sistema je ta lastnost prepustnega zadrževalnika mnogokrat izkoriščena, saj lahko tako zagotovimo, da ura ne upočasnjuje kritičnih signalov. Minimalni čas cikla je tako vsota: • čas branja registrov, • zakasnitev pomikalne enote, • zakasnitev ALU, • vzpostavitveni čas registrov, • časa, ko se faza 1 in faza 2 ne prikrivata. Od vseh zgoraj opisanih časov prevladuje zakasnitev ALU. Zakasnitev ALU se močno spreminja, oglede na trenutno operacijo. Logične operacije so razmeroma hitre, ker ne upoštevajo prenosa. Aritmetične operacije (seštevanje, odštevanje in primerjanje) vsebujejo daljše logične poti, saj se vrednost prenosa lahko preslikava čez dolžino besede. Zasnova seštevalnika Ker ima čas porabljen za 32-bitno seštevanje velik vpliv na čas trajanja ciklov podatkovnih poti, s tem tudi na največjo frekvenco ure in procesorjevo zmogljivost v celoti, je bilo temu problemu pri načrtovanju naslednjih verzij ARM sistemov posvečeno mnogo časa. 14 Prvi ARM prototip je uporabljal preprosti seštevalnik s prenosom, ki je prikazan na sliki 4.10. Vezje s CMOS IN, ALI vrati in negiranjem za prenosno logiko ter izmenično IN/ALI logiko ima v najslabšem primeru najdaljšo možno pot prenosa 32 vrat. Sodi biti uporabljajo prikazano vezje, lihi biti pa dualno vezje z invertiranimi vhodi in izhodi z zamenjanimi IN in ALI vrati, ki ima enako dolgo pot prenosa. Slika 4.10 Originalni ARM1 seštevalnik. Da bi dosegli višjo frekvenco ure, je ARM2 uporabljal 4-bitno CLA (ang. carry look-ahead) shemo, s čimer se je skrajšala najdaljša možna pot prenosa. Vezje je prikazano na sliki 4.11. Logično vezje tvori signala prenos (G) in prenašaj (P), ki določata 4-bitni izhod prenosa. Dolžina poti za signal prenosa je zmanjšana na zastoj osmih vrat, pri čemer se ravno tako uporabljajo CMOS IN, ALI vrati in negirana vrata in izmenična IN/ALI logika. Slika 4.11 ARM2 4-bitna CLA shema. 15 ALU funkcije ALU poleg seštevanja opravlja še celo vrsto drugih operacij, določenih z naborom ukazov. To so npr. izračunavanje naslovov za operacije s pomnilnikom, izračunavanje vejitev, bitne logične funkcije in tako naprej. Celotno ARM2 ALU logično vezje je prikazano na sliki 4.12. Nabor ALU funkcij in pripadajočih ALU izbirnih kod funkcij je prikazan v tabeli 4.1. Slika 4.12 ARM2 ALU logika za en bit rezultata. ikf5 0 0 0 0 0 1 0 0 0 0 0 ikf4 0 0 0 1 1 1 0 0 0 0 0 ikf3 0 1 1 1 0 0 0 0 0 1 1 ikf2 1 0 0 0 1 1 0 0 1 0 1 ikf1 0 0 0 0 1 1 0 0 0 1 0 Tabela 4.1 ARM2 ALU izbirne kode funkcij. ikf0 0 0 1 1 0 0 0 1 1 0 0 ALU izhod A in B A in neg B A xor B A plus neg B plus prenos A plus B plus prenos neg A plus B plus prenos A A ali B B neg B ničla ARM6 seštevalnik Dodatno skrajšanje najslabšega možnega časa seštevanja je prinesel ARM6 s spremenjenim seštevalnikom. Seštevalnik upošteva prenose in izračunava vsote posameznih delov besede za vrednost nula kot vrednost ena, potem pa je končni rezultat izbran z uporabo multipleksorja, ki ga krmili pravilna vrednost. Celotna shema je prikazana na sliki 4.13. Dolžina kritične poti je sedaj O(log2[dolžina besede]). Direktna primerjava s prejšnjima shemama seštevalnikov ni možna, saj je obremenitev na nekaterih 16 izhodih vratih visok. Kljub temu je najslabši možni čas veliko krajši kot pri prejšnjem 4-bitnem seštevalniku, seveda za ceno večje površine vezja na siliciju. Slika 4.13 Shema ARM6 seštevalnika. Struktura ARM6 ALU ARM6 seštevalnik ne omogoča tako enostavnega združevanja aritmetičnih in logičnih funkcij v enotno strukturo kot to omogoča ARM2. Namesto tega ločena logična enota teče vzporedno s seštevalnikom, multipleksor pa potem izbere pravilni izhod iz seštevalnika ali logične enote. Celotna ALU struktura je prikazana na sliki 4.14. Vhodni operandi so vsi selektivno invertirani, nato sešteti in kombinirani v logični enoti. Na koncu je zahtevan rezultat izbran in poslan na ALU vodilo za rezultate. C in V zastavici nastavi seštevalnik (za logične operacije sta nepomembni), zastavica N je prekopirana z 31 bita rezultata in zastavica Z določena iz vodila za rezultate. Za izračun zastavice Z so potrebna 32-vhodna negirana ALI vrata in to lahko zlahka postane kritično na poti signala. 17 Slika 4.14 ARM6 ALU organizacija. Seštevalnik s poravnavo bitov Seštevalna logika je bila še dodatno izboljšana pri ARM9TDMI, kjer je uporabljen seštevalnik s poravnavo bitov. Ta seštevalnik izračuna vsa vmesne vrednosti prenosa z uporabo vzporednega drevesa, ki je zelo hitro paralelno logično vezje. Shema s poravnavo bitov prekodira prvo, klasično shemo s pomočjo dveh novih spremenljivk u in v. Poglejmo si izračun C (prenos, carry out) iz določenega bit mesta v seštevalniku z vhodoma A in B. Informacija, ki je na voljo preden je znan vhodni bit prenosa, prikazuje tabela 4.2, ki ravno tako kaže kako je ta informacije prekodirana v spremenljivki u in v. Informacija je združena z informacijo z mesta sosednjega bita po enačbi: (u,v) • (u',v') = (v + u ⋅ u', v+u ⋅ v') Ker je ta operator spajanja asociativen, se u in v lahko izračunata za vse bite v vsoti z uporabo običajnega vzporednega drevesa. Logika, potrebna za izvedbo zgornje enačbe je lahko sestavljena s CMOS vrati, z do 4 pari vhodov. Proizvede lahko nov u in v izhod iz enega samega tranzistorskega vezja. Nadalje lahko uvidimo, da spremenljivka u vrača zastavico prenosa C na izhodu, če je zastavica prenosa na vhodu C enaka ena. Spremenljivka v vrača zastavico prenosa C na izhodu, če je zastavica prenosa na vhodu C enaka nula. u in v sta torej lahko uporabljena za izračun (Sum, Sum+1) vrednosti, potrebne za mešani seštevalnik s poravnavo bitov. To pripelje do kar nekaj različnih shem, ki omogočajo kompromis med zmogljivostjo in porabo moči. A 0 B 0 C 0 u 0 v 0 18 0 1 1 1 0 1 neznano neznano 1 1 1 1 Tabela 4.2 ARM9 kodiranje poravnavanja bitov 0 0 1 Pomikalna enota ARM arhitektura podpira ukaze, ki opravljajo operacije pomika v seriji z ALU operacijami, kar privede do organizacije prikazane na sliki 4.1. Zmogljivost pomikalne enote je zato kritična, saj čas porabljen za pomik neposredno prispeva k času ciklov podatkovnih poti kot je to prikazano na diagramu časovne usklajenosti podatkovnih poti (ang. datapath timing diagram) na sliki 4.14. Ostale procesorske arhitekture imajo največkrat pomikalno enoto vzporedno z ALU. Če torej pomikalna enota ni počasnejši od ALU ne vpliva na času ciklov podatkovnih poti. Da bi zmanjšali zakasnitve v pomikalni enoti, je uporabljena preklopna matrika, ki usmerja vhode na prave izhode. Princip preklopne matrike je viden na sliki 4.15, kjer je prikazana 4x4 matrika (ARM procesorji uporabljajo 32x32 matriko). Vsak vhod je priključen na vsak izhod prek stikal. Če je uporabljena dinamična logika s polnjenjem naprej, kot je to pri ARM podatkovnih poteh je lahko vsako stikalo izvedeno z NMOS tranzistorjem. Pomikalne funkcije so izvedene z vezavo stikal po diagonali na skupni kontrolni vhod: • Za levo ali desno funkcijo pomika, se vklopi ena diagonala. To poveže vse vhodne bite na njihove ustrezne izhode. V ARMu pomikalna enota operira z negativno logiko, kjer je '1' predstavljena s potencialom okoli mase in '0' s potencialom okoli napajalne napetosti. Polnjenje vnaprej postavi vse signale na logično '0', tako da tisti izhodi, ki niso priključeni na nobenega od vhodov med operacijo vklapljanja stikal ostanejo na '0'. Tako dobimo polnjenje z ničlami, potrebno za pomikalno semantiko. • Za funkcijo rotiraj v desno se vključi desna pomikalna diagonala. Kot primer, na 4-bitni matriki je pri funkciji rotiraj desno za en bit uporabljena diagonala 'desno 1' in 'levo 3' (3 = 4 – 1). • Aritmetični pomik desno uporablja razširitev ene vrednosti namesto polnjenja z ničlami za nepovezane izhodne bite. Dodatna logika je uporabljena za dekodiranje velikosti pomika in za pravilno izpraznitev teh izhodov. 19 Slika 4.15 Princip preklopne matrike pomikalne enote. Zasnova množilnika Vsi ARMi razen prvega prototipa imajo dodano strojno podporo za množenje celih števil. Uporabljeni sta bili dve obliki množilnikov: • Starejša ARM jedra vsebujejo poceni strojno podporo za množenje, ki podpira le 32-bitne rezultate ukazov za množenje in množenje s seštevanjem. • Sodobna ARM jedra imajo visoko zmogljivo strojno opremo za množenje in podpirajo 64-bitne rezultate množenja in množenja s seštevanjem. Starejša nizko cenovna različica uporablja glavno podatkovno pot večkrat. Preko pomikalnega registra tvori 2-bitni produkt v vsakem ciklu ure. Logika za predčasno prenehanje ustavi iteracijo, ko v registru za množenje ni več enic. Množilnik uporablja prilagojen Boothov algoritem za izračun 2-bitnega rezultata množenja, pri čemer izkorišča dejstvo, da je lahko x3 izvedeno kot x(-1) + x4. To omogoča računanje vseh štiri vrednosti 2-bitnega množilnika s preprostim pomikom in prištevanjem (ang. shift) oziroma operacijo odštevanja, kjer se x4 prenos prenese v naslednji cikel. Algoritem za N-ti cikel množenja prikazuje tabela 4.3. Bodite pozorni, da se tudi x2 izračuna odštevanja in prenosa, kar bi bilo možno izvesti tudi z operacijo dodaj in brez operacije prenosa, vendar pa je kontrolna logika na ta način nekoliko poenostavljena. Ker to množenje uporablja že obstoječo pomikalno enoto in ALU, je dodatni potrebni strojni del omejen na poseben dva-bita-na-cikel pomikalni register za množilnik in nekaj vrat za kontrolno logiko Boothovega algoritma. Vse skupaj doda le nekaj procentov površine k celotni površini na silicijevi rezini ARM jedra. 20 vhodni prenos 0 1 faktor množenja ×0 ×1 ×2 ×3 ×0 ×1 ×2 ×3 Pomik ALU LSL #2N LSL #2N LSL #(2N+1) LSL #2N LSL #2N LSL #(2N+1) LSL #2N LSL #2N A+0 A+B A-B A-B A+B A+B A-B A+0 Tabela 4.3 N-ti cikel 2-bitnega algoritma množenja. izhodni prenos 0 0 1 1 0 0 1 1 Visoko zmogljivi množilniki Kadar je zmogljivost hitrega množenja še posebej pomembna, je potrebno temu posvetiti več strojnega dela kot običajno. V nekaterih vgrajenih sistemih opravlja ARM jedro, poleg običajnega dela tudi obdelavo signalov v realnem času (DSP, digital signal processing). DSP programi ponavadi vsebujejo veliko število množenj, zato je visoka zmogljivost strojnega dela vezja namenjenega množenju kritična za doseganje zahtev, ki jih prinaša izvajanje v realnem času. Visoko zmogljivo množenje izvedeno v nekaterih ARM jedrih uporablja redundanten binarni prikaz, s čimer se izogne zakasnitvam povezanim s seštevanjem delnih produktov preko postopnega seštevanja C. Vmesni rezultati so shranjeni kot delne vsote in vmesni prenosi, pravi binarni rezultat pa je dobljen z njunim seštevanjem v seštevalniku, kakršen je tudi seštevalnik v glavnem ALU. Med množenjem so delne vsote in prenosi združeni v seštevalnikih s shranjeno C zastavico, kjer prenosi potujejo za en bit na seštevalno stopnjo. Tako ima seštevalnikih s shranjeno C zastavico veliko krajšo logično pot kot seštevalnik s seštevanjem delnih produktov, kjer lahko prenos potuje tudi do 32 bitov. Tako je lahko v enem samem ciklu opravljenih več shranjevanj vrednosti C, medtem ko je lahko opravljena le ena sama operacija postopnega seštevanja C. 21 Slika 4.16 Shema (a) seštevalnika s prenosom, (b) seštevalnika s shranjeno zastavico C. Obstaja več načinov kako lahko sestavimo seštevalnik s shranjeno C zastavico, vendar pa je najenostavnejša 3-vhodna/2-izhodna oblika seštevalnika. Ta sprejme kot vhod delno vsoto, vmesni prenos in delni produkt, vsi imajo isto binarno utež. Kot izhod proizvede novo delno vsoto in nov vmesni prenos, ki pa ima dvojno utež vsote. Logična funkcija za vsak bit je enaka kot pri običajnem polnem seštevalniku, ki je uporabljen v seštevalniku s prenosom. Slika 4.16 prikazuje oba tipa seštevalnikov. Med iterativnimi stopnjami množenja, je vsota vodena nazaj in združena z novim delnim produktom v vsaki iteraciji. Ko so delni produkti sešteti, je redundantni prikaz spremenjen v običajno binarno število s seštevanjem delnih vsot in vmesnih prenosov v postopnem seštevanju C v ALU. Visoko zmogljivi seštevalniki imajo več nivojev seštevalnika s shranjeno C zastavico v seriji, vsakega za en delni produkt. Če je delni produkt izračunan po prilagojenem Boothovem algoritmu, podobno kot je to opisano v tabeli 4.3, vsaka stopnja seštevalnika s shranjeno C zastavico obdeluje dva bita množenja v vsakem ciklu. Celotna struktura visoko zmogljivega množilnika uporabljenega v nekaterih jedrih ARM je prikazana na sliki 4.17. Imena registrov se nanašajo na ukazna polja. Polje za shranjevanje C ima štiri nivoje seštevalnikov, vsak obdeluje dva bita množenja, tako da lahko celotno polje množi osem bitov na cikel. Registri za delne vsote in prenos se izpraznijo na začetku ukaza, ali pa se register za delno vsoto nastavi na akumulirano vrednost. Ko je množilnik v 'Rs' registru pomaknjen za osem bitov desno na cikel, se delna vsota in prenos rotirata desno za osem bitov na cikel. Operacija delnega množenja se na polju izvede do štirikrat, predčasno prenehanje pa konča operacijo v manj ciklih, če ima množilnik zadostno število ničel v zgornjih bitih, delna vsota in prenos sta nato združena s po 32-biti na enkrat in zapisana nazaj v polje registrov. Ko se množenje predčasno zaključi je potrebno poravnati delne vsote in prenos, to na sliki 4.17 ni prikazano. 22 Visoko zmogljivi množilnik zahteva veliko več temu problemu posvečenega strojnega dela kot nizko cenovna rešitev, ki se uporablja v drugih ARM jedrih. Tako je na voljo 160 bitni pomikalni register in 128 bitna seštevalna logika za shranjevanje C zastavic. To zahteva kakšnih 10 procentov večjo površino kot pri preprostih jedrih, pri bolj zmogljivih jedrih kot sta ARM8 in StrongARM pa nekoliko manj. Prednosti so v hitrejšem množenju za okoli faktor 3 in v podpori za 64-bitno množenje. Slika 4.17 Shema visoko zmogljivega ARM množilnika. Polje registrov Zadnji pomembnejši del ARM podatkovnih poti je polje registrov. To je mesto, kjer je celotno stanje vidno tudi uporabniku, shranjeno v 31 splošnih 32bitnih registrih. Vsega skupaj torej okoli 1Kbit podatkov. Ker je osnovna 1bitna celica registra v celotnem vezju tolikokrat ponovljena, je smiselno posvetiti precej časa zmanjšanju velikosti celice. Tranzistorsko vezje celice registra uporabljene v ARM jedrih vse do ARM6 je prikazano na sliki 4.18. Pomnilniška celica je par asimetrično križno povezanih CMOS inverterjev, ki sta pri spreminjanju vrednosti registra krmiljena z močnim signalom z ALU vodila. Povratnozančni inverter je šibek, da bi zmanjšali upornost celice za novo vrednost. A in B vodili za branje sta napolnjeni vnaprej na Vdd med drugo fazo cikla ure, tako da mora celica samo izprazniti vodilo za branje. To stori skozi tranzistor tipa n, ko so vodila za branje vključena. 23 Slika 4.18 Shema ARM6 registrske celice. Takšna registrska celica je primerna za 5V napajanje, pisanje '1' skozi tranzistor tipa n pa postane oteženo pri nižjih napajalnih napetostih. Ker za nizko porabo moči potrebujemo nizke napajalne napetosti, ARM jedra od jedra ARM6 naprej uporabljajo posebna CMOS vrata (p tip tranzistorja je vzporeden z n tipom tranzistorja v vezju za pisanje, pri čemer so potrebna komplementarna kontrolna vodila za pisanje) ali pa bolj zapletena registrska vezja. Slika 4.19 Shema polja registrov. Take registrske celice so razvrščena v stolpcih, s čimer oblikujejo 32-bitne registre. Stolpci pa so zloženi skupaj, tako da tvorijo celotno polje registrov. Dekoderji za vodila, ki vklapljajo branje ali pisanje, se nahajajo nad stolpci, kot to prikazuje slika 4.19. Tako da potekajo navpično, podatkovna vodila pa vodoravno, čez polje registrskih celic. Ker je logika dekoderja bolj zapletena, kot je sama celica registra, vodoravna polja pa so po širini narejena, da ustrezajo celicam, lahko dekodersko vezje postane zelo tesno. Zato morajo biti dekoderji ozki in dolgi. Register za ARM programski števec je v enostavnejših jedrih fizično del polja registrov, vendar pa ima dvoje vrat za branje in troje vrat za pisanje, medtem ko imajo ostali registri ena vrata za branje in dvoje za pisanje. Simetrija registrskega polja je ohranjena tako, da je programski števec postavljen na enega od koncev, kjer je dostopen dodatnim vhodom in je dovoljeno, da je fizično »debelejši«. 24 Polje registrov zavzema približno tretjino celotnega števila tranzistorjev v preprostejših ARM jedrih, vendar pa zavzema veliko manj fizičnega prostora na silikonski rezini, ker gre za zelo gosto pomnilniško strukturo. Ureditev podatkovnih poti ARM podatkovne poti so urejene s konstantnim razmakom med biti. Razmak med biti je določen s kompromisom med kompleksnimi funkcijami (ALU funkcije), ki jim najbolj ustreza širok razmak, in med preprostimi funkcijami (funkcijami pomikalne enote), ki so najbolj učinkovite z ozko postavitvijo. Vsaka funkcija je nato prilagojena na ta razmak, z upoštevanjem, da lahko nekatera vodila prečkajo funkcijo (kot na primer vodilo B poteka skozi ALU, vendar pa ga ta ne potrebuje). Dovolj prostora mora biti tudi za take primere. Slika 4.20 prikazuje shemo za podatkovne poti z upoštevanjem poti, ki prečkajo blok. Vrstni red posameznih sestavnih blokov jedra je določen tako, da se najbolj zmanjša število tistih vodil, ki prečkajo bolj kompleksne funkcije. Slika 4.20 Podatkovna vodila ARM jedra. Sodobni CMOS postopki omogočajo vezave v več kovinskih nivojih, zgodnja ARM jedra so imela dva kovinska nivoja. Nivoji za napajanje in ozemljitev, signalna vodila vzdolž podatkovnih poti in kontrolni signali po podatkovnih poteh morajo biti načrtana skrbno. Na primer pri ARM2 Vdd in Vss potekata po obeh straneh podatkovnih poti na nivoju 2, kontrolne poti potekajo čez podatkovne poti na nivoju 1 in vodila potekajo vzdolžno po nivoju 2. Nadzorne strukture Nadzorna logika na enostavnejših ARM jedrih ima tri dele, ki se navezujejo drug na drugega v skladu s sliko 4.21. 25 1. Dekoder ukazov PLA (ang. programmable logic array). Ta enota uporablja nekatere ukazne bite in notranji števec ciklov za definiranje nabora operacij, ki naj se izvedejo na podatkovnih poteh v naslednjem ciklu. 2. Porazdeljen sekundarni nadzor (ang. distributed secondary control) povezan z vsakim od pomembnejših funkcijskih blokov okrog podatkovnih poti. Ta logika uporablja informacijo o naboru iz glavnega dekoderja PLA, da izbere ostale ukazne bite ali/in informacijo o stanju procesorja za nadzor podatkovnih poti. 3. Decentralizirane nadzorne enote za specifične ukaze, ki za izvajanje potrebujejo spremenljivo število ciklov (množenje in operacije koprocesorja). Glavni dekoder PLA se zaklene v določeno stanje, dokler oddaljena nadzorna enota ne javi dokončanja operacije. Slika 4.21 Struktura ARM nadzorne logike. Glavni dekoderski PLA ima okoli 14 vhodov, 40 pinov, odvisnih od konkretnega modela in 40 izhodov, točna številka je odvisna od verzije jedra. Na novejših ARM jedrih je glavni dekoder izveden z dvema PLA-jema: manjši in hitrejši PLA izvaja časovno kritične operacije, večji in počasnejši PLA pa vse ostale. Funkcionalno pa lahko nanj gledamo kot na eno samo enoto PLA. Blok za štetje ciklov razlikuje med različnimi cikli več-cikličnih ukazov, tako da lahko PLA dekoder nastavlja različne izhode za vsak cikel. Tako, dejansko ne gre le za števec, temveč za bolj splošen stroj končnih stanj, ki je sposoben preskočiti nepotrebne cikle in se zakleniti v določeno stanje. Določa dokončanje določenega ukaza končal in začne prenos naslednjega ukaza iz ukaznega cevovoda, vključno s prekinitvijo izvajanja ukaza na koncu njihovega prvega cikla, če ne opravijo test stanja ukaza. Večino časa pa se obnaša kot 26 preprosti števec, tako da ni tako zavajajoče, če nanj gledamo kot na števec ciklov ukaza. 4.5 ARM koprocesorski vmesnik ARM podpira splošno namensko možnost razširitve nabora ukazov z dodajanjem koprocesorjev. Prav tako pa podpira programsko podprto emulacijo teh koprocesorjev s pomočjo prekinitve za nedefiniran ukaz. Arhitektura koprocesorjev je opisana v sekciji 5.16. Najpomembnejše značilnosti so: • Podpora za 16 logičnih koprocesorjev. • Vsak koprocesor ima lahko 16 svojih registrov poljubne (seveda razumne) velikosti, ki niso omejeni na 32 bitov. • Koprocesorji uporabljajo klasično arhitekturo z nalaganjem in shranjevanjem, z ukazi za izvajanje notranjih operacij na registrih, ukazi za nalaganje in shranjevanje registrov iz pomnilnika in v pomnilnik, ter ukazi za premikanje podatkov v in iz registrov. Enostavnejša ARM jedra dovoljujejo koprocesorsko enoto kot samostojno ločeno komponento na samostojni ploščici. Vendar pa taka zasnova ne podpira visokih frekvenc ure, zato bolj zmogljivi ARMi podpirajo le koprocesorje na samem čipu, še posebej ko gre za upravljanje s pomnilnikom in predpomnilnikom. ARM7TDMI koprocesorski vmesnik ARM7TDMI koprocesor vmesnik temelji na sledenju vodila, ostala ARM jedra uporabljajo drugačno tehnologijo. Koprocesor je priključen na vodilo, po katerem priteka v ARM dotok ukazov, koprocesor pa kopira ukaze v notranji cevovod, ki posnema obnašanje ARM ukaznega cevovoda. Ko se koprocesorski ukaz začne izvajati, pride do medsebojnega usklajevanja med ARMom in koprocesorjem, kar se konča z njuno potrditvijo, da sta oba pripravljena na izvršitev ukaza. Rokovanje poteka prek treh signalov: 1. cpi (od ARMa do vseh koprocesorjev) cpi signal (CoProcessor Instruction) označuje, da je ARM prepoznal koprocesorski ukaz in ga lahko izvede. 2. cpa (od koprocesorja do ARMa) cpa signal (CoProcessor Absent) sporoči ARMu, da ni prisotnega nobenega koprocesorja, ki bi lahko izvedel dani ukaz. 3. cpb (od koprocesorja do ARMa) cpb signal (CoProcessor Busy) sporoči ARMu, da koprocesor še ne more začeti izvajati ukaza. 27 Zaradi časovne usklajenosti morata tako ARM kot koprocesor generirati vsak svoj signal neodvisno. Koprocesor ne more čakati na sprejem cpi signala, da bi lahko generiral cpa in cpb signala. Ko ukaz vstopi v ARM7TDMI in koprocesorski cevovod, obstajajo štirje možni načini medsebojnega usklajevanja, odvisno od uporabljenega signala: 1. ARM se odloči, da ukaza ne bo izvedel zaradi takšne odločitve v “branch” vejitvi, ali ker statusne zastavice niso pravilno postavljene. Vsi ARM ukazi se izvajajo pogojno, vključno s koprocesorskimi ukazi. ARM ne bo sporočil cpi signala in ukaz bo opuščen s strani vseh enot. 2. ARM se odloči za izvedbo ukaza, kar signalizira s signalom cpi . Vendar pa noben prisotni koprocesor ne more ukaza prevzeti, zato ostane signal cpa aktiven. ARM ugotovi, da gre za nedefiniran ukaz in s programsko podporo razreši vzpostavljeno stanje, najverjetneje z emulacijo prekinitve za nedefiniran ukaz. 3. ARM se odloči, da bo izvedel ukaz, ravno tako koprocesor ukaz sprejme, vendar ga še ne more izvesti. Koprocesor izključi cpa (ga postavi na nizko stanje), vendar pa pusti cpb vključen. ARM bo čakal v stanje čakanja dokler koprocesor ne izključi signala cpb, s čimer zadržuje pretok ukazov. Če se pojavi prekinitev z zahtevo za nadaljevanje izvajanja ukazov, ko je koprocesor še zaposlen, bo ARM prekinil s svojim prejšnjim delom in začel obravnavati prekinitev, k koprocesorskemu ukazu pa se bo vrnil kasneje. 4. ARM se odloči za izvedbo ukaza, ravno tako koprocesor sprejme ukaz v takojšne izvajanje. cpi , cpa in cpb se izključijo (gredo v nizko stanje) in obe strani se zavežeta, da bosta izvedla ukaz. Prenos podatkov Če je ukaz povezan s prenosom podatkov koprocesorja, je ARM zadolžen za določitev izhodiščnega naslova pomnilnika (koprocesor ne potrebuje nobenega priključka na naslovno vodilo). Koprocesor pri tem določi dolžino prenosa, ARM pa bo nadaljeval s povečevanjem naslova dokler koprocesor ne javi zaključka izvajanja. Za ta namen usklajevanja sta uporabljena cpa in cpb signala. Ker prenosa podatkov ni mogoče prekiniti, potem ko se je ta začel, koprocesor lahko omeji prenos na največ 16 besed. To je enako kolikor je največja dolžina ukaza pri večkratnem nalaganju ali shranjevanju, čimer še ne moti ARMovega odziva na prekinitve. 28 Izvajanje vnaprej Koprocesor lahko začne z izvajanjem ukaza takoj po njegovem vstopu v koprocesorjev cevovod. Vendar le če ima koprocesor možnost vzpostaviti prejšnje stanje za primer neuspešnega zaključka usklajevanja. Vsa aktivnost mora biti ponovljiva z istim rezultatom vse do točke, ko se zaveže za izvedbo ukaza. 29
© Copyright 2024