Esercizio 32istruzioni ARM7 con barrel shifter e realizzazione in assembly di y = a·x + b (prove d'esame del 2004 e del 2014)
In questa pagina 5
Testo (prove d'esame del 2004 e del 2014, problemi 5-9 e 9-10).
(i) Si danno le istruzioni ARM7 e i valori iniziali dei registri; indicare in esadecimale il valore finale del registro .
MOV r1, r2, LSR #2seguita daMOV r1, r1, LSL r1, con , ;MVN r1, r2, LSR #3, con , ;SUB r1, r2, r2, LSR #1, con , . (ii) Un'istruzioneLDR r0, [PC, #0x0050]si trova alla locazione . A quale locazione si trova il dato caricato in ? (iii) Il convertitore A/D di un DSP lavora a 8 bit con V e i dati sono elaborati da un processore a 8 bit con , , . Determinare, con arrotondamento: (a) la rappresentazione Q7 di in esadecimale; (b) la rappresentazione 2.6 di ; (c) il tipo e l'ampiezza dello shift da eseguire sul prodotto prima della somma con (il prodotto è eseguito automaticamente in modalità frazionaria e è in Q7); (d) in esadecimale se si ottiene convertendo 3 V. (iv) Stesso algoritmo con ADC a 10 bit ( V) e ALU a 32 bit: , . Determinare: (a) e in formato 2.14 su 16 bit (esadecimale); (b) il tipo e l'ampiezza dello shift se è in modalità 0.16 e il prodotto è frazionario automatico; (c) per da 3 V. (d) Scrivere la sequenza ARM7 che realizza l'algoritmo se è in come ().
Teoria usata: Architettura del repertorio di istruzioni - RISC, CISC, VLIW e indirizzamentoL'architettura è l'insieme delle risorse visibili al programmatore (istruzioni, modi di indirizzamento). RISC: poche istruzioni semplici, di uguale lunghezza, decodifica cablata, quasi tutte a 1 ciclo; CISC: molte istruzioni complesse, decodifica microprogrammata, più cicli. I DSP sono RISC "potenziati" (MAC, saturazione, barrel shifter, arrotondamento, VLIW, SIMD); i modi di indirizzamento tipici sono immediato, a registro, diretto, indiretto, con auto-incremento, circolare e a bit rovesciati (per la FFT).Architettura del repertorio di istruzioni - RISC, CISC, VLIW e indirizzamento →, Operazioni in virgola fissa - somma, prodotto e riallineamentoIn virgola fissa il processore opera sugli interi e non sa dov'è la virgola: tocca al programmatore. Regola 1: si sommano solo dati con lo stesso formato (stesso $m$). Regola 2: il prodotto di $n_1.m_1$ per $n_2.m_2$ ha $m_1+m_2$ bit frazionari e il doppio dei bit: va riallineato con uno shift a destra di $m_2$ posizioni (per riportarlo a $m_1$) o preso dalla parte alta. Con la normalizzazione frazionaria $1.15$ il prodotto è $2.30$ e basta uno shift a sinistra di 1 prima di prendere la parte alta. I fattori di scala si scelgono per evitare overflow e perdita di risoluzione.Operazioni in virgola fissa - somma, prodotto e riallineamento →, Pipeline - accelerazione e conflittiLa pipeline divide l'esecuzione in $n$ stadi (fetch, decodifica, lettura, esecuzione, scrittura) che lavorano contemporaneamente su istruzioni diverse. Il clock è dettato dallo stadio più lento; a regime si completa un'istruzione per ciclo. Per $N$ istruzioni servono $(n+N-1),T_{clk}$: l'accelerazione rispetto al multiciclo tende a $n$ ma è sempre minore (riempimento, conflitti). I conflitti sono strutturali (stessa risorsa), sui dati (RAW...) e di controllo (salti): si risolvono con stalli (interlocking), bypass, sovrapposizione, riordino, salti ritardati. La latenza di una singola istruzione non diminuisce.Pipeline - accelerazione e conflitti →.
(i) Istruzioni ARM con shift
Nell'ARM7 il secondo operando passa per il barrel shifter (LSL logico a sinistra, LSR logico a destra, ASR aritmetico a destra) in un solo ciclo.
MOV r1, r2, LSR #2: . PoiMOV r1, r1, LSL r1: lo shift è di posizioni (il registro stesso, valore 2): . Risultato (il valore iniziale è sovrascritto:MOVnon lo usa).MVN r1, r2, LSR #3:MVNcarica il complemento a 1 dell'operando: ; .SUB r1, r2, r2, LSR #1: .
(ii) LDR con PC
Nell'ARM7 con pipeline a 3 stadi il PC letto da un'istruzione punta 8 byte oltre l'istruzione stessa (due istruzioni avanti: fetch e decode già avanzati). L'indirizzo del dato è quindi (con 4 byte per istruzione).
(iii) a 8 bit
(a) Q7 (1.7 S): . (b) 2.6 (segno + 1 bit intero + 6 frazionari): (esatto). (c) Il prodotto è fatto in modalità frazionaria 1.15: il byte alto (parte alta) ha 7 bit frazionari (, formato Q7); è in 2.6 (): per sommare serve portare il prodotto a con uno shift aritmetico a destra di 1 bit (ASR 1). (d) : ; in Q7: . Prodotto: (intero a 16 bit), modalità frazionaria: ; parte alta (); ASR 1: (, vale ). Somma con : (in 2.6 vale contro ✓).
(iv) a 32 bit
(a) 2.14 (positivi, ): (esatto); . (b) in 0.16 U () va portato in 2.14 () con LSR 2 (stesso valore, ); il prodotto ha 28 bit frazionari e per sommare (14 bit frazionari) serve uno ASR di 14 posizioni. In generale si conta sempre il numero di bit frazionari di ciascun prodotto: se il moltiplicatore fosse frazionario automatico (DSP) il prodotto sarebbe già raddoppiato e la quantità da scartare cambierebbe di un bit. (c) con in 2.14: . ; ; , cioè (valore atteso ✓). (Se è il codice dell'ADC a 10 bit, allineato a sinistra , si ottiene : differenza di 11 LSB per la quantizzazione dell'ingresso.) (d) Codice ARM7 ( contiene il dato convertito nel formato : 10 bit allineati a sinistra su 16 bit, cioè formato 0.16):
Aa .equ 0x8800 ; a in 2.14
Bb .equ 0x647B ; b in 2.14
LDR r4, =Aa ; carico la costante a
LDR r5, =Bb ; carico la costante b
MOV r0, r0, LSR #2 ; passo x(k) da 0.16 a 2.14
MUL r1, r4, r0 ; moltiplico a*x (prodotto intero a 32 bit, 28 bit frazionari)
ADD r1, r5, r1, ASR #14 ; riporto il prodotto a 14 bit frazionari e sommo bLa moltiplicazione dell'ARM7 è intera: lo shift ASR #14 si fa nell'ADD sfruttando il barrel shifter (nessun ciclo in più). Il risultato in è in formato 2.14 (valore massimo : nessun overflow). I cicli sono 5, di cui MUL più lunga; con pipeline a 3 stadi a regime (Pipeline - accelerazione e conflittiLa pipeline divide l'esecuzione in $n$ stadi (fetch, decodifica, lettura, esecuzione, scrittura) che lavorano contemporaneamente su istruzioni diverse. Il clock è dettato dallo stadio più lento; a regime si completa un'istruzione per ciclo. Per $N$ istruzioni servono $(n+N-1),T_{clk}$: l'accelerazione rispetto al multiciclo tende a $n$ ma è sempre minore (riempimento, conflitti). I conflitti sono strutturali (stessa risorsa), sui dati (RAW...) e di controllo (salti): si risolvono con stalli (interlocking), bypass, sovrapposizione, riordino, salti ritardati. La latenza di una singola istruzione non diminuisce.Pipeline - accelerazione e conflitti →).
Errori comuni
- Dimenticare che
MVNcomplementa tutti i 32 bit (non solo il byte basso). - Usare il valore iniziale di in
MOV(il contenuto viene sovrascritto). - Dimenticare che è 8 byte in avanti rispetto all'istruzione corrente.
- Non allineare i due addendi: ha 28 bit frazionari e ne ha 14.
Versione ripasso
Testo. ARM7 con barrel shifter (MOV/MVN/SUB), LDR [PC,#0x50], a 8 bit (Q7, 2.6) e a 32 bit (2.14) con codice ARM (2004, 2014).
- ARM:
MOV r1,r2,LSR #2; MOV r1,r1,LSL r1→0x08;MVN r1,r2,LSR #3→0xFFFFFFFE;SUB r1,r2,r2,LSR #1→0x04;LDR r0,[PC,#0x50]a0x24→0x7C. - 8 bit: (Q7), (2.6); prodotto frazionario, ASR 1; .
- 32 bit: , (2.14); (0.16 → 2.14), prodotto,
ADD r1,r5,r1,ASR #14; (). - Errori:
MVNsul solo byte; iniziale usato; PC+8 dimenticato; scale non allineate (Architettura del repertorio di istruzioni - RISC, CISC, VLIW e indirizzamentoL'architettura è l'insieme delle risorse visibili al programmatore (istruzioni, modi di indirizzamento). RISC: poche istruzioni semplici, di uguale lunghezza, decodifica cablata, quasi tutte a 1 ciclo; CISC: molte istruzioni complesse, decodifica microprogrammata, più cicli. I DSP sono RISC "potenziati" (MAC, saturazione, barrel shifter, arrotondamento, VLIW, SIMD); i modi di indirizzamento tipici sono immediato, a registro, diretto, indiretto, con auto-incremento, circolare e a bit rovesciati (per la FFT).Architettura del repertorio di istruzioni - RISC, CISC, VLIW e indirizzamento →).