El Berkeley RISC és un dels dos projectes de recerca pioners en el disseny de microprocessadors basats en ordinadors amb conjunt d'instruccions reduït (RISC) que s'estan duent a terme en el marc del projecte VLSI de l'Agència de Projectes de Recerca Avançats de Defensa. El RISC va ser dirigit per David Patterson (qui va encunyar el terme RISC) a la Universitat de Califòrnia, Berkeley, entre 1980 i 1984. L'altre projecte va tenir lloc a poca distància, a la Universitat de Stanford, dins del seu esforç MIPS, que va començar el 1981 i va durar fins al 1984.
El projecte de Berkeley va tenir tant d'èxit que es va convertir en el nom de tots els dissenys similars que el van seguir; fins i tot el MIPS es coneixeria com a "processador RISC". El disseny RISC de Berkeley va ser posteriorment comercialitzat per Sun Microsystems com l'arquitectura SPARC i va inspirar l' arquitectura ARM.
El concepte RISC miniatura|Yunsup Lee sostenint el prototip de xip RISC V. Al retir d'hivern del Par Lab de la UC Berkeley, gener de 2013. Tant RISC com MIPS es van desenvolupar a partir de la constatació que la gran majoria de programes només utilitzaven una petita minoria del conjunt d'instruccions disponible d'un processador. En un famós article de 1978, Andrew S. Tanenbaum va demostrar que un programa complex d'alt nivell de 10.000 línies es podia representar mitjançant una arquitectura de conjunt d'instruccions simplificada utilitzant un codi d'operació de longitud fixa de 8 bits. Aquesta va ser aproximadament la mateixa conclusió a la qual va arribar IBM, els estudis de la qual del seu propi codi que s'executava en mainframes com l'IBM 360 només utilitzaven un petit subconjunt de totes les instruccions disponibles. Ambdós estudis suggerien que es podria produir una CPU molt més senzilla que encara executaria la majoria de codi del món real. Una altra troballa, no completament explorada en aquell moment, va ser la nota de Tanenbaum que el 81% de les constants eren 0, 1 o 2.
Aquestes constatacions es produïen a mesura que el mercat dels microprocessadors passava de 8 a 16 bits, amb dissenys de 32 bits a punt d'aparèixer. Aquests dissenys es basaven en l'objectiu de replicar alguns dels ISA existents més respectats del món dels mainframe i els miniordinadors. Per exemple, el National Semiconductor NS32000 va començar com un esforç per produir una implementació d'un sol xip del VAX-11, que tenia un conjunt d'instruccions ric amb una àmplia varietat de modes d'adreçament. El Motorola 68000 tenia una disposició general similar. Per proporcionar aquest conjunt ric d'instruccions, les CPU utilitzaven microcodi per descodificar la instrucció visible per l'usuari en una sèrie d'operacions internes. Aquest microcodi representava potser a del disseny general.
Si, com suggerien aquests altres articles, la majoria d'aquests codis d'operació no s'utilitzarien mai a la pràctica, aleshores s'estava malgastant aquest recurs important. Si simplement es construís el mateix processador sense les instruccions no utilitzades, seria més petit i, per tant, menys costós, mentre que si en comptes d'això s'utilitzessin aquests transistors per millorar el rendiment en lloc de descodificar instruccions que no s'utilitzarien, seria possible un processador més ràpid. El concepte RISC era aprofitar tots dos, produint una CPU que tingués el mateix nivell de complexitat que el 68000, però molt més ràpida.
Per fer això, RISC es va concentrar en afegir molts més registres, petits bits de memòria que contenen valors temporals als quals es pot accedir molt ràpidament. Això contrasta amb la memòria principal normal, a la qual es poden accedir diversos cicles. Si es proporcionen més registres i s'asseguren que els compiladors realment els utilitzin, els programes haurien d'executar-se molt més ràpid. A més, la velocitat del processador estaria més definida per la seva velocitat de rellotge, ja que es dedicaria menys temps a esperar accessos a memòria. Transistor per transistor, un disseny RISC superaria una CPU convencional.
L'inconvenient era que les instruccions que s'eliminaven generalment executaven diverses "subinstruccions". Per exemple, la instrucció ADD d'un disseny tradicional generalment venia en diverses versions, una que sumava els nombres de dos registres i els col·locava en un tercer, una altra que sumava els nombres que es trobaven a la memòria principal i posava el resultat en un registre, etc. Els dissenys RISC, en canvi, només incloïen una única versió de cada instrucció en particular; l'ADD, per exemple, sempre utilitzava registres per a tots els operands. Això va obligar el programador a escriure instruccions addicionals per carregar els valors des de la memòria, si calia, fent que un programa RISC fos "menys dens".
A l'era de la memòria cara, això era una preocupació real, sobretot perquè la memòria també era molt més lenta que la CPU. Com que ADD d'un disseny RISC en realitat requeriria quatre instruccions (dues càrregues, una suma i una desa), la màquina hauria de fer molt més accés a memòria per llegir les instruccions addicionals, cosa que podria alentir-la considerablement. Això es va veure compensat en certa manera pel fet que els nous dissenys utilitzaven el que aleshores era una paraula d'instrucció molt gran de 32 bits, cosa que permetia que petites constants s'incorporessin directament a la instrucció en lloc d'haver-les de carregar per separat. A més, els resultats d'una operació sovint s'utilitzen poc després per una altra, de manera que, en ometre l'escriptura a la memòria i emmagatzemar el resultat en un registre, el programa no acabava sent gaire més gran i, en teoria, podia executar-se molt més ràpid. Per exemple, una cadena d'instruccions que executen una sèrie d'operacions matemàtiques podria requerir només unes poques càrregues de memòria, mentre que la majoria dels nombres que s'utilitzen serien constants a les instruccions o valors intermedis que queden als registres de càlculs anteriors. En cert sentit, en aquesta tècnica alguns registres s'utilitzen per fer ombra a les ubicacions de memòria, de manera que els registres s'utilitzen com a proxies de les ubicacions de memòria fins als seus valors finals després que s'hagi determinat un grup d'instruccions.
Per a l'observador casual, no estava clar que el concepte RISC millorés el rendiment, i fins i tot podria empitjorar-lo. L'única manera d'estar-ne segurs era simulant-ho. Els resultats d'aquestes simulacions van ser clars; prova rere prova, cada simulació va mostrar un enorme benefici general en el rendiment d'aquest disseny.
On els dos projectes, RISC i MIPS, diferien era en el maneig dels registres. MIPS simplement afegia molts registres i deixava que els compiladors (o programadors en llenguatge assemblador) els fessin servir. RISC, en canvi, afegia circuits a la CPU per ajudar el compilador. RISC utilitzava el concepte de finestres de registre, en què tot el "fitxer de registre" es dividia en blocs, permetent al compilador "veure" un bloc per a variables globals i un altre per a variables locals.
La idea era fer que una instrucció particularment comuna, la crida a procediment, fos extremadament fàcil d'implementar. Gairebé tots els llenguatges de programació utilitzen un sistema conegut com a registre d'activació o pila de dades per a cada procediment que conté l'adreça des de la qual es va cridar el procediment, les dades (paràmetres) que s'hi van passar i espai per a qualsevol valor de resultat que s'hagi de retornar. En la gran majoria dels casos, aquests marcs són petits, normalment amb tres o menys entrades i una o cap sortida (i de vegades una entrada es reutilitza com a sortida). En el disseny de Berkeley, doncs, una finestra de registre era un conjunt de diversos registres, suficients perquè tot el marc de la pila de procediments probablement encaixés completament dins de la finestra de registre.
En aquest cas, la crida a un procediment i el retorn des d'aquest és senzill i extremadament ràpid. Es crida una sola instrucció per configurar un nou bloc de registres (una nova finestra de registre) i, a continuació, amb els operands passats al procediment a la "part inferior" de la nova finestra, el programa salta al procediment. En retornar, els resultats es col·loquen a la finestra del mateix extrem i el procediment finalitza. Les finestres de registre estan configurades per superposar-se als extrems, de manera que els resultats de la trucada simplement "apareguin" a la finestra de la persona que truca, sense que calgui copiar dades. Així, la crida a procediment comuna no ha d'interactuar amb la memòria principal, cosa que l'accelera enormement.
Com a inconvenient, aquest enfocament significa que els procediments amb un gran nombre de variables locals són problemàtics, i els que en tenen menys condueixen al malbaratament de registres, un recurs costós. Hi ha un nombre finit de finestres de registre en el disseny, per exemple, vuit, de manera que els procediments només es poden imbricar a un cert nombre de nivells de profunditat abans que el mecanisme de finestres de registre arribi al seu límit; un cop s'arriba a l'última finestra, no es pot configurar cap finestra nova per a una altra crida imbricada. I si els procediments només estan imbricats a uns quants nivells de profunditat, no es podrà accedir mai als registres de les finestres per sobre del nivell d'imbricació de crides més profund, de manera que es malgasten completament. Va ser el treball de Stanford sobre els compiladors el que els va portar a ignorar el concepte de finestra de registre, creient que un compilador eficient podia fer un millor ús dels registres que un sistema fix en maquinari. (El mateix raonament s'aplicaria a un programador intel·ligent en llenguatge assemblador.)
RISC I miniatura|Foto del RISC Moro. La major part del xip està ocupada pel fitxer de registre (zona inferior esquerra). La lògica de control només ocupa la petita cantonada superior dreta. El primer intent d'implementar el concepte RISC es va anomenar originalment Gold. El treball en el disseny va començar el 1980 com a part d'un curs de disseny de VLSI, però el disseny, aleshores complicat, va fer estavellar gairebé totes les eines de disseny existents. L'equip va haver de dedicar quantitats considerables de temps a millorar o reescriure les eines, i fins i tot amb aquestes noves eines va trigar poc menys d'una hora a extreure el disseny en un VAX-11/780.
El disseny final, anomenat RISC I, es va publicar al Simposi Internacional sobre Arquitectura de Computadors (ISCA) de l'Association for Computing Machinery (ACM) el 1981. Tenia 44.500 transistors que implementaven 31 instruccions i un fitxer de registre que contenia 78 registres de 32 bits. Això permetia sis finestres de registre que contenien 14 registres. D'aquests 14 registres, 4 se superposaven a la finestra anterior. El total és llavors: 10 * 6 registres a les finestres + 18 globals = 78 registres en total. La secció de control i descodificació d'instruccions ocupava només el 6% del dau, mentre que el disseny típic de l'època utilitzava al voltant del 50% per a la mateixa funció. El fitxer de registre ocupava la major part d'aquell espai.
El RISC I també presentava una cadena d'instruccions de dues etapes per a una velocitat addicional, però sense la complexa reordenació d'instruccions dels dissenys més moderns. Això fa que les branques condicionals siguin un problema, perquè el compilador ha d'omplir la instrucció que segueix a una branca condicional (l'anomenada ranura de retard de la branca), amb alguna cosa seleccionada per ser "segura" (és a dir, que no depengui del resultat de la condicional). De vegades, l'única instrucció adequada en aquest cas és NOP. Un nombre notable de dissenys posteriors d'estil RISC encara requereixen la consideració del retard de la bifurcació.