Re: DUBBIO 2 COMPITINO: utilizzo sottrazione per SLT
Mi scuso per l'intromissione, ma vorrei capire meglio - dopotutto siamo qui per comprendere e imparare, e parto dal presupposto di potermi sbagliare in qualsiasi momento.
(1) "Se vogliamo rispondere alla domanda del compitino ("quando alla ALU sia richiesto, attraverso i suoi ingressi, di effettuare una sottrazione"), allora l'istruzione slt rimane esclusa."
Per quanto ho capito la ALU, per come è progettata, esegue tutte le operazioni al suo interno, per poi selezionare il risultato. Quindi tecnicamente la alu "effettua" ogni operazione al suo interno (nei limiti dei segnali in input). Per esempio, quando viene chiesto di fare l'operazione add, essendo Ainvert spento e Bnegate spento, viene "effettuato" anche un normalissimo "AND", e un "OR". Quello che poi discrimina è il risultato selezionato attraverso il mux. Quindi, sempre a livello tecnico, se si ha Ainvert spento e Bnegate acceso l'adder all'interno della ALU effettua una sottrazione, indipendentemente da quale risultato viene poi selezionato attraverso il segnale per l'operazione ALU (i due bit per il mux).
Naturalmente in quest'ottica qualsiasi domanda del tipo "quando la ALU effettua xxx" perde di significato; si dovrebbero considerare tutte le operazioni che hanno Ainvert spento e Bnegate acceso. Non è sicuramente l'approccio da usare nell'affrontare la domanda nel compitino. Suppongo dunque che la sottrazione debba avere una qualche rilevanza all'interno dell'operazione affinché quest'ultima abbia i requisiti per essere parte della risposta alla domanda.
Vengo al punto: le operazioni, se non mi sbaglio, che richiedono una sottrazione alla ALU tra quelle proposte (non vorrei ricordare male, dovrebbero essere add, and, beq, j, lw, or, slt, sub, sw) sono la sub naturalmente, beq e slt. Perché? La motivazione per sub è banale; beq esegue una differenza, per poi eseguire un NOR su tutti i 32 bit del risultato - che risulta acceso solo se tutti i bit sono spenti, dunque a - b = 0; slt esegue una differenza, a - b, ne prende l'msb e lo usa per capire se il risultato è negativo (grazie al CA2) e dunque a < b; tutte le ALU restituiscono il valore di "less", per tutte impostato a zero tranne che per la prima - che conterrà il valore di set dell'ultima ALU, ossia l'msb della differenza - permettendo così di avere un risultato "flag", ossia 0...0 oppure 0..01. Per cui, a rigor di logica, l'istruzione slt fa eseguire alla ALU una sottrazione di rilevante importanza (senza la quale dovremmo cambiare il modo in cui calcoliamo il risultato di a < b).
(2) Ad alcuni di voi ho risposto ieri dicendo "l'istruzione slt chiede a ALU la sua specifica operazione SLT, che usa dentro ALU le porte che fanno la sottrazione *più* le linee "less" e "set", e produce nei 32 bit di uscita di ALU un valore che è 0 o 1, e non il valore della differenza. Diverso è quanto accade per beq, che chiede a ALU la vera e propria sottrazione, con nei 32 bit di uscita la differenza".
Tento di analizzare, in parallelo, le due istruzioni:
I) L'istruzione ha bisogno di una sottrazione per poter essere eseguita? Sì, entrambe.
II) Il risultato della sottrazione è utilizzato per il calcolo del risultato? Sì per entrambe; nonostante nella slt ci interessi "solamente" l'msb, viene de facto eseguita la sottrazione per poterlo calcolare. Quindi entrambe sfruttano il risultato della sottrazione.
III) L'istruzione richiede hardware aggiuntivo per quanto riguarda la ALU? Sì per entrambe, le linee set e less per slt, il NOR finale per l'output "zero" utilizzato per il beq. Questo è importante perché fa capire che in realtà non ci interessa usare il risultato della sottrazione, ma vogliamo manipolarlo prima di poterlo usare.
III) La ALU ha nell'output "Result" il risultato della sottrazione? Sì per beq, no per slt, che ha il suo valore.
IV) Al di fuori della ALU, viene usato il risultato della sottrazione, ovunque sia dato come output, se viene dato come output? No per entrambe.
V) Cosa cambia dunque? Cambia che l'istruzione beq fa eseguire una sub alla ALU, con quindi result che contiene il risultato della sub, per poi prenderne l'output zero e ignorare result, mentre la slt fa eseguire una sottrazione senza darne in output il risultato, in quanto viene selezionata la linea less anziché quella dell'adder per formare result.
Quindi con "la vera e propria sottrazione" suppongo che Lei intenda l'operazione sub.
Quello che concludo è che la domanda sia ambigua, in quanto non si capisce dal testo se per sottrazione si intende l'operazione come concettualmente intesa da un umano, o si debba intendere l'operazione sottrazione, con specifico codice della ALU annesso. La dicitura "attraverso i suoi ingressi" non aiuta lo stesso, in quanto fino a prova contraria per l'istruzione slt gli ingressi della ALU vengono settati per fare una sottrazione, che viene effettivamente usata; che poi non sia data in output ma sia sfruttata attraverso il segnale di set è un altro discorso. Sarebbe stato diverso se la domanda fosse stata "quali istruzioni fanno effettuare alla ALU una sottrazione il cui risultato è nell'output Result", ma così non era.
(3) "fuori ALU l'operazione SLT è indicata distinta, perché vogliamo un diverso output".
Vero, quando eseguiamo un slt non vogliamo il risultato della differenza. Ma a voler ben vedere non vogliamo il risultato della differenza neanche per la beq! L'unica cosa che ci interessa è la differenza rielaborata attraverso la porta nor e quindi il segnale zero per la porta AND che permette, insieme al segnale PCWriteCond, di eseguire l'istruzione beq. Quindi è vero che per la sottrazione e la slt vogliamo output result diverso, ma a questo punto potremmo dibattere sul fatto che beq l'output result, per quanto ho capito, lo ignora proprio. Quindi che scopo ha avere il risultato della sottrazione in result? Nessuno, proprio perché come in slt la sottrazione è puramente funzionale.
Potremmo in un raptus di follia (sperando di non fare errori logici) dare in input al NOR anziché l'output result del mux dell'ALU a un bit direttamente l'output dell'adder; a questo punto l'output zero sarebbe acceso anche per input diversi rispetto a numeri uguali, per esempio se Ainvert e Bnegate sono spenti e i due numeri sono opposti, la somma sarebbe 0 (è effettuata una somma proprio per Ainvert e Bnegate spenti) e dunque sarebbe acceso il NOR. Basta dare in pasto al NOR anche Ainvert e Bnegate negato, così che NOR si possa accendere solo se Ainvert è spento e Bnegate è acceso, e si sta pertanto facendo una sottrazione; a - b = 0 implica a = b, dunque avremmo ancora il nostro output zero funzionante. Il vantaggio, o meglio, l'osservazione resa possibile da questa modifica sconsiderata (non tiene conto dell'eventuale overflow, che sarebbe da gestire a parte dato che prendiamo i risultati direttamente dagli adder, chiedo venia se qui non lo tratto) è che così facendo l'unica richiesta affinché sia verificato che a = b è che Ainvert sia spento e Bnegate sia acceso, che è l'unica vera condizione imprescindibile affinché venga fatta una sottrazione. Quindi anche facendo eseguire una slt alla ALU, zero avrebbe il valore corretto esattamente come se avessimo fatto una sub.
Quello che sto tentando di dire è che non importa neanche a beq che venga eseguita esattamente l'operazione sub (o meglio, per come è fatta la alu che abbiamo visto sì, ma concettualmente no!), il senso è che deve essere eseguita una sottrazione che viene poi sfruttata per ottenere l'informazione desiderata: non ci interessa il risultato della sub all'esterno, tanto che potremmo (come descritto sopra) rimaneggiare in modo da permettere che, sia facendo una sub sia una slt, la beq abbia l'output zero desiderato. Quindi è vero che slt è un'operazione distinta che ha output diverso da quello della sottrazione, ma come la beq dell'output della sottrazione non ci interessa che la sua rielaborazione, quindi anche per la beq vogliamo un diverso output - letteralmente, zero anziché result.
La mia domanda finale è dunque sull'interpretazione che dobbiamo dare alla domanda - e a tutte quelle che sono dello stesso tipo (richiede un'addizione, e così via). Mi sembra poco corretto penalizzare chi effettivamente ha ragionato sul fatto che la ALU effettua una sottrazione, concettualmente intesa, per fare la slt - mostra che ha capito come è implementata. Allo stesso modo non sarebbe da penalizzare chi ha ragionato nei termini dell'operazione sub e ha quindi giustamente considerato a parte slt. Premetto che non ho avuto la domanda, sono qui solo per capire...
Ringrazio infinitamente per il tempo e la pazienza dedicatomi e mi scuso per la prolissità del messaggio, buona serata a tutti!