Razvoj programske opreme

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