






Studia grazie alle numerose risorse presenti su Docsity
Guadagna punti aiutando altri studenti oppure acquistali con un piano Premium
Prepara i tuoi esami
Studia grazie alle numerose risorse presenti su Docsity
Prepara i tuoi esami con i documenti condivisi da studenti come te su Docsity
Trova i documenti specifici per gli esami della tua università
Preparati con lezioni e prove svolte basate sui programmi universitari!
Rispondi a reali domande d’esame e scopri la tua preparazione
Riassumi i tuoi documenti, fagli domande, convertili in quiz e mappe concettuali
Studia con prove svolte, tesine e consigli utili
Togliti ogni dubbio leggendo le risposte alle domande fatte da altri studenti come te
Esplora i documenti più scaricati per gli argomenti di studio più popolari
Ottieni i punti per scaricare
Guadagna punti aiutando altri studenti oppure acquistali con un piano Premium
possibili domande a cui ho risposto per ripetere la materia di architettura dei calcolatori
Tipologia: Schemi e mappe concettuali
1 / 10
Questa pagina non è visibile nell’anteprima
Non perderti parti importanti!







Domande che potrebbero essere fatte sul progetto RISC-V.
Risposte:
Gli indirizzi dei registri sorgente RS1 e RS2 vengono inviati al Register File, che possiede due porte di lettura e quindi può leggere simultaneamente i valori contenuti nei due registri. I valori letti vengono poi inviati alla ALU come operandi.
Nella fase di Esecuzione, l'add quindi arriverà al componente ALU che produce il risultato dell'operazione. Nonostante nella mia CPU la ALU contenga diversa unità operative che lavorano in parallelo, alla fine tutte le operazioni appunto, vengono completate ma solo il multiplexer finale seleziona il risultato. Nella fase di memoria, non viene effettuata nessuna operazione sulla DMEM e quindi il risultato passa attraverso questa fase senza modifiche, il risultato però viene utilizzato nella fase di WB dove appunto il risultato dell'operazione add verrà scritto nel registro di destinazione.
dell’operazione è pronto, l’indirizzo RD seleziona quale registro del Register File deve essere aggiornato. Tuttavia la scrittura avviene solo se il segnale di controllo RegWrite è attivo. In questo modo il processore evita di scrivere nei registri quando l’istruzione non lo richiede, come nel caso di store o branch.
Solo nel caso in cui la nuova istruzione richiedesse un operazione aritmetica o logica non ancora supportata sarebbe necessario modificare anche la ALU per aggiungere una nuova unità operativa o un nuovo codice di controllo. In molti casi però è sufficiente modificare solo la logica di decodifica dei segnali di controllo.
Per quanto riguarda la trasformazione del processore da esecuzione sequenziale a processore pipelined, sarebbe necessario introdurre alcune modifiche architetturali importanti. In primo luogo bisognerebbe separare chiaramente le varie fasi del ciclo di esecuzione, cioè Fetch, Decode, Execute, Memory e Write Back. Tra ciascuna di queste fasi dovrebbero essere inseriti dei registri di pipeline, che memorizzano temporaneamente i dati e i segnali di controllo prodotti da una fase prima di passare alla fase successiva nel ciclo di clock successivo. In questo modo più istruzioni possono trovarsi contemporaneamente in fasi diverse del datapath. Inoltre sarebbe necessario gestire i problemi tipici della pipeline, come le dipendenze tra istruzioni e i conflitti sulle risorse hardware. Questo richiederebbe l’introduzione di meccanismi di gestione degli hazard, come unità di forwarding o logiche di stallo della pipeline. Infine la Control Logic dovrebbe essere adattata per generare e propagare correttamente i segnali di controllo attraverso i registri di pipeline. In questo modo il processore potrebbe iniziare l’esecuzione di una nuova istruzione ad ogni ciclo di clock, aumentando significativamente il throughput del sistema.
Ulteriori domande
1. Flusso iniziale del programma
Quando apri il circuito Main, carichi il file fibo.txt nella Instruction Memory e poi attivi il clock. Puoi spiegare cosa succede nei primi due cicli di clock nel tuo processore?
Risposta : Quando il programma viene caricato nella Instruction Memory tramite il comando Load Image , la memoria viene inizializzata con la sequenza di istruzioni del programma Fibonacci. A questo punto il Program Counter viene inizializzato a zero tramite il segnale di reset.
Nel primo ciclo di clock il valore del Program Counter, che è pari a zero, viene inviato alla Instruction Memory. La memoria utilizza questo indirizzo per restituire la prima istruzione del programma, che entra nel datapath. Questa è la fase di Fetch , in cui il processore recupera l’istruzione dalla memoria.
L’istruzione recuperata passa quindi alla fase di Decode , dove i blocchi DecodeLogic1 e DecodeLogic analizzano i campi dell’istruzione. DecodeLogic1 esamina i campi opcode, funct3 e funct7 per identificare il tipo di operazione, mentre DecodeLogic2 estrae i campi operativi come RS1, RS2 e RD. Contemporaneamente la Control Logic genera i segnali di controllo necessari per il datapath.
Nel secondo ciclo di clock il Program Counter viene aggiornato, normalmente con l’operazione PC + 4 nel caso di esecuzione sequenziale. Questo nuovo valore permette di accedere alla seconda istruzione del programma nella Instruction Memory. Nel frattempo la prima istruzione continua il suo percorso nel datapath attraversando le fasi successive, cioè Execute, Memory e Write Back.
Spiegazione funzionamento progetto:
Il progetto consiste nella realizzazione di una CPU a 32 bit che implementa l’architettura RISC-V RV32I all’interno dell’ambiente Logisim. Il processore è in grado di eseguire istruzioni aritmetiche, logiche, di load/store e di controllo del flusso come branch e jump. L’obiettivo del progetto è stato progettare un datapath completo con la relativa logica di controllo, in modo da permettere l’esecuzione di un programma reale, nel nostro caso il calcolo della sequenza di Fibonacci.
Il funzionamento della CPU segue il classico ciclo di esecuzione delle istruzioni composto dalle fasi di Fetch, Decode, Execute, Memory e Write Back.
Nella fase di Fetch il Program Counter contiene l’indirizzo della prossima istruzione da eseguire e lo invia alla Instruction Memory, che restituisce l’istruzione a 32 bit memorizzata a quell’indirizzo. Poiché le istruzioni RISC-V hanno lunghezza fissa di 32 bit, il Program Counter viene normalmente aggiornato con l’operazione PC + 4, oppure con un offset nel caso di istruzioni di branch o jump.
L’istruzione passa poi alla fase di Decode, dove i blocchi DecodeLogic1 e DecodeLogic2 analizzano i campi dell’istruzione. In particolare vengono estratti i registri sorgente RS1 e RS2, il registro di destinazione RD e gli eventuali campi immediati. Contemporaneamente la Control Logic analizza opcode, funct3 e funct7 per generare i segnali di controllo necessari per il datapath.
Durante la fase di Execute il Register File fornisce i valori dei registri sorgente che vengono utilizzati come operandi dalla ALU. Nel caso di istruzioni con immediato, un multiplexer seleziona tra il valore del registro RS2 e l’immediato generato dall’Immediate Generator. La ALU esegue quindi l’operazione richiesta, come addizione, confronto o calcolo di indirizzo.
Nella fase Memory, se l’istruzione è di tipo load o store, la Data Memory viene utilizzata per leggere o scrivere dati all’indirizzo calcolato dalla ALU. Se invece l’istruzione è aritmetica, questa fase viene semplicemente attraversata senza operazioni sulla memoria.
Infine nella fase di Write Back il risultato prodotto dalla ALU o dalla Data Memory viene scritto nel registro di destinazione RD del Register File, se il segnale RegWrite è attivo.
Per osservare il funzionamento del processore è stato inoltre collegato un blocco di output al datapath che permette di visualizzare i valori calcolati tramite display esadecimali durante l’esecuzione del programma Fibonacci.
Domande sul codice assembly
1. Può spiegarmi cosa fa questo programma Fibonacci?
Risposta : Il programma calcola i primi N numeri della sequenza di Fibonacci e li salva in memoria all’interno dell’array array. Il valore di N viene letto dalla memoria dati, poi vengono inizializzati i primi due valori della sequenza (F0 = 0 , F1 = 1 ) e salvati nell’array. Successivamente un ciclo calcola iterativamente i valori successivi usando la relazione F(n) = F(n-1) + F(n-2) e li memorizza in memoria.
2. Quale istruzione realizza il ciclo?
Risposta : bnez t1, loop
Questa istruzione controlla se il contatore t1 è diverso da zero e, in tal caso, salta all’etichetta loop.
Questo genera un branch condizionale nel tuo processore.
3. Quando viene eseguita l’istruzione add t5, t3, t4 cosa succede nel datapath?
Risposta :
● Fetch → PC legge istruzione ● Decode → RS1=t3, RS2=t4, RD=t ● Register File legge t3 e t ● ALU esegue addizione ● WriteBack scrive risultato in t
4. Quali istruzioni del programma utilizzano la Data Memory?
Risposta : le istruzioni sono:
lw t1, 0(t0)
sw t3, 0(t2)
sw t4, 4(t2)
sw t5, 0(t2)
lw a0, 0(t2)
● lw → MemRead ● sw → MemWrite
Quindi attivano la fase MEM del datapath.
5. Come viene calcolato l’indirizzo nella istruzione sw t5, 0(t2)
Risposta : L’indirizzo di memoria viene calcolato dalla ALU come: indirizzo = registro base + offset In questo caso: indirizzo = t2 + 0
● RS1 = t ● RS2 = t ● RD = t
Gli indirizzi dei registri sorgente vengono inviati al Register File, che possiede due porte di lettura e può quindi leggere simultaneamente i contenuti dei registri t3 e t4. I valori letti diventano gli operandi della ALU.
Nella fase di Execute, la ALU riceve i due operandi provenienti dal Register File e attiva l’unità di addizione. Nella tua implementazione la ALU contiene diverse unità operative in parallelo (addizione, operazioni logiche, confronti e shift). Tutte queste unità producono un risultato, ma un multiplexer finale seleziona quello corretto in base ai segnali di controllo generati dalla Control Logic durante la fase di decode. In questo caso il multiplexer seleziona il risultato dell’addizione.
La fase Memory in questo caso non viene utilizzata, perché l’istruzione non richiede accessi alla Data Memory. Il valore prodotto dalla ALU attraversa quindi questa fase senza modifiche.
Infine nella fase di Write Back, il risultato dell’addizione viene scritto nel registro di destinazione t5. L’indirizzo del registro è fornito dal campo RD e la scrittura avviene solo se il segnale di controllo RegWrite è attivo. Il valore viene quindi memorizzato nel Register File e potrà essere utilizzato dalle istruzioni successive.
Nel programma Fibonacci questo valore rappresenta il nuovo numero della sequenza, cioè la somma dei due valori precedenti.
Dove viene selezionato se il secondo operando della ALU è RS2 oppure un immediato?
La risposta : Il segnale viene generato dalla Control Logic, che controlla un multiplexer prima dell’ingresso della ALU. Questo multiplexer sceglie tra il valore del registro RS2 e l’immediato prodotto dall’Immediate Generator.