Processore Memoria Control (Parte di controllo) Datapath (Parte operativa) I/O Memoria • La dimensione del Register File è piccola • registri usati per memorizzare singole variabili di tipo semplice • purtroppo per memorizzare dati strutturati e codice di programma, sono tipicamente necessari diversi KB o MB • Memoria principale (RAM - Random Access Memory) • meno veloce della memoria dei registri, ma molto più capiente • è detta Random Access Memory perché i tempi di accesso sono indipendenti dal valore dell’indirizzo della cella di memoria acceduta • Static RAM • per la sua realizzazione vengono usati dei latch • è usata per realizzare memorie veloci, come le memorie cache • tempi di accesso (2008) intorno a 0,5 – 2,5 ns • Dynamic RAM • non è realizzata tramite latch • è usata per realizzare memorie capienti come quella principale • tempi di accesso (2008) intorno a 50 – 70 ns • è necessario “rinfrescare” il contenuto delle DRAM a intervalli di tempo prefissati Static RAM • • • • Una SRAM è realizzata come matrice di latch H x W • larghezza W = numero di latch per ogni cella • altezza H = numero di celle indirizzabili Singolo indirizzo per lettura o scrittura Non è possibile scrivere e leggere contemporaneamente Numero di bit dell’indirizzo: log2 H 0 1 2 H SRAM H×W h-2 h-1 W Static RAM • • • Chip select: da affermare per poter leggere o scrivere Output enable: da affermare per poter abilitare l’uscita del chip su un bus condiviso • serve a poter collegare molti chip di memoria ad un singolo bus Write enable: impulso che, quando attivato, registra nella linea di latch individuati da Address il valore presentato in Din Dynamic RAM • • • La DRAM è meno costosa, perché è realizzata con un solo transistor per bit, e un condensatore I condensatori mantengono i valori memorizzati solo per alcuni ms Necessario il refresh dinamico delle DRAM, effettuato leggendo, e subito riscrivendo i valori appena letti Processore Memoria Control (Parte di controllo) Datapath (Parte operativa) I/O Parte di Controllo • • • • La Parte Controllo (Control) della CPU è un circuito sequenziale • istruzioni eseguite in più cicli di clock • ad ogni ciclo, si esegue uno micropasso (microistruzione) dell’istruzione Lo stato interno al circuito sequenziale determina lo specifico micropasso da eseguire Gli output della Parte Controllo sono inviati alla Parte Operativa, che li interpreta come comandi • controlli dei multiplexer, controlli per le ALU, segnali per abilitare la scrittura in registri, ecc. Gli input della Parte Controllo giungono dalla Parte Operativa • campi del registro che contiene l’istruzione corrente (IR), risultati di operazioni di confronto, ecc. Parte di Controllo • • • • • • Esistono diverse ISA (MIPS, x86, ARM) Abbiamo visto vari componenti di base comuni alla realizzazione dei processori Un progettista deve “implementare” una ISA usando blocchi funzionali e logiche di controllo Vedremo come implementare una versione molto semplice dell’ISA MIPS. Collegamenti della parte operativa (datapath) Identificazione dei segnali della parte di controllo (control) Istruzioni • • • • Istruzioni di memory-reference: lw, sw Istruzioni arithmetic-logic: add, sub, and, or, slt Istruzioni di control-flow: beq, j Tutte le istruzioni sono lunghe 32 bit 26 31 R-Type rs rt rd 6 bit 5 bit 5 bit 5 bit 26 • • • • • op: 6 shamt rt 6 bit 5 bit 5 bit funct 5 bit 6 bit 0 immediate 16 bit 26 op 0 16 rs 6 bit • 21 op 31 J-Type 11 op 31 I-Type 16 21 0 target address 26 bit codice operativo dell’istruzione rs, rt, rd: dei registri sorgente (rs, rt) e destinazione (rd) shamt: shift amount (è diverso da 0 solo per istruz. di shift) funct: seleziona le varianti dell’operazione specificata in op immediate: offset dell’indirizzo (load/store) o valore immediato (op. aritmetiche) target address: indirizzo target di un’istruzione di jump Progetto 1. Analizzare il set di istruzioni → verificare i requisiti del datapath • il datapath deve includere gli elementi di memoria corrispondenti ai registri dell’ISA • tipicamente sono necessari altri registri, usati internamente o non referenziabili direttamente attraverso l’ISA • es.: PC (Program counter) • analizzare la semantica di ogni istruzione, data in termini di trasferimenti tra registri, ed eventuali operazioni tra i registri • ll datapath deve fornire i cammini per permettere tutti i register transfer necessari, e gli accessi alla memoria 2. Selezionare i vari componenti del datapath (es. ALU) e stabilisci la metodologia di clocking 3. Assemblare il datapath in accordo ai requisiti, aggiungendo i segnali di controllo 4. Analizzare l’implementazione di ogni istruzione per determinare il setting dei segnali di controllo che provocano i vari register transfer 5. Assemblare la logica di controllo in accordo al punto 4 Proviamo a progettare una CPU in cui ogni istruzione viene eseguita all’interno di un singolo ciclo di clock Analisi dell’ISA • L’implementazione delle istruzioni è abbastanza simile: 1. Prelevare l’istruzione dalla memoria usando il contenuto del registro PC 2. Leggere l’istruzione da eseguire dalla memoria (fetch) 3. Interpretare i campi dell’istruzione per decidere esattamente cosa fare (decode) 4. Eseguire l’istruzione (execute) a. Leggere uno o due registri b. Usare l’ALU c. Scrivere in memoria o in un registro 5. Aggiornare il contenuto del registro PC e ricominciare Quindi ALU, Register File e PC devono essere inclusi nella Parte Operativa Per comodità rappresenteremo la memoria assieme agli altri elementi della Parte Operativa, ma essa non fa logicamente parte della CPU Analisi dell’ISA • Per tutte le istruzioni, dobbiamo come prima cosa effettuare il fetch op | rs | rt | rd | shamt | funct = M[ PC ] op | rs | rt | imm16 op | 26bit address = M[ PC ] = M[ PC ] istruzioni trasferimenti tra registri ADD R[rd] ← R[rs] + R[rt]; PC ← PC + 4; SUB R[rd] ← R[rs] – R[rt]; PC ← PC + 4; LOAD R[rt] ← M[ R[rs] + sign_ext(imm16) ]; PC ← PC + 4; STORE M[ R[rs] + sign_ext(Imm16) ] ← R[rt]; PC ← PC + 4; BEQ if ( R[rs] == R[rt] ) then else PC ← PC + 4 + (sign_ext(imm16) << 2); PC ← PC + 4; • • BEQ adotta un indirizzamento di tipo PC-relative Al momento dell’aggiornamento il PC contiene già l’indirizzo dell’istruzione successiva a quella corrente Possibile implementazione Gestione PC Dati da scrivere in un registro Fetch Campi rs, rt, rd dell’istruzione Campo immediate dell’istruzione Dati letti (LOAD) Dati da memorizzare (STORE) Gestione Program Counter • • • • Necessario realizzare, all’interno dello stesso ciclo di clock, il fetch dell’istruzione e l’incremento del PC Non possiamo usare l’ALU principale, perché questa è già utilizzata per eseguire le istruzioni Stiamo implementando una CPU a singolo ciclo → risorse replicate Nota che dalla memoria istruzioni viene letta una nuova istruzione ad ogni ciclo di clock Estensione di segno • • I 16 bit del campo immediato dell’istruzione (es. istruzioni di LOAD/STORE) sono estesi di segno (16 bit → 32 bit) prima di essere sommati con il registro R[rs] L’indirizzo così calcolato (R[rs] + sign_ext(Imm16)) viene usato per accedere alla Memoria Dati in lettura/scrittura M[R[rs] + sign_ext(Imm16)] Calcolo del branch • • Necessario per realizzare il calcolo dell’indirizzo di salto dei branch PC ← PC + 4 + (sign_ext(Imm16) << 2) Non possiamo usare l’ALU, perché viene già utilizzata per eseguire l’operazione di confronto (sottrazione) Linee di controllo e multiplexer Registro da scrivere in istruzioni R-Type o I-Type Secondo ingresso ALU R-Type o I-Type Brach o incremento Scrittura registro da ALU o LOAD Parte di controllo Controllo ALU • Dobbiamo definire il circuito di controllo per calcolare i 4 bit di controllo dell’ALU (ALU Operation) da assegnare in base al tipo di istruzione • Il circuito sarà a 2 livelli: • Il primo livello calcolerà ALUOp in base all’op code • Il secondo livello calcolerà effettivamente ALU Operation in base al campo funct e a ALUOp Altri segnali di controllo Nome del segnale RegDst RegWrite ALUSrc PCSrc Effetto quando deasserted Effetto quando asserted Il numero del registro di destinazione per l’ingresso Write register proviene dal campo rt dell’istruzione (bit 20:16) Il numero del registro di destinazione per l’ingresso Write register proviene dal campo rd dell’istruzione (bit 15:11) Nessuno Il registro sull’ingresso Write register è scritto con il valore sull’ingresso Write data Il secondo operando della ALU proviene dalla seconda uscita del Register File (Read data 2) Il secondo operando della ALU proviene dell’estensione di segno dei 16 bit meno significativi dell’istruzione Il registro PC è aggiornato con l’uscita Il registro PC è aggiornato con l’uscita dell’addizionatore che calcola il valore PC dell’addizionare che calcola il risultato del salto +4 MemRead Nessuno I contenuti della memoria dati identificati dall’indirizzo sono inviati sull’uscita Read data MemWrite Nessuno I contenuti della memoria dati identificati dall’indirizzo sono sostituiti con il value sull’ingresso Write data MemtoReg Il valore riportato in ingresso al registro Write data proviene dalla ALU Il valore riportato in ingresso al registro Write data proviene dalla memoria dati Parte di controllo