# Canonada RISC clàssic

En la història del maquinari informàtic, algunes unitats centrals de processament d'ordinadors de conjunt d'instruccions reduïdes (CPU RISC) van utilitzar una solució arquitectònica molt similar, ara anomenada pipeline RISC clàssic. Aquestes CPU eren: MIPS, SPARC, Motorola 88000, i més tard la CPU nocional DLX inventada per a l'educació.
Cadascun d'aquests dissenys clàssics de RISC escalar recupera i intenta executar una instrucció per cicle. El concepte comú principal de cada disseny és un pipeline d'instruccions d'execució en cinc etapes. Durant el funcionament, cada etapa de la canonada funciona amb una instrucció alhora. Cadascuna d'aquestes etapes consta d'un conjunt de flip-flops per mantenir l'estat i lògica combinacional que funciona a les sortides d'aquests flip-flops.

## La clàssica canonada RISC de cinc etapes
### Recollida d'instruccions

Les instruccions resideixen a la memòria que triga un cicle a llegir-se. Aquesta memòria es pot dedicar a SRAM o una memòria cau d'instruccions. El terme "latencia" s'utilitza sovint en informàtica i significa el temps des que comença una operació fins que es completa. Així, la recuperació d'instruccions té una latència d'un cicle de rellotge (si s'utilitza SRAM d'un sol cicle o si la instrucció estava a la memòria cau). Així, durant l'etapa d'obtenció d'instruccions, s'obté una instrucció de 32 bits de la memòria d'instruccions.
El comptador de programes, o PC, és un registre que conté l'adreça que es presenta a la memòria d'instruccions. L'adreça es presenta a la memòria d'instruccions a l'inici d'un cicle. A continuació, durant el cicle, la instrucció es llegeix de la memòria d'instruccions i, al mateix temps, es fa un càlcul per determinar el següent ordinador. El següent PC es calcula augmentant el PC en 4 i escollint si s'ha de prendre com el següent PC o si es pren el resultat d'un càlcul de branca/salt com el següent PC. Tingueu en compte que al RISC clàssic, totes les instruccions tenen la mateixa longitud. (Aquesta és una cosa que separa RISC de CISC). En els dissenys RISC originals, la mida d'una instrucció és de 4 bytes, així que afegiu-ne sempre 4 a l'adreça de la instrucció, però no utilitzeu PC + 4 per al cas d'una branca, un salt o una excepció (vegeu branques retardades, a continuació). (Tingueu en compte que algunes màquines modernes utilitzen algorismes més complicats (predicció de branques i predicció d'objectius de salts) per endevinar la següent adreça d'instrucció).

### Descodificació d'instruccions

Una altra cosa que separa les primeres màquines RISC de les anteriors màquines CISC és que RISC no té microcodi. En el cas de les instruccions microcodificades CISC, un cop obtingudes de la memòria cau d'instruccions, els bits d'instrucció es desplacen cap avall per la canalització, on la lògica combinacional simple en cada etapa de la canalització produeix senyals de control per al camí de dades directament des dels bits d'instrucció. En aquests dissenys CISC, es fa molt poca descodificació en l'etapa tradicionalment anomenada etapa de descodificació. Una conseqüència d'aquesta manca de descodificació és que s'han d'utilitzar més bits d'instrucció per especificar què fa la instrucció. Això deixa menys bits per a coses com els índexs de registre.

### Executar

L'etapa d'execució és on es produeix el càlcul real. Normalment, aquesta etapa consisteix en una ALU, i també una mica de canvi. També pot incloure un multiplicador i un divisor de cicles múltiples.

### Accés a la memòria

Si cal accedir a la memòria de dades, es fa en aquesta etapa.
Durant aquesta etapa, les instruccions de latència de cicle únic només tenen els seus resultats enviats a la següent etapa. Aquest reenviament garanteix que les instruccions d'un i dos cicles escriguin sempre els seus resultats a la mateixa etapa del pipeline, de manera que només es pot utilitzar un port d'escriptura al fitxer de registre i sempre està disponible.

### Escriptura a registre

Durant aquesta etapa, tant les instruccions d'un sol cicle com les de dos cicles escriuen els seus resultats al fitxer de registre. Tingueu en compte que dues etapes diferents accedeixen al fitxer de registre al mateix temps: l'etapa de descodificació està llegint dos registres d'origen, alhora que l'etapa de reescriptura està escrivint el registre de destinació d'una instrucció anterior. En silici real, això pot ser un perill (vegeu més avall per obtenir més informació sobre els perills). Això és perquè un dels registres d'origen que es llegeixen en descodificació pot ser el mateix que el registre de destinació que s'escriu en reescriptura. Quan això passa, les mateixes cel·les de memòria del fitxer de registre es llegeixen i s'escriuen alhora. Al silici, moltes implementacions de cèl·lules de memòria no funcionaran correctament quan es llegeixen i s'escriuen al mateix temps.

## Perills

Hennessy i Patterson van encunyar el terme perill per a situacions en què les instruccions d'una canalització produirien respostes incorrectes.

### Riscos estructurals

Els perills estructurals es produeixen quan dues instruccions poden intentar utilitzar els mateixos recursos al mateix temps. Les canonades RISC clàssiques van evitar aquests perills replicant el maquinari. En particular, les instruccions de la salt podrien haver utilitzat l'ALU per calcular l'adreça de destinació de la branca. Si l'ALU s'hagués utilitzat en l'etapa de descodificació per a aquest propòsit, una instrucció ALU seguida d'una branca hauria vist ambdues instruccions intentar utilitzar l'ALU simultàniament. És senzill resoldre aquest conflicte dissenyant un sumador d'objectius de branca especialitzat a l'etapa de descodificació.

### Perills de les dades

Els perills de dades es produeixen quan una instrucció, programada a cegues, intenta utilitzar dades abans que les dades estiguin disponibles al fitxer de registre.
En el pipeline clàssic RISC, els perills de les dades s'eviten de dues maneres:

#### Solució A. Bypassing o Obviació

Bypassing també es coneix com a reenviament d'operands.
Suposem que la CPU està executant el següent fragment de codi:

#### Solució B. Enclavament de canonades

Tanmateix, tingueu en compte les instruccions següents:
Les dades llegides de l'adreça adr no estan presents a la memòria cau de dades fins després de l'etapa d'accés a la memòria de la instrucció LD. En aquest moment, la instrucció AND ja està a través de l'ALU. Per resoldre això caldria que les dades de la memòria es passissin enrere en el temps a l'entrada a l'ALU. Això no és possible. La solució és retardar la instrucció AND un cicle. El perill de les dades es detecta en l'etapa de descodificació i les etapes de recuperació i descodificació estan aturades: se'ls impedeix que s'oposin les seves entrades i, per tant, es mantinguin en el mateix estat durant un cicle. Les etapes d'execució, accés i escriptura posteriors veuen una instrucció addicional sense operació (NOP) inserida entre les instruccions LD i AND.
| </img> | </img> |

### Perills en controls

Els perills de control són causats per ramificacions condicionals i incondicionals. El pipeline clàssic RISC resol les branques en l'etapa de descodificació, el que significa que la recurrència de resolució de branques té una durada de dos cicles. Hi ha tres implicacions:
* La recurrència de resolució de branca passa per força circuits: lectura de la memòria cau d'instruccions, lectura del fitxer de registre, càlcul de la condició de branca (que implica una comparació de 32 bits a les CPU MIPS) i el següent multiplexor d'adreces d'instruccions.
* Com que els objectius de ramificació i salt es calculen en paral·lel a la lectura del registre, els ISA RISC normalment no tenen instruccions que es ramifiquen a una adreça de registre + desplaçament. Saltar al registre és compatible.
* En qualsevol branca presa, la instrucció immediatament després de la branca sempre s'obté de la memòria cau d'instruccions. Si s'ignora aquesta instrucció, hi ha una penalització IPC d'un cicle per branca presa, que és adequadament gran.

## Referències

* ↑ «What is the Classic RISC Pipeline? - HDL Wizard» (en anglès americà), 14-08-2022. [Consulta: 10 setembre 2023].
* ↑ «Classic Risc Pipeline» (en anglès). [Consulta: 10 setembre 2023].
* 1 2 Patterson, David. «RISC I: A Reduced Instruction Set VLSI Computer» (en anglès) p. 443–457, 12-05-1981.