fbpx
Skip to main content
  1. Valerio Battaglia
  2. Ingegneria Informatica - Triennale
  3. Mercoledì, 09 Maggio 2007
  4.  Subscribe via email
e quest'ultimo lo apro io :D buon lavoro a tutti..
Comment
There are no comments made yet.
Accepted Answer Pending Moderation
Non mi è chiara una cosa, ma probabilmente è solo pignoleria.
A che serve il passo 1 dell'automa (Instruction decode/register fetch)???
Spiego...fa un'operazione (aggiungere a PC+4 il valore del campo immediate) che utilizzerà solo 1 volta su 4 nei BEQ...negli altri 3 casi (istruzioni di memoria, istruzioni R e istruzione J) del valore calcolato precedentemente non se ne fa nulla.

Non era meglio (= meno operazioni) includere lo stato 1 nel BEQ e allegerire tutte le altre istruzioni?


l'unica spiegazione che mi viene è che guardare di che operazione si tratta richiede comunque un ciclo quindi tanto vale avvantaggiare il possibile usando la ALU che altrimenti rimarrebbe ferma.


esatto: il decode praticamente non è implementata per il calcolo dell'indirizzo di branch, ma per decodificare l'istruzione. Quindi dovendo decodificare l'istruzione (quindi mandare i valori in A e B, tanto vale inviare i vari input anche alle altre periferiche: l'invio non costa nulla perchè è semplicemente un impulso che arriva ad AlusrcB, mentre il creare un altro stato avrebbe significato un altro ciclo di clock perchè il valore dell'indirizzo sarebbe dovuto essere ricalcolato, quindi avrei dovuto avere due stati anzichè 1: il primo per fare la somma tra offset e pc+4, il secondo per scriverlo in PC :wink:


Non mi pare che per il decode sia inviato alcunchè a A e B, quelli sono i valori (PC+4) e [15:0] dell'istruzione...il decode dell'istruzione (meglio, dell'opcode) è affidato a PLA, ROM o tabelle di dispatch. Per decodificarla non occorre mandare i valori in A e B!

Se prendi le slide in PPT e vai a pagina 59 c'è la funzione "prossimo stato" e la prima riga manda tutti quanti a 0001. Se invece iniziasse da subito a mandare le istruzioni di tipo R in 6, i jump a 9, lw e sw a 2 e infine BEQ a 1 ci ritroveremmo ad avere che tutte le istruzioni richiedono un ciclo in meno tranne il BEQ che rimarrebbe invariato.


ma come no? pag 22 delle slide della multiciclo si vede propri oil percorso che fa l'istruzione: i bit 25-21 e 20-16 sono inviati a Read Register1 e 2, successivamente usciranno quindi Read Data 1 e 2 che finiranno in A e B (e infatti nel disegno sono arancioni).

Forse mi son spiegato male, comunque nel decode fa due cose: si prepara a fare la branch nel caso in cui si tratta di un salto (quindi manda PC+4 alla prima entrata dell'ALU e l'offest esteso alla seconda) e contemporaneamente legge i dati dai registri salvandoli in A e B.

Se dividessimo l'istruzione accorpando il calcolo dell'indirizzo allo stato successivo avremmo problemi, poichè non otterremmo un solo stato per la branch, ma due: il primo per effettuare (PC+4)+offset esteso (primo clock dato che accedo ad ALU) e secondo stato per scrivere in PC.

Poi il controllo non interessa attualmente, quello serve solo a dire alla cpu quali valore scegliere nei mux e via dicendo, ma lo stato non è conseguenza del controllore, è il controllore una conseguenza degli stati dell'automa che ci ricaviamo ocncettualmente (anche perchè creare il circuito e poi fare l'automa non avrebbe senso :) )
Comment
There are no comments made yet.
Accepted Answer Pending Moderation
dell'istruzione...il decode dell'istruzione (meglio, dell'opcode) è affidato a PLA, ROM o tabelle di dispatch. Per decodificarla non occorre mandare i valori in A e B!

Se prendi le slide in PPT e vai a pagina 59 c'è la funzione "prossimo stato" e la prima riga manda tutti quanti a 0001. Se invece iniziasse da subito a mandare le istruzioni di tipo R in 6, i jump a 9, lw e sw a 2 e infine BEQ a 1 ci ritroveremmo ad avere che tutte le istruzioni richiedono un ciclo in meno tranne il BEQ che rimarrebbe invariato.


ma come no? pag 22 delle slide della multiciclo si vede propri oil percorso che fa l'istruzione: i bit 25-21 e 20-16 sono inviati a Read Register1 e 2, successivamente usciranno quindi Read Data 1 e 2 che finiranno in A e B (e infatti nel disegno sono arancioni).

Forse mi son spiegato male, comunque nel decode fa due cose: si prepara a fare la branch nel caso in cui si tratta di un salto (quindi manda PC+4 alla prima entrata dell'ALU e l'offest esteso alla seconda) e contemporaneamente legge i dati dai registri salvandoli in A e B.

Se dividessimo l'istruzione accorpando il calcolo dell'indirizzo allo stato successivo avremmo problemi, poichè non otterremmo un solo stato per la branch, ma due: il primo per effettuare (PC+4)+offset esteso (primo clock dato che accedo ad ALU) e secondo stato per scrivere in PC.

Poi il controllo non interessa attualmente, quello serve solo a dire alla cpu quali valore scegliere nei mux e via dicendo, ma lo stato non è conseguenza del controllore, è il controllore una conseguenza degli stati dell'automa che ci ricaviamo ocncettualmente (anche perchè creare il circuito e poi fare l'automa non avrebbe senso :) )

no, A e B sono sempre sovrascritti in qualunque caso perchè sono privi dei segnali di controllo, sono sempre arancioni.
Non ho detto di accorpare i 2 passi, non è possibile farlo perchè sono 2 operazioni sulla ALU: ho detto solo di evitare che tutte le istruzioni lo eseguano e lasciare il passo 1 solo al BEQ (dfatti ho specificato che tutte le istruzioni diminuirebbero di un ciclo tranne il BEQ che rimarrebbe invariato).

Non riesco a trovare una spiegazione.
Comment
There are no comments made yet.
Accepted Answer Pending Moderation

ma come no? pag 22 delle slide della multiciclo si vede propri oil percorso che fa l'istruzione: i bit 25-21 e 20-16 sono inviati a Read Register1 e 2, successivamente usciranno quindi Read Data 1 e 2 che finiranno in A e B (e infatti nel disegno sono arancioni).


anche perchè i bit 25:21 e 20:16 non contengono l'opcode quindi il decode non potrebbe proprio essere fatto a partire da questi bit.

(ma la funzione edit su sto forum proprio no eh...)
Comment
There are no comments made yet.
Accepted Answer Pending Moderation

(ma la funzione edit su sto forum proprio no eh...)

ti quoto in pieno (non la mettono per problemi di sicurezza e poi il forum è pieno di collegamenti a siti porno :roll: )


anche perchè i bit 25:21 e 20:16 non contengono l'opcode quindi il decode non potrebbe proprio essere fatto a partire da questi bit.

ma il decode non è solo sui bit 31-26 che contengono l'op code, ma su tutti e 32 i bit dell'istruzione, sia essa I, R o J. Se non invio i valori dei bit ad A e B poi non posso far nulla succesivamente. E comunque non vengono mai sovrascritti, sono usati solo una volta nello stato 1 (nel decode), poi o si usano per istruzioni R (somma e sottrazione), per le tipo I (confronto, accesso a memoria etc) o J per il salto, ma non saranno mai sovrscritte una volta salvato il dato, altrimenti non avrebbe senso usare un registro invisibile al programmatore (cioè A e B) per salvarsi i valori estratti :? (almeno credo, comunque mi piace sta discussione, dovendo discuterne in maniera costruttiva mi sto rivedendo tutto per dare un senso a quello che devo dire... magari poi sbaglio tutto :lol: )
Comment
There are no comments made yet.
Accepted Answer Pending Moderation

(ma la funzione edit su sto forum proprio no eh...)

ti quoto in pieno (non la mettono per problemi di sicurezza e poi il forum è pieno di collegamenti a siti porno :roll: )


anche perchè i bit 25:21 e 20:16 non contengono l'opcode quindi il decode non potrebbe proprio essere fatto a partire da questi bit.

ma il decode non è solo sui bit 31-26 che contengono l'op code, ma su tutti e 32 i bit dell'istruzione, sia essa I, R o J. Se non invio i valori dei bit ad A e B poi non posso far nulla succesivamente. E comunque non vengono mai sovrascritti, sono usati solo una volta nello stato 1 (nel decode), poi o si usano per istruzioni R (somma e sottrazione), per le tipo I (confronto, accesso a memoria etc) o J per il salto, ma non saranno mai sovrscritte una volta salvato il dato, altrimenti non avrebbe senso usare un registro invisibile al programmatore (cioè A e B) per salvarsi i valori estratti :? (almeno credo, comunque mi piace sta discussione, dovendo discuterne in maniera costruttiva mi sto rivedendo tutto per dare un senso a quello che devo dire... magari poi sbaglio tutto :lol: )


insisto: A e B sono sempre sovrascritti. Pagina 42 delle slide in PPT sul multiciclo, lo dice chiaramente.. Puoi usare i valori all'interno dello stesso ciclo sfruttando il fatto che è un'architettura edge-triggered e dove quindi le cose cambiano solo al salire del clock (ad esempio da B alla memoria) ma non tra 2 cicli (come invece è per gli altri registri), per la stessa ragione.

Anche per il decode insisto...il riconoscimento dell'istruzione è dato solo dai primi 6 bit (31:26) (vedi pagine 68 e 78 delle slide in PPT, la tabella di dispatch). A partire da quelli e dallo stato si determina ogni stato successivo. (Come si vede quando spiega ROM PLA e sequenzializzatore).

Temo che la ragione per usare il passo 1 comune a tutti c'è ma con questo set ultra-ridotto di istruzioni non si vede...oppure non c'ho capito niente, ho una versione fallata delle slide e mercoledì racconterò favolette in assembler...(del tipo "c'era una volta un re che disse alla sua serva: raccontami una storia. e la serva incominciò "c'era una volta un re" ... così implemento pure la ricorsione :D )
Comment
There are no comments made yet.
Accepted Answer Pending Moderation
Semplicemente fai il complemento a 2 di quello negativo e lo sommi all'altro
Comment
There are no comments made yet.
Accepted Answer Pending Moderation
intendi dire il complemento a 2 della mantissa?
Comment
There are no comments made yet.
Accepted Answer Pending Moderation

(ma la funzione edit su sto forum proprio no eh...)

ti quoto in pieno (non la mettono per problemi di sicurezza e poi il forum è pieno di collegamenti a siti porno :roll: )


anche perchè i bit 25:21 e 20:16 non contengono l'opcode quindi il decode non potrebbe proprio essere fatto a partire da questi bit.

ma il decode non è solo sui bit 31-26 che contengono l'op code, ma su tutti e 32 i bit dell'istruzione, sia essa I, R o J. Se non invio i valori dei bit ad A e B poi non posso far nulla succesivamente. E comunque non vengono mai sovrascritti, sono usati solo una volta nello stato 1 (nel decode), poi o si usano per istruzioni R (somma e sottrazione), per le tipo I (confronto, accesso a memoria etc) o J per il salto, ma non saranno mai sovrscritte una volta salvato il dato, altrimenti non avrebbe senso usare un registro invisibile al programmatore (cioè A e B) per salvarsi i valori estratti :? (almeno credo, comunque mi piace sta discussione, dovendo discuterne in maniera costruttiva mi sto rivedendo tutto per dare un senso a quello che devo dire... magari poi sbaglio tutto :lol: )


insisto: A e B sono sempre sovrascritti. Pagina 42 delle slide in PPT sul multiciclo, lo dice chiaramente.. Puoi usare i valori all'interno dello stesso ciclo sfruttando il fatto che è un'architettura edge-triggered e dove quindi le cose cambiano solo al salire del clock (ad esempio da B alla memoria) ma non tra 2 cicli (come invece è per gli altri registri), per la stessa ragione.

Anche per il decode insisto...il riconoscimento dell'istruzione è dato solo dai primi 6 bit (31:26) (vedi pagine 68 e 78 delle slide in PPT, la tabella di dispatch). A partire da quelli e dallo stato si determina ogni stato successivo. (Come si vede quando spiega ROM PLA e sequenzializzatore).

Temo che la ragione per usare il passo 1 comune a tutti c'è ma con questo set ultra-ridotto di istruzioni non si vede...oppure non c'ho capito niente, ho una versione fallata delle slide e mercoledì racconterò favolette in assembler...(del tipo "c'era una volta un re che disse alla sua serva: raccontami una storia. e la serva incominciò "c'era una volta un re" ... così implemento pure la ricorsione :D )


provo ad entrare nella discussione...
A è B è vero sono sempre sovrascritti..ma il passo 1 è cmq necessario farlo prima perkè in questo modo mi salvo un accesso ai registri..il quale ha bisogno al meno di un ciclo di clock..e quindi se non faccio il passo 1 prima in questo modo lo dovrò fare per le istruzioni che usano i registri rs e rt dopo aggiungendo uno stato alle stesse..

giusto ?
Comment
There are no comments made yet.
Accepted Answer Pending Moderation
però non mi torna....a pagina 12 delle dispense su floating point ho provato a fare la somma tra 8.5 e -13.75

l'esponente è per entrambi e=3 dunque non devo shiftare la mantissa di nessun numero.
Faccio il complemento a 2 della mantissa del numero -13.75: 10111000.... che diventa 01001000...ma se sommo questo a 8.5 che è 000100000.... mi esce fuori 10.25
Comment
There are no comments made yet.
Accepted Answer Pending Moderation
provo ad entrare nella discussione...
A è B è vero sono sempre sovrascritti..ma il passo 1 è cmq necessario farlo prima perkè in questo modo mi salvo un accesso ai registri..il quale ha bisogno al meno di un ciclo di clock..e quindi se non faccio il passo 1 prima in questo modo lo dovrò fare per le istruzioni che usano i registri rs e rt dopo aggiungendo uno stato alle stesse..

giusto ?


cosa intendi con "mi salvo un accesso ai registri"?
Comment
There are no comments made yet.
Accepted Answer Pending Moderation
bo, sono ancora in dubbio.. ora provo a mandare una email al professore :)
Comment
There are no comments made yet.
Accepted Answer Pending Moderation
ragazzi ma come si sommano due numeri floating point se uno di essi è negativo?

Me lo chiedevo ank'io!!


è un bel problema... non riesco a trovare nulla che mi faccia capire come si fa :roll:


Semplicemente fai il complemento a 2 del numero negativo e lo sommi all'altro :wink:
Comment
There are no comments made yet.
Accepted Answer Pending Moderation
però non mi torna....a pagina 12 delle dispense su floating point ho provato a fare la somma tra 8.5 e -13.75

l'esponente è per entrambi e=3 dunque non devo shiftare la mantissa di nessun numero.
Faccio il complemento a 2 della mantissa del numero -13.75: 10111000.... che diventa 01001000...ma se sommo questo a 8.5 che è 000100000.... mi esce fuori 10.25


il risultato (dato che sarà negativo) devi riportarlo in complemento a 2.
Comment
There are no comments made yet.
Accepted Answer Pending Moderation
per non complicarti le cose prendi il numero appena convertito in binario, non perdere tempo con mantissa ed esponente (almeno per capire il ragionamento)
Comment
There are no comments made yet.
Accepted Answer Pending Moderation
provo ad entrare nella discussione...
A è B è vero sono sempre sovrascritti..ma il passo 1 è cmq necessario farlo prima perkè in questo modo mi salvo un accesso ai registri..il quale ha bisogno al meno di un ciclo di clock..e quindi se non faccio il passo 1 prima in questo modo lo dovrò fare per le istruzioni che usano i registri rs e rt dopo aggiungendo uno stato alle stesse..

giusto ?


cosa intendi con "mi salvo un accesso ai registri"?


intendo fare l'operazione "prima" anche se potrebbe non essere necessario. (vedi jump)
nel senso che non sapendo ancora quale istruzione dovrò eseguire al passo 1 mi memorizzo nei temporanei A e B i campi rs e rt..così se li dovrò usare nei passi successivi già ce l ho "pronti" in A e B.. "salvandomi" un accesso ai registri per i passi i successivi..non so se sono chiaro... :roll:
Comment
There are no comments made yet.
Accepted Answer Pending Moderation
provo ad entrare nella discussione...
A è B è vero sono sempre sovrascritti..ma il passo 1 è cmq necessario farlo prima perkè in questo modo mi salvo un accesso ai registri..il quale ha bisogno al meno di un ciclo di clock..e quindi se non faccio il passo 1 prima in questo modo lo dovrò fare per le istruzioni che usano i registri rs e rt dopo aggiungendo uno stato alle stesse..

giusto ?


cosa intendi con "mi salvo un accesso ai registri"?


intendo fare l'operazione "prima" anche se potrebbe non essere necessario. (vedi jump)
nel senso che non sapendo ancora quale istruzione dovrò eseguire al passo 1 mi memorizzo nei temporanei A e B i campi rs e rt..così se li dovrò usare nei passi successivi già ce l ho "pronti" in A e B.. "salvandomi" un accesso ai registri per i passi i successivi..non so se sono chiaro... :roll:


in A e in B non ci vanno RS e RT ma (PC+4) e i 16 bit meno significativi (estesi a 32 bit e shiftati di 2) dell'istruzione.
Comment
There are no comments made yet.
Accepted Answer Pending Moderation
provo ad entrare nella discussione...
A è B è vero sono sempre sovrascritti..ma il passo 1 è cmq necessario farlo prima perkè in questo modo mi salvo un accesso ai registri..il quale ha bisogno al meno di un ciclo di clock..e quindi se non faccio il passo 1 prima in questo modo lo dovrò fare per le istruzioni che usano i registri rs e rt dopo aggiungendo uno stato alle stesse..

giusto ?


cosa intendi con "mi salvo un accesso ai registri"?


intendo fare l'operazione "prima" anche se potrebbe non essere necessario. (vedi jump)
nel senso che non sapendo ancora quale istruzione dovrò eseguire al passo 1 mi memorizzo nei temporanei A e B i campi rs e rt..così se li dovrò usare nei passi successivi già ce l ho "pronti" in A e B.. "salvandomi" un accesso ai registri per i passi i successivi..non so se sono chiaro... :roll:


in A e in B non ci vanno RS e RT ma (PC+4) e i 16 bit meno significativi (estesi a 32 bit e shiftati di 2) dell'istruzione.


pardon, ho sbagliato. quelli vanno nella ALU. sì è come dici tu il fatto è caricare RS e RT in Read1 e Read2 è un'operazione che non richiede cicli quindi non c'è il risparmio.
Comment
There are no comments made yet.
Accepted Answer Pending Moderation
]; (A = Reg[rs])
B = Reg[IR[20-15]]; (B = Reg[rt])
- A e B sempre sovrascritti (nessun segnale di controllo)
Comment
There are no comments made yet.
Accepted Answer Pending Moderation
provo ad entrare nella discussione...
A è B è vero sono sempre sovrascritti..ma il passo 1 è cmq necessario farlo prima perkè in questo modo mi salvo un accesso ai registri..il quale ha bisogno al meno di un ciclo di clock..e quindi se non faccio il passo 1 prima in questo modo lo dovrò fare per le istruzioni che usano i registri rs e rt dopo aggiungendo uno stato alle stesse..

giusto ?


cosa intendi con "mi salvo un accesso ai registri"?


intendo fare l'operazione "prima" anche se potrebbe non essere necessario. (vedi jump)
nel senso che non sapendo ancora quale istruzione dovrò eseguire al passo 1 mi memorizzo nei temporanei A e B i campi rs e rt..così se li dovrò usare nei passi successivi già ce l ho "pronti" in A e B.. "salvandomi" un accesso ai registri per i passi i successivi..non so se sono chiaro... :roll:


in A e in B non ci vanno RS e RT ma (PC+4) e i 16 bit meno significativi (estesi a 32 bit e shiftati di 2) dell'istruzione.


forse stiamo parlando di cose differenti
passo 1 ID
A = Reg[IR[25-21]]; (A = Reg[rs])
B = Reg[IR[20-15]]; (B = Reg[rt])
- A e B sempre sovrascritti (nessun segnale di controllo)


sì mi sono corretto, è come dici tu.

Il discorso di "portarsi avanti col lavoro" è giusto ma è necessario perchè la decodifica del campo opcode viene fatta dopo il passo 1 e non prima.
La mia domanda è: perchè non viene fatta prima del passo 1 così che nn ci sia bisogno di portarsi avanti col lavoro alla cieca?
Comment
There are no comments made yet.
Accepted Answer Pending Moderation
Olè, ora son più chiato. Grazie ad entrambi per il discorso portato avanti :wink:

Cmq ho ora un dubbio sui floating point: avendo lo stesso esponente, per fare la somma tra positivo e negativo i passi sono questi?

1. Complemento a 2 il numero negativo
2. Faccio la somma bit a bit
3. Complemento il risultato che sarà ora la mia mantissa

Giusto?

Nel caso di esponente diverso porto a stesso esponente e ripeto i punti sopra, giusto? (ditemi di si vi prego!)
Comment
There are no comments made yet.


There are no replies made for this post yet.
Be one of the first to reply to this post!