Diseñador | Universidad de California, Berkeley |
---|---|
Pedazos | 32 , 64 , 128 |
Introducido | 6 de agosto de 2014 ( 06-08-2014 ) | [1]
Versión |
|
Diseño | RIESGO |
Tipo | Cargar-almacenar |
Codificación | Variable |
Derivación | Comparar y ramificar |
Endianidad | Pequeño [2] : 9 [a] |
Tamaño de página | 4 KiB |
Extensiones |
|
Abierto | Sí, libre de regalías |
Registros | |
De uso general |
|
Punto flotante |
|
RISC-V [b] (pronunciado "risk-five" [2] : 1 ) es una arquitectura de conjunto de instrucciones (ISA) de estándar abierto basada en principios establecidos de computadoras de conjunto de instrucciones reducidas (RISC). El proyecto comenzó en 2010 en la Universidad de California, Berkeley , se transfirió a la Fundación RISC-V en 2015 y a RISC-V International, una entidad suiza sin fines de lucro, en noviembre de 2019. [5] [6] Al igual que varias otras ISA de RISC, por ejemplo, Amber (ARMv2) u OpenRISC , RISC-V se ofrece bajo licencias de código abierto libres de regalías . [7] Los documentos que definen la arquitectura del conjunto de instrucciones (ISA) de RISC-V se ofrecen bajo una licencia Creative Commons o una licencia BSD .
El soporte principal para RISC-V se agregó al kernel Linux 5.17, en 2022, junto con su cadena de herramientas . [8] En julio de 2023, RISC-V, en su variante de 64 bits llamada riscv64, [9] se incluyó como una arquitectura oficial de la distribución Linux Debian , en su versión inestable . [10] El objetivo de este proyecto era "tener Debian listo para instalar y ejecutar en sistemas que implementen una variante de la ISA RISC-V". [11]
Algunos miembros de RISC-V International, como SiFive , Andes Technology , Synopsys , Damo Academy de Alibaba , Raspberry Pi y Akeana, [12] [13] están ofreciendo o han anunciado sistemas comerciales en un chip (SoC) que incorporan uno o más núcleos de CPU compatibles con RISC-V. [14]
Como arquitectura RISC, la ISA RISC-V es una arquitectura de carga y almacenamiento . Sus instrucciones de punto flotante utilizan el estándar IEEE 754 de punto flotante. Las características notables de la ISA RISC-V incluyen: ubicaciones de campo de bits de instrucción elegidas para simplificar el uso de multiplexores en una CPU, [2] : 17 un diseño que es arquitectónicamente neutral, [ dudoso – discutir ] y una ubicación fija para el bit de signo de valores inmediatos para acelerar la extensión de signo . [2] : 17
El conjunto de instrucciones está diseñado para una amplia gama de usos. El conjunto de instrucciones base tiene una longitud fija de instrucciones de 32 bits alineadas naturalmente, y la ISA admite extensiones de longitud variable donde cada instrucción puede tener cualquier número de paquetes de 16 bits de longitud. [2] : 7–10 Las extensiones admiten pequeños sistemas integrados , computadoras personales , supercomputadoras con procesadores vectoriales y computadoras paralelas a escala de almacén .
La especificación del conjunto de instrucciones define variantes de espacio de direcciones de 32 y 64 bits . La especificación incluye una descripción de una variante de espacio de direcciones plano de 128 bits , como una extrapolación de las variantes de 32 y 64 bits, pero el ISA de 128 bits permanece "sin congelar" intencionalmente, porque a partir de 2023 , todavía hay poca experiencia práctica con sistemas de memoria tan grandes. [2] : 41 [actualizar]
A diferencia de otros diseños académicos que normalmente están optimizados solo para simplificar la exposición, los diseñadores pretendían que el conjunto de instrucciones RISC-V fuera utilizable para computadoras prácticas. A partir de junio de 2019, la versión 2.2 de la ISA de espacio de usuario [15] y la versión 1.11 de la ISA privilegiada [3] están congeladas , lo que permite que continúe el desarrollo de software y hardware. La ISA de espacio de usuario, ahora rebautizada como ISA sin privilegios, se actualizó, ratificó y congelada como versión 20191213. [2] Una especificación de depuración externa está disponible como borrador, versión 0.13.2. [16]
El diseño de CPU requiere experiencia en diseño en varias especialidades: lógica digital electrónica , compiladores y sistemas operativos . Para cubrir los costos de un equipo de este tipo, los proveedores comerciales de propiedad intelectual (PI) de procesadores, como Arm Ltd. y MIPS Technologies , cobran regalías por el uso de sus diseños y patentes . [17] [18] [19] También suelen exigir acuerdos de confidencialidad antes de publicar documentos que describan las ventajas detalladas de sus diseños. En muchos casos, nunca describen las razones de sus elecciones de diseño.
RISC-V se inició con el objetivo de crear una ISA práctica que fuera de código abierto, utilizable académicamente y que se pudiera implementar en cualquier diseño de hardware o software sin regalías. [2] : 1 [20] Además, se explican las razones que justifican cada decisión de diseño del proyecto, al menos en términos generales. Los autores de RISC-V son académicos que tienen una experiencia sustancial en diseño de computadoras, y la ISA de RISC-V es un desarrollo directo de una serie de proyectos académicos de diseño de computadoras, especialmente Berkeley RISC . RISC-V se originó en parte para ayudar a todos esos proyectos. [2] : 1 [20]
Para construir una comunidad grande y continua de usuarios y, de ese modo, acumular diseños y software, los diseñadores de RISC-V ISA admiten intencionalmente una amplia variedad de casos de uso prácticos: implementaciones reales compactas, de alto rendimiento y de bajo consumo [2] : 1–2, 153–154 [21] sin sobrearquitecturar para una microarquitectura dada . [2] : 1 [22] [23] [24] Los requisitos de una gran base de contribuyentes son parte de la razón por la que RISC-V fue diseñado para abordar muchos usos posibles.
La principal afirmación de los diseñadores es que el conjunto de instrucciones es la interfaz clave de un ordenador, ya que se encuentra en la interfaz entre el hardware y el software. Si un buen conjunto de instrucciones fuera abierto y estuviera disponible para que lo usara todo el mundo, podría reducir drásticamente el coste del software al permitir una reutilización mucho mayor. También debería generar una mayor competencia entre los proveedores de hardware, que podrían dedicar más recursos al diseño y menos al soporte del software. [20]
Los diseñadores sostienen que los nuevos principios son cada vez más escasos en el diseño de conjuntos de instrucciones, ya que los diseños más exitosos de los últimos cuarenta años se han vuelto cada vez más similares. De los que fracasaron, la mayoría lo hicieron porque las empresas que los patrocinaban no tuvieron éxito financiero, no porque los conjuntos de instrucciones fueran técnicamente deficientes. Por lo tanto, un conjunto de instrucciones abierto bien diseñado y diseñado utilizando principios bien establecidos debería atraer el apoyo a largo plazo de muchos proveedores. [20]
RISC-V también fomenta el uso académico. La simplicidad del subconjunto entero permite ejercicios básicos para estudiantes y es una ISA lo suficientemente simple como para permitir que el software controle máquinas de investigación. La ISA de longitud variable proporciona espacio para extensiones del conjunto de instrucciones tanto para ejercicios de estudiantes como para investigación, [2] : 7 y el conjunto de instrucciones privilegiadas separadas permite la investigación en soporte de sistemas operativos sin rediseñar compiladores. [3] El paradigma de propiedad intelectual abierta de RISC-V permite que los diseños derivados se publiquen, reutilicen y modifiquen. [25]
El término RISC data de alrededor de 1980. [26] Antes de eso, había algún conocimiento (ver John Cocke ) de que las computadoras más simples pueden ser efectivas, pero los principios de diseño no estaban ampliamente descritos. Las computadoras simples y efectivas siempre han sido de interés académico y dieron como resultado el conjunto de instrucciones RISC DLX para la primera edición de Computer Architecture: A Quantitative Approach en 1990, de la que David Patterson fue coautor, y más tarde participó en el origen de RISC-V. DLX fue pensado para uso educativo; académicos y aficionados lo implementaron utilizando matrices de puertas programables en campo (FPGA), pero nunca estuvo realmente pensado para su implementación comercial. Las CPU ARM , versiones 2 y anteriores, tenían un conjunto de instrucciones de dominio público y aún son compatibles con GNU Compiler Collection (GCC), un compilador de software libre popular . Existen tres núcleos de código abierto para esta ISA, pero nunca se fabricaron. [27] [28] Los núcleos OpenRISC , OpenPOWER y OpenSPARC / LEON son ofrecidos por varios proveedores y tienen soporte principal para GCC y kernel Linux . [29] [30] [31]
Krste Asanović de la Universidad de California, Berkeley , tenía un requerimiento de investigación para un sistema informático de código abierto, y en 2010, decidió desarrollar y publicar uno en un "proyecto corto de tres meses durante el verano" con varios de sus estudiantes de posgrado. El plan era ayudar tanto a los usuarios académicos como a los industriales. [20] David Patterson de Berkeley se unió a la colaboración ya que fue el creador del Berkeley RISC, [26] y el RISC-V es la quinta generación homónima de su larga serie de proyectos de investigación cooperativos basados en RISC en la Universidad de California, Berkeley ( RISC-I y RISC-II publicados en 1981 por Patterson, quien se refiere [32] a la arquitectura SOAR [33] de 1984 como "RISC-III" y a la arquitectura SPUR [34] de 1988 como "RISC-IV"). En esta etapa, los estudiantes proporcionaron software inicial, simulaciones y diseños de CPU. [35]
Los autores de RISC-V y su institución obtuvieron originalmente los documentos ISA [36] y varios diseños de CPU bajo licencias BSD , que permiten que los trabajos derivados (como los diseños de chips RISC-V) sean abiertos y libres o cerrados y propietarios. La especificación ISA en sí (es decir, la codificación del conjunto de instrucciones) se publicó en 2011 como código abierto, [37] con todos los derechos reservados. El informe técnico real (una expresión de la especificación) se colocó posteriormente bajo una licencia Creative Commons para permitir mejoras por parte de colaboradores externos a través de la Fundación RISC-V y, más tarde, RISC-V International.
Se ha publicado una historia completa de RISC-V en el sitio web de RISC-V International. [38]
Los usuarios comerciales requieren que una ISA sea estable antes de poder usarla en un producto que puede durar muchos años. Para abordar este problema, en 2015 se formó la Fundación RISC-V para poseer, mantener y publicar la propiedad intelectual relacionada con la definición de RISC-V. [39] Los autores y propietarios originales han cedido sus derechos a la fundación. [ cita requerida ] La fundación está dirigida por la directora ejecutiva Calista Redmond , quien asumió el cargo en 2019 después de liderar proyectos de infraestructura abierta en IBM . [40] [ verificación fallida ]
Los miembros fundadores de RISC-V fueron: Andes, Antmicro, Bluespec, CEVA, Codasip, Cortus, Esperanto, Espressif, ETH Zurich, Google, IBM, ICT, IIT Madras, Lattice, lowRISC, Microchip, MIT (Csail), Qualcomm, Rambus, Rumble, SiFive, Syntacore y Technolution. [41]
En noviembre de 2019, la Fundación RISC-V anunció que se trasladaría a Suiza, citando preocupaciones sobre las regulaciones comerciales de Estados Unidos. [42] [43] A partir de marzo de 2020, la organización se denominó RISC-V International, una asociación empresarial suiza sin fines de lucro. [44]
A partir de 2019 [actualizar], RISC-V International publica libremente los documentos que definen RISC-V y permite el uso sin restricciones de la ISA para el diseño de software y hardware. Sin embargo, solo los miembros de RISC-V International pueden votar para aprobar cambios, y solo las organizaciones miembro usan el logotipo de compatibilidad registrado . [45]
RISC-V tiene un diseño modular, que consta de partes de base alternativas, con extensiones opcionales añadidas. La base ISA y sus extensiones se desarrollan en un esfuerzo colectivo entre la industria, la comunidad de investigación y las instituciones educativas. La base especifica instrucciones (y su codificación), flujo de control, registros (y sus tamaños), memoria y direccionamiento, manipulación de lógica (es decir, números enteros) y elementos auxiliares. La base por sí sola puede implementar una computadora de propósito general simplificada, con soporte de software completo, incluido un compilador de propósito general.
Las extensiones estándar están especificadas para funcionar con todas las bases estándar y entre sí sin conflictos.
Muchas computadoras RISC-V podrían implementar la extensión de instrucciones comprimidas para reducir el consumo de energía, el tamaño del código y el uso de memoria. [2] : 97–99 También hay planes futuros para soportar hipervisores y virtualización . [3]
Junto con la extensión de supervisor, S, un conjunto de instrucciones RVGC, que incluye uno de los conjuntos de instrucciones base RV, la colección G de extensiones (que incluye "I", lo que significa que la base no está incorporada) y la extensión C, define todas las instrucciones necesarias para soportar convenientemente un sistema operativo de propósito general . [2] : 129, 154
Nombre | Descripción | Versión | Estado [A] | Recuento de instrucciones |
---|---|---|---|---|
Base | ||||
Organización Mundial de la Salud (OMM) | Ordenación de memoria débil | 2.0 | Ratificado | |
RV32I | Conjunto de instrucciones de números enteros básicos, 32 bits | 2.1 | Ratificado | 40 |
RV32E | Conjunto de instrucciones de números enteros básicos (integrado), 32 bits, 16 registros | 2.0 | Ratificado | 40 |
RV64I | Conjunto de instrucciones de números enteros básicos, 64 bits | 2.1 | Ratificado | 15 |
RV64E | Conjunto de instrucciones de números enteros básicos (integrado), 64 bits | 2.0 | Ratificado | |
RV128I | Conjunto de instrucciones de números enteros básicos, 128 bits | 1.7 | Abierto | 15 |
Extensión | ||||
METRO | Extensión estándar para la multiplicación y división de números enteros | 2.0 | Ratificado | 8 ( RV32 ) 13 ( RV64 ) |
A | Extensión estándar para instrucciones atómicas | 2.1 | Ratificado | 11 ( RV32 ) 22 ( RV64 ) |
F | Extensión estándar para coma flotante de precisión simple | 2.2 | Ratificado | 26 ( RV32 ) 30 ( RV64 ) |
D | Extensión estándar para coma flotante de doble precisión | 2.2 | Ratificado | 26 ( RV32 ) 32 ( RV64 ) |
Zicsr | Instrucciones del registro de control y estado (CSR) | 2.0 | Ratificado | 6 |
Cercas de zimbabve | Valla de búsqueda de instrucciones | 2.0 | Ratificado | 1 |
GRAMO | Abreviatura de la base y extensiones de IMAFD_Zicsr_Zifencei [2] : 129 | — | — | |
Q | Extensión estándar para coma flotante de precisión cuádruple | 2.2 | Ratificado | 28 ( RV32 ) 32 ( RV64 ) |
yo | Extensión estándar para coma flotante decimal | 0.0 | Abierto | |
do | Extensión estándar para instrucciones comprimidas | 2.0 | Ratificado | 40 |
B | Extensión estándar para manipulación de bits | 1.0 | Ratificado | 43 [47] |
Yo | Extensión estándar para idiomas traducidos dinámicamente | 0.0 | Abierto | |
yo | Extensión estándar para memoria transaccional | 0.0 | Abierto | |
PAG | Extensión estándar para instrucciones SIMD empaquetadas | 0.9.10 | Abierto | |
V | Extensión estándar para operaciones vectoriales | 1.0 | Ratificado | 187 [48] |
Zk | Extensión estándar para criptografía escalar | 1.0.1 | Ratificado | 49 [49] |
yo | Extensión estándar para hipervisor | 1.0 | Ratificado | 15 |
S | Extensión estándar para instrucciones de nivel supervisor | 1.12 | Ratificado | 4 |
Zam | Atómicos desalineados | 0,1 | Abierto | |
Pausa de cierre | Sugerencia de pausa | 2.0 | Ratificado | |
Zihintntl | Pistas de localidad no temporal | 0.3 | Ratificado | |
Zfa | Instrucciones adicionales de punto flotante | 1.0 | Ratificado | |
Zfh | Punto flotante de media precisión | 1.0 | Ratificado | |
Zfhmin | Punto flotante de media precisión mínima | 1.0 | Ratificado | |
Zfinx | Punto flotante de precisión simple en registro entero | 1.0 | Ratificado | |
Zdinx | Coma flotante de doble precisión en registro entero | 1.0 | Ratificado | |
Zhinx | Punto flotante de media precisión en registro entero | 1.0 | Ratificado | |
Zhinxmin | Número de punto flotante de precisión media mínima en un registro entero | 1.0 | Ratificado | |
Zmmul | Subconjunto de multiplicación de la extensión M | 1.0 | Ratificado | |
Ztso | Pedido total de la tienda | 1.0 | Ratificado |
Formato | Poco | |||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 | 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
Registrarse/registrarse | función7 | rs2 | rs1 | función3 | tercer | código de operación | ||||||||||||||||||||||||||
Inmediato | imm[11:0] | rs1 | función3 | tercer | código de operación | |||||||||||||||||||||||||||
Almacenar | imm[11:5] | rs2 | rs1 | función3 | imm[4:0] | código de operación | ||||||||||||||||||||||||||
Rama | [12] | imm[10:5] | rs2 | rs1 | función3 | imm[4:1] | [11] | código de operación | ||||||||||||||||||||||||
Superior inmediato | imm[31:12] | tercer | código de operación | |||||||||||||||||||||||||||||
Saltar | [20] | imm[10:1] | [11] | imm[19:12] | tercer | código de operación | ||||||||||||||||||||||||||
|
Para nombrar las combinaciones de funciones que se pueden implementar, se define una nomenclatura para especificarlas en el Capítulo 27 de la Especificación ISA sin privilegios ratificada actual. Primero se especifica la base del conjunto de instrucciones, la codificación para RISC-V, el ancho de bits del registro y la variante; por ejemplo, RV64I o RV32E . Luego siguen letras que especifican extensiones implementadas, en el orden de la tabla anterior. Cada letra puede ir seguida de una opción mayor seguida opcionalmente de "p" y un número de opción menor. El valor predeterminado es 0 si no hay un número de versión menor y 1.0 si no hay ningún número de versión. Por lo tanto, RV64IMAFD puede escribirse como RV64I1p0M1p0A1p0F1p0D1p0 o simplemente como RV64I1M1A1F1D1 . Se pueden usar guiones bajos entre extensiones para facilitar la lectura, por ejemplo RV32I2_M2_A2 .
Los cálculos básicos, de números enteros extendidos y de punto flotante, con primitivas de sincronización para computación multinúcleo, se consideran necesarios para la computación de propósito general, y por eso tenemos la abreviatura "G".
Una computadora pequeña de 32 bits para un sistema integrado podría ser RV32EC . Una computadora grande de 64 bits podría ser RV64GC , es decir, RV64IMAFDCZicsr_Zifencei .
Con el crecimiento en el número de extensiones, el estándar ahora permite que las extensiones se denominen con una sola "Z" seguida de un nombre alfabético y un número de versión opcional. Por ejemplo, Zifencei nombra la extensión de obtención de instrucciones. Zifencei2 y Zifencei2p0 nombran la versión 2.0 de la misma. La primera letra después de la "Z" por convención indica la categoría de extensión alfabética más relacionada, IMAFDQLCBJTPVN . Por lo tanto, la extensión Zam para átomos desalineados se relaciona con la extensión estándar "A". A diferencia de las extensiones de un solo carácter, las extensiones Z deben separarse con guiones bajos, agruparse por categoría y luego alfabéticamente dentro de cada categoría. Por ejemplo, Zicsr_Zifencei_Zam .
Las extensiones específicas del nivel de privilegios de supervisor se nombran de la misma manera, utilizando "S" como prefijo. Las extensiones específicas del nivel de hipervisor se nombran utilizando "H" como prefijo. Las extensiones de nivel de máquina tienen como prefijo las tres letras "Zxm". Las extensiones de conjunto de instrucciones de nivel de supervisor, hipervisor y máquina reciben el nombre de extensiones con menos privilegios.
Los desarrolladores de RISC-V pueden crear sus propias extensiones de conjuntos de instrucciones no estándar. Estas siguen la convención de nombres "Z", pero con "X" como prefijo. Deben especificarse después de todas las extensiones estándar y, si se enumeran varias extensiones no estándar, deben enumerarse en orden alfabético.
Se están discutiendo perfiles y plataformas para las listas de elección estándar de ISA.
... Esta flexibilidad se puede utilizar para optimizar en gran medida un diseño especializado al incluir solo el conjunto exacto de características ISA requeridas para una aplicación, pero la misma flexibilidad también conduce a una explosión combinatoria en posibles opciones ISA. Los perfiles especifican un conjunto común mucho más pequeño de opciones ISA que capturan el mayor valor para la mayoría de los usuarios y que, por lo tanto, permiten a la comunidad de software concentrar los recursos en la construcción de un rico ecosistema de software. [50]
La especificación de plataforma define un conjunto de plataformas que especifican los requisitos de interoperabilidad entre software y hardware. La política de plataforma define los distintos términos utilizados en esta especificación de plataforma. La política de plataforma también proporciona los detalles necesarios sobre el alcance, la cobertura, la denominación, el control de versiones, la estructura, el ciclo de vida y las reivindicaciones de compatibilidad para la especificación de plataforma. [51]
Registrar nombre | Nombre simbólico | Descripción | Salvado por |
---|---|---|---|
32 registros enteros | |||
x0 | cero | Siempre cero | |
x1 | real academia de bellas artes | Dirección del remitente | Llamador |
x2 | es | Puntero de pila | Destinatario |
x3 | médico de cabecera | Puntero global | |
x4 | por favor | Puntero de hilo | |
x5 | Para | Dirección de devolución temporal o alternativa | Llamador |
x6–7 | t1–2 | Temporales | Llamador |
x8 | s0/fp | Puntero de registro/marco guardado | Destinatario |
x9 | s1 | Registro guardado | Destinatario |
x10–11 | a0–1 | Argumentos de función / valores de retorno | Llamador |
x12–17 | a2–7 | Argumentos de función | Llamador |
x18–27 | t2–11 | Registros guardados | Destinatario |
x28–31 | t3–6 | Temporales | Llamador |
32 registros de extensión de punto flotante | |||
f0–7 | pies 0–7 | Temporales de punto flotante | Llamador |
f8–9 | fs0–1 | Registros guardados en coma flotante | Destinatario |
f10–11 | fa0–1 | Argumentos de punto flotante/valores de retorno | Llamador |
f12–17 | fa2–7 | Argumentos de punto flotante | Llamador |
f18–27 | fs2–11 | Registros guardados en coma flotante | Destinatario |
f28–31 | pies8–11 | Temporales de punto flotante | Llamador |
RISC-V tiene 32 registros enteros (o 16 en la variante incorporada), [2] : 13, 33 y cuando se implementa la extensión de punto flotante, 32 registros de punto flotante adicionales . [2] : 63 A excepción de las instrucciones de acceso a memoria, las instrucciones solo abordan registros .
El primer registro entero es un registro cero y el resto son registros de uso general. Un almacenamiento en el registro cero no tiene ningún efecto y una lectura siempre proporciona 0. El uso del registro cero como marcador de posición permite obtener un conjunto de instrucciones más simple.
Existen registros de control y de estado, pero los programas en modo usuario solo pueden acceder a aquellos que se utilizan para la medición del rendimiento y la gestión de punto flotante.
No existen instrucciones para guardar y restaurar múltiples registros. Se pensaba que eran innecesarias, demasiado complejas y quizás demasiado lentas. [25]
Al igual que muchos diseños RISC, RISC-V es una arquitectura de carga-almacenamiento : las instrucciones se dirigen únicamente a los registros, mientras que las instrucciones de carga y almacenamiento transmiten datos hacia y desde la memoria.
La mayoría de las instrucciones de carga y almacenamiento incluyen un desplazamiento de 12 bits y dos identificadores de registro. Un registro es el registro base. El otro registro es el destino (para una carga) o la fuente (para un almacenamiento).
El desplazamiento se suma a un registro base para obtener la dirección. [2] : 24 La formación de la dirección como un registro base más el desplazamiento permite que instrucciones individuales accedan a las estructuras de datos. Por ejemplo, si el registro base apunta a la parte superior de una pila, instrucciones individuales pueden acceder a las variables locales de una subrutina en la pila. Del mismo modo, las instrucciones de carga y almacenamiento pueden acceder a una estructura de estilo de registro o a un dispositivo de E/S mapeado en memoria. El uso del registro cero constante como dirección base permite que instrucciones individuales accedan a la memoria cerca de la dirección cero.
La memoria se direcciona como bytes de 8 bits, con instrucciones en orden little-endian , [2] : 9–10 y con datos en el orden de bytes definido por la interfaz del entorno de ejecución en el que se ejecuta el código. [2] : 3, 9–10, Se puede acceder a 24 palabras, hasta el tamaño del registro, con las instrucciones de carga y almacenamiento.
RISC-V se especificó originalmente como little-endian para parecerse a otras computadoras conocidas y exitosas, por ejemplo, x86 . [2] : 9–10 Esto también reduce la complejidad de una CPU y cuesta un poco menos porque lee todos los tamaños de palabras en el mismo orden. Por ejemplo, el conjunto de instrucciones RISC-V decodifica comenzando en el byte de dirección más baja de la instrucción. Las variantes big-endian y bi-endian se definieron para admitir bases de código heredadas que asumen big-endianness. [2] : 9–10 La ISA privilegiada define bits en los registros mstatus y mstatush que indican y, opcionalmente, controlan si los accesos a la memoria en modo M, modo S y modo U que no sean búsquedas de instrucciones son little-endian o big-endian; esos bits pueden ser de solo lectura, en cuyo caso el endianness de la implementación está cableado, o pueden ser escribibles. [3] : 23–24
Una interfaz de entorno de ejecución puede permitir que las direcciones de memoria a las que se accede no estén alineadas con su ancho de palabra, pero los accesos a direcciones alineadas pueden ser más rápidos; por ejemplo, las CPU simples pueden implementar accesos no alineados con una emulación de software lenta impulsada por una interrupción por falla de alineación . [2] : 3, 24–25
Al igual que muchos conjuntos de instrucciones RISC (y algunos conjuntos de instrucciones de computadoras con conjuntos de instrucciones complejos (CISC), como x86 e IBM System/360 y sus sucesores hasta z/Architecture ), RISC-V carece de modos de dirección que escriban en los registros. Por ejemplo, no se incrementa automáticamente. [2] : 24
RISC-V administra los sistemas de memoria que se comparten entre CPU o subprocesos al garantizar que un subproceso de ejecución siempre vea sus operaciones de memoria en el orden programado. Pero entre subprocesos y dispositivos de E/S, RISC-V se simplifica: no garantiza el orden de las operaciones de memoria, excepto mediante instrucciones específicas, como fence
.
Una fence
instrucción garantiza que los resultados de las operaciones predecesoras sean visibles para las operaciones sucesoras de otros subprocesos o dispositivos de E/S. fence
Puede garantizar el orden de las combinaciones de operaciones de E/S de memoria y mapeadas en memoria. Por ejemplo, puede separar las operaciones de lectura y escritura de memoria, sin afectar las operaciones de E/S. O bien, si un sistema puede operar dispositivos de E/S en paralelo con la memoria, fence
no los obliga a esperarse entre sí. Una CPU con un subproceso puede decodificar fence
como nop
.
Algunas CPU RISC (como MIPS , PowerPC , DLX y RISC-I de Berkeley) colocan 16 bits de desplazamiento en las cargas y los almacenamientos. Establecen los 16 bits superiores mediante una instrucción de carga de palabra superior . Esto permite que los valores de la mitad superior de la palabra se establezcan fácilmente, sin cambiar bits. Sin embargo, la mayoría del uso de la instrucción de la mitad superior de la palabra crea constantes de 32 bits, como direcciones. RISC-V utiliza una combinación similar a SPARC de desplazamientos de 12 bits e instrucciones de configuración de palabra superior de 20 bits . El desplazamiento más pequeño de 12 bits ayuda a compactar, las instrucciones de carga y almacenamiento de 32 bits seleccionan dos de los 32 registros y aún tienen suficientes bits para admitir la codificación de instrucciones de longitud variable de RISC-V. [2] : 16
RISC-V maneja constantes y direcciones de 32 bits con instrucciones que configuran los 20 bits superiores de un registro de 32 bits. La carga inmediata superior carga lui
20 bits en los bits 31 a 12. Luego, una segunda instrucción como addi
puede configurar los 12 bits inferiores. Se pueden formar números o direcciones pequeños utilizando el registro cero en lugar de lui
.
Este método se amplía para permitir código independiente de la posición añadiendo una instrucción auipc
que genera 20 bits de dirección superior añadiendo un desplazamiento al contador del programa y almacenando el resultado en un registro base. Esto permite que un programa genere direcciones de 32 bits relativas al contador del programa.
El registro base se puede utilizar a menudo tal como está con los desplazamientos de 12 bits de las cargas y los almacenamientos. Si es necesario, addi
se pueden establecer los 12 bits inferiores de un registro. En las ISA de 64 y 128 bits, se lui
puede auipc
extender el signo del resultado para obtener la dirección más grande. [2] : 37
Algunas CPU rápidas pueden interpretar combinaciones de instrucciones como instrucciones fusionadas individuales , lui
o auipc
son buenos candidatos para fusionarse con jalr
, addi
, cargan o almacenan.
La llamada a subrutina de RISC-V jal
(saltar y enlazar) coloca su dirección de retorno en un registro. Esto es más rápido en muchos diseños de computadoras, porque ahorra un acceso a la memoria en comparación con los sistemas que insertan una dirección de retorno directamente en una pila en la memoria. jal
tiene un desplazamiento de 20 bits con signo ( complemento a dos ). El desplazamiento se multiplica por 2 y luego se suma al PC (contador de programa) para generar una dirección relativa a una instrucción de 32 bits. Si la dirección resultante no está alineada con 32 bits (es decir, es divisible por 4), la CPU puede forzar una excepción . [2] : 20–23, Sección 2.5
Las CPU RISC-V saltan a direcciones calculadas mediante una instrucción de salto y enlace de registro . jalr
es jalr
similar a jal
, pero obtiene su dirección de destino agregando un desplazamiento de 12 bits a un registro base. (En contraste, jal
agrega un desplazamiento mayor de 20 bits a la PC).
jalr
El formato de bits de es como las cargas y los almacenamientos relativos a registros. Al igual que ellos, jalr
se puede utilizar con las instrucciones que establecen los 20 bits superiores de un registro base para realizar ramificaciones de 32 bits, ya sea a una dirección absoluta (usando lui
) o a una relativa a PC (usando auipc
para código independiente de la posición). (El uso de una dirección base cero constante permite llamadas de instrucción única a una dirección fija positiva o negativa pequeña (el desplazamiento).
RISC-V recicla jal
y jalr
obtiene saltos incondicionales relativos a PC de 20 bits y saltos incondicionales basados en registros de 12 bits. Los saltos simplemente hacen que el registro de enlace sea 0, de modo que no se guarda ninguna dirección de retorno. [2] : 20–23, Sección 2.5
RISC-V también recicla jalr
para regresar desde una subrutina: para hacer esto, jalr
el registro base de se establece para que sea el registro de enlace guardado por jal
o jalr
. jalr
El desplazamiento de es cero y el registro de enlace es cero, de modo que no hay desplazamiento y no se guarda ninguna dirección de retorno.
Al igual que muchos diseños RISC, en una llamada de subrutina, un compilador RISC-V debe usar instrucciones individuales para guardar registros en la pila al inicio y luego restaurarlos desde la pila al salir. RISC-V no tiene instrucciones para guardar o restaurar múltiples registros. Se pensaba que estas hacían que la CPU fuera demasiado compleja y posiblemente lenta. [52] Esto puede ocupar más espacio de código. Los diseñadores planearon reducir el tamaño del código con rutinas de biblioteca para guardar y restaurar registros. [53]
RISC-V no tiene registro de código de condición ni bit de acarreo . Los diseñadores creían que los códigos de condición hacen que las CPU rápidas sean más complejas al forzar interacciones entre instrucciones en diferentes etapas de ejecución. Esta elección hace que la aritmética de precisión múltiple sea más compleja. Además, algunas tareas numéricas necesitan más energía. Como resultado, no se admite la predicción (la ejecución condicional de instrucciones). Los diseñadores afirman que los diseños de CPU muy rápidos y fuera de orden hacen la predicción de todos modos, haciendo la rama de comparación y el código condicional en paralelo, y luego descartando los efectos de la ruta no utilizada. También afirman que incluso en CPU más simples, la predicción es menos valiosa que la predicción de rama , que puede evitar la mayoría de los bloqueos asociados con las ramas condicionales. El código sin predicación es más grande, con más ramas, pero también afirman que un conjunto de instrucciones comprimido (como el conjunto C de RISC-V ) resuelve ese problema en la mayoría de los casos. [25] [ verificación fallida ]
En cambio, RISC-V tiene ramas cortas que realizan comparaciones: igual, no igual, menor que, menor que sin signo, mayor o igual que y mayor o igual sin signo. Se implementan diez operaciones de comparación de ramas con solo seis instrucciones, invirtiendo el orden de los operandos en el ensamblador . Por ejemplo, la rama si es mayor que se puede realizar con menor que con un orden invertido de operandos. [2] : 20–23, Sección 2.5
Las ramas de comparación tienen un rango con signo de doce bits y saltan en relación con el PC. [2] : 20–23, Sección 2.5
A diferencia de algunas arquitecturas RISC, RISC-V no incluye una ranura de retardo de bifurcación , una posición después de una instrucción de bifurcación que se puede llenar con una instrucción que se ejecuta independientemente de si se toma o no la bifurcación. [2] : 20–23, Sección 2.5 RISC-V omite una ranura de retardo de bifurcación porque complica las CPU multiciclo, las CPU superescalares y las tuberías largas. Los predictores de bifurcaciones dinámicas han tenido suficiente éxito como para reducir la necesidad de bifurcaciones retrasadas. [25]
En el primer encuentro con una bifurcación, las CPU RISC-V deben asumir que se tomará una bifurcación relativa negativa (es decir, el bit de signo del desplazamiento es "1"). [2] : 20–23, Sección 2.5 Esto supone que una bifurcación hacia atrás es un bucle y proporciona una dirección predeterminada para que las CPU con canalización simple puedan completar su canalización de instrucciones. Aparte de esto, RISC-V no requiere predicción de bifurcaciones , pero las implementaciones principales pueden agregarla. RV32I reserva un espacio de instrucciones "HINT" que actualmente no contiene ninguna sugerencia sobre bifurcaciones; [2] : 28–29, Sección 2.9 RV64I hace lo mismo. [2] : 38–39, Sección 5.4
RISC-V segrega las matemáticas en un conjunto mínimo de instrucciones de números enteros (conjunto I ) con suma, resta, desplazamiento, lógica bit a bit y ramas de comparación. Estas pueden simular la mayoría de los otros conjuntos de instrucciones RISC-V con software. (Las instrucciones atómicas son una excepción notable). Las instrucciones de números enteros RISC-V carecen de las operaciones de conteo de ceros a la izquierda y de campo de bits que normalmente se usan para acelerar el punto flotante de software en un procesador de números enteros puros. Sin embargo, aunque nominalmente están en la extensión de manipulación de bits, las extensiones ratificadas Zbb, Zba y Zbs contienen más instrucciones de números enteros, incluida una instrucción de conteo de ceros a la izquierda.
Las instrucciones de multiplicación de números enteros (conjunto M ) incluyen multiplicación y división con y sin signo. Se incluyen multiplicaciones y divisiones de números enteros de doble precisión, como multiplicaciones y divisiones que producen la palabra alta del resultado. El documento ISA recomienda que los implementadores de CPU y compiladores fusionen una secuencia estandarizada de instrucciones de multiplicación y división altas y bajas en una sola operación, si es posible. [2] : 43–45
Las instrucciones de punto flotante (conjunto F ) incluyen aritmética de precisión simple y también ramas de comparación similares a la aritmética de números enteros. Requiere un conjunto adicional de 32 registros de punto flotante. Estos son independientes de los registros de números enteros. Las instrucciones de punto flotante de doble precisión (conjunto D ) generalmente suponen que los registros de punto flotante son de 64 bits (es decir, de doble ancho), y el subconjunto F está coordinado con el conjunto D. También se define una ISA de punto flotante de 128 bits de precisión cuádruple ( Q ). [2] : 63–82 Las computadoras RISC-V sin punto flotante pueden usar una biblioteca de software de punto flotante.
RISC-V no causa excepciones en errores aritméticos, incluyendo desbordamiento , [2] : 17–20 subdesbordamiento, subnormal y división por cero. [2] : 44–45 En cambio, tanto la aritmética de enteros como la de punto flotante producen valores predeterminados razonables, y las instrucciones de punto flotante establecen bits de estado. [2] : 66 La división por cero puede ser descubierta por una rama después de la división. [2] : 44–45 Los bits de estado pueden ser probados por un sistema operativo o una interrupción periódica.
RISC-V admite computadoras que comparten memoria entre múltiples CPU y subprocesos . El modelo de consistencia de memoria estándar de RISC-V es la consistencia de liberación . Es decir, las cargas y los almacenamientos generalmente se pueden reordenar, pero algunas cargas se pueden designar como operaciones de adquisición que deben preceder a los accesos de memoria posteriores, y algunos almacenamientos se pueden designar como operaciones de liberación que deben seguir a los accesos de memoria anteriores. [2] : 83–94
El conjunto de instrucciones base incluye un soporte mínimo en forma de una fence
instrucción para hacer cumplir el orden de la memoria. [2] : 26–27 Aunque esto es suficiente ( fence r, rw
proporciona adquisición y fence rw, w
proporciona liberación ), las operaciones combinadas pueden ser más eficientes. [2] : Capítulo 8
La extensión de operaciones de memoria atómica admite dos tipos de operaciones de memoria atómica para lograr la coherencia de la liberación. En primer lugar, proporciona instrucciones de uso general reservadas para la carga lr
y de almacenamiento condicional sc
lr
. Realiza una carga e intenta reservar esa dirección para su hilo. sc
Se realizará un almacenamiento condicional posterior a la dirección reservada solo si la reserva no se interrumpe por un almacenamiento intermedio de otra fuente. Si el almacenamiento tiene éxito, se coloca un cero en un registro. Si falla, un valor distinto de cero indica que el software debe volver a intentar la operación. En cualquier caso, se libera la reserva. [2] : Capítulo 8
El segundo grupo de instrucciones atómicas realiza secuencias de lectura-modificación-escritura : una carga (que opcionalmente es una carga-adquisición) a un registro de destino, luego una operación entre el valor cargado y un registro de origen, luego un almacenamiento del resultado (que opcionalmente puede ser un almacenamiento-liberación). Hacer que las barreras de memoria sean opcionales permite combinar las operaciones. Las operaciones opcionales se habilitan mediante bits de adquisición y liberación que están presentes en cada instrucción atómica. RISC-V define nueve operaciones posibles: swap (utilizar el valor del registro de origen directamente); add; and, or y or exclusivo a nivel de bit; y mínimo y máximo con y sin signo. [2] : Capítulo 8
Un diseño de sistema puede optimizar estas operaciones combinadas más que lr
y sc
. Por ejemplo, si el registro de destino para un intercambio es la constante cero, se puede omitir la carga. Si el valor almacenado no se ha modificado desde la carga, se puede omitir el almacenamiento. [15] : 44
El IBM System/370 y sus sucesores, incluidos z/Architecture y x86 , implementan una instrucción compare-and-swap ( ), que prueba y actualiza condicionalmente una ubicación en la memoria: si la ubicación contiene un valor antiguo esperado, lo reemplaza con un nuevo valor dado; luego devuelve una indicación de si realizó el cambio. Sin embargo, generalmente se realiza una instrucción simple de tipo carga antes de la para obtener el valor antiguo. El problema clásico es que si un hilo lee (carga) un valor A , calcula un nuevo valor C y luego usa ( ) para reemplazar A con C , no tiene forma de saber si la actividad concurrente en otro hilo ha reemplazado A con algún otro valor B y luego restauró el A en el medio. En algunos algoritmos (por ejemplo, aquellos en los que los valores en la memoria son punteros a bloques asignados dinámicamente), este problema ABA puede conducir a resultados incorrectos. La solución más común emplea una instrucción de doble ancho para actualizar tanto el puntero como un contador adyacente; Desafortunadamente, este tipo de instrucción requiere un formato de instrucción especial para especificar múltiples registros, realiza varias lecturas y escrituras y puede tener una operación de bus compleja. [2] : 48–49 cas
cas
cas
cas
cas
La alternativa lr
/ sc
es más eficiente. Normalmente requiere sólo una carga de memoria, y es deseable minimizar las operaciones de memoria lentas. También es exacta: controla todos los accesos a la celda de memoria, en lugar de sólo asegurar un patrón de bits. Sin embargo, a diferencia de cas
, puede permitir livelock , en el que dos o más hilos hacen que las instrucciones de cada uno fallen repetidamente. RISC-V garantiza el progreso hacia adelante (sin livelock) si el código sigue reglas sobre el tiempo y la secuencia de instrucciones: 1) Debe utilizar sólo el subconjunto I. 2) Para evitar errores de caché repetitivos, el código (incluido el bucle de reintentos) no debe ocupar más de 16 instrucciones consecutivas. 3) No debe incluir instrucciones de sistema o de valla, o ramas hacia atrás tomadas entre y lr
. sc
4) La rama hacia atrás al bucle de reintentos debe ser a la secuencia original. [2] : 48–49
La especificación proporciona un ejemplo de cómo utilizar las instrucciones atómicas de lectura-modificación-escritura para bloquear una estructura de datos. [2] : 54
El estándar RISC-V ISA especifica que todas las instrucciones son de 32 bits. Esto hace que la implementación sea particularmente sencilla, pero al igual que otros procesadores RISC con codificación de instrucciones de 32 bits, da como resultado un tamaño de código mayor que en conjuntos de instrucciones con instrucciones de longitud variable. [2] : 99 [52]
Para compensar, las instrucciones de 32 bits de RISC-V son en realidad de 30 bits; 3 ⁄ 4 del espacio del código de operación se reserva para un conjunto de instrucciones comprimidas de longitud variable opcional (pero recomendado) , RVC, que incluye instrucciones de 16 bits. Al igual que en ARM Thumb y MIPS16 , las instrucciones comprimidas son simplemente codificaciones alternativas para un subconjunto de las instrucciones más grandes. A diferencia de los conjuntos comprimidos ARM o MIPS, el espacio se reservó desde el principio, por lo que no hay un modo operativo separado. Las instrucciones estándar y comprimidas se pueden mezclar libremente. [2] : 97 [52] (La letra de extensión es C .) [2] : 97
Debido a que (como Thumb-1 y MIPS16) las instrucciones comprimidas son simplemente codificaciones alternativas (alias) para un subconjunto seleccionado de instrucciones más grandes, la compresión se puede implementar en el ensamblador y no es esencial que el compilador siquiera lo sepa.
En 2011 se probó un prototipo de RVC. [52] El código del prototipo era un 20% más pequeño que un código comprimido MIPS y de PC x86 , y un 2% más grande que el código ARM Thumb-2 . [52] También redujo sustancialmente tanto la memoria caché necesaria como el uso estimado de energía del sistema de memoria. [52]
El investigador pretendía reducir el tamaño binario del código para ordenadores pequeños, especialmente sistemas informáticos embebidos . El prototipo incluía 33 de las instrucciones más utilizadas, recodificadas como formatos compactos de 16 bits utilizando códigos de operación previamente reservados para el conjunto comprimido. [52] La compresión se realizó en el ensamblador , sin cambios en el compilador. Las instrucciones comprimidas omitieron campos que a menudo son cero, utilizaron valores inmediatos pequeños o accedieron a subconjuntos (16 u 8) de los registros. addi
es muy común y a menudo comprimible. [52]
Gran parte de la diferencia de tamaño en comparación con el conjunto Thumb de ARM se produjo porque RISC-V y el prototipo no tienen instrucciones para guardar y restaurar múltiples registros. En su lugar, el compilador generó instrucciones convencionales que acceden a la pila. El ensamblador RVC del prototipo a menudo las convirtió a formas comprimidas que tenían la mitad del tamaño. Sin embargo, esto todavía ocupaba más espacio de código que las instrucciones ARM que guardan y restauran múltiples registros. El investigador propuso modificar el compilador para llamar a rutinas de biblioteca para guardar y restaurar registros. Estas rutinas tenderían a permanecer en una caché de código y, por lo tanto, se ejecutarían rápidamente, aunque probablemente no tan rápido como una instrucción de guardar múltiples registros. [52]
El RVC estándar requiere el uso ocasional de instrucciones de 32 bits. Se han completado varias propuestas de RVC no estándar, que no requieren instrucciones de 32 bits y se dice que tienen densidades más altas que el RVC estándar. [54] [55] Otra propuesta se basa en estas y afirma que también utiliza un rango de codificación menor. [56]
Un conjunto de instrucciones para las CPU integradas más pequeñas (conjunto E) se reduce de otras maneras: solo se admiten 16 de los 32 registros enteros. [2] : Capítulo 4 Se pueden utilizar todas las extensiones actuales; se está considerando una extensión de punto flotante para utilizar los registros enteros para valores de punto flotante. El conjunto de instrucciones privilegiadas solo admite el modo de máquina, el modo de usuario y los esquemas de memoria que utilizan la reubicación de direcciones de base y límite. [3]
Se ha discutido la posibilidad de crear un perfil de microcontrolador para RISC-V, con el fin de facilitar el desarrollo de sistemas profundamente integrados. El objetivo es ofrecer un soporte más rápido y sencillo en lenguaje C para interrupciones, modos de seguridad simplificados y una interfaz binaria de aplicación POSIX simplificada. [57]
Los corresponsales también han propuesto ISA RV16E de 16 bits más pequeñas y no estándar : varias propuestas serias utilizarían las instrucciones C de 16 bits con registros de 8 × 16 bits. [55] [54] Una broma del Día de los Inocentes propuso una disposición muy práctica: utilizar registros enteros de 16 × 16 bits, con las ISA EIMC estándar (incluidas las instrucciones de 32 bits). La broma era utilizar la conmutación de bancos cuando una CPU de 32 bits sería claramente superior con el espacio de direcciones más grande. [58]
La ISA de RISC-V incluye una especificación de conjunto de instrucciones privilegiadas independiente, que describe principalmente tres niveles de privilegio más un modo de hipervisor ortogonal. A partir de diciembre de 2021 [actualizar], la versión 1.12 está ratificada por RISC-V International. [3]
La versión 1.12 de la especificación admite varios tipos de sistemas informáticos:
Estos corresponden aproximadamente a sistemas con hasta cuatro anillos de privilegios y seguridad, como máximo: máquina, hipervisor, supervisor y usuario. También se espera que cada capa tenga una fina capa de software de soporte estandarizado que se comunique con una capa más privilegiada, o hardware. [3]
El ISA también incluye un modo de hipervisor que es ortogonal a los modos de usuario y supervisor. [59] La característica básica es un bit de configuración que permite que el código de nivel de supervisor acceda a los registros del hipervisor o causa una interrupción en los accesos. Este bit permite que el modo de supervisor maneje directamente el hardware que necesita un hipervisor. Esto simplifica la implementación de hipervisores que están alojados en un sistema operativo. Este es un modo popular para ejecutar computadoras a escala de almacén. Para admitir hipervisores no alojados, el bit puede hacer que estos accesos interrumpan a un hipervisor. El diseño también simplifica la anidación de hipervisores, en la que un hipervisor se ejecuta debajo de un hipervisor y, si es necesario, permite que el núcleo use las características del hipervisor dentro de su propio código de núcleo. Como resultado, la forma de hipervisor del ISA admite cinco modos: máquina, supervisor, usuario, supervisor bajo hipervisor y usuario bajo supervisor.
La especificación del conjunto de instrucciones privilegiadas define explícitamente los subprocesos de hardware o harts . Los subprocesos de hardware múltiples son una práctica común en computadoras con más capacidad. Cuando un subproceso se detiene, esperando memoria, otros pueden continuar. Los subprocesos de hardware pueden ayudar a hacer un mejor uso de la gran cantidad de registros y unidades de ejecución en CPU rápidas fuera de servicio. Finalmente, los subprocesos de hardware pueden ser una forma simple y poderosa de manejar interrupciones : no se requiere guardar ni restaurar registros, simplemente se ejecuta un subproceso de hardware diferente. Sin embargo, el único subproceso de hardware requerido en una computadora RISC-V es el subproceso cero. [3]
Las interrupciones y las excepciones se manejan juntas. Las excepciones son causadas por la ejecución de instrucciones, incluidas instrucciones ilegales y llamadas al sistema, mientras que las interrupciones son causadas por eventos externos. Las definiciones de registros de control y estado existentes admiten las excepciones de error y memoria de RISC-V, y una pequeña cantidad de interrupciones, generalmente a través de un "interruptor local de núcleo avanzado" (ACLINT). [60] Para sistemas con más interrupciones, la especificación también define un controlador de interrupciones a nivel de plataforma (PLIC) para coordinar una gran cantidad de interrupciones entre múltiples procesadores. Las interrupciones siempre comienzan en el nivel de máquina con más privilegios, y los registros de control de cada nivel tienen bits de reenvío explícitos para enrutar las interrupciones al código con menos privilegios. Por ejemplo, el hipervisor no necesita incluir software que se ejecute en cada interrupción para reenviar una interrupción a un sistema operativo. En cambio, en la configuración, puede establecer bits para reenviar la interrupción. [3]
La especificación admite varios sistemas de memoria. El sistema de memoria física es adecuado para los sistemas integrados más simples. También hay cuatro sistemas de memoria virtual de estilo UNIX para la memoria almacenada en caché en sistemas de almacenamiento masivo. Los sistemas de memoria virtual admiten MMU con cuatro tamaños, con direcciones de 32, 39, 48 y 57 bits. Todos los sistemas de memoria virtual admiten páginas de 4 KiB, árboles de tablas de páginas de varios niveles y utilizan algoritmos muy similares para recorrer los árboles de tablas de páginas. Todos están diseñados para recorrer las tablas de páginas por hardware o software. Para reducir opcionalmente el costo de los recorridos por las tablas de páginas, las páginas de gran tamaño pueden ser páginas hoja en niveles superiores del árbol de tablas de páginas de un sistema. SV32 solo se admite en implementaciones de 32 bits, tiene un árbol de tablas de páginas de dos capas y admite superpáginas de 4 MiB. SV39 tiene una tabla de páginas de tres niveles y admite superpáginas de 2 MiB y gigapáginas de 1 GiB. SV48 es necesario para admitir SV39. También tiene una tabla de páginas de 4 niveles y admite superpáginas de 2 MiB, gigapáginas de 1 GiB y terapáginas de 512 GiB. SV57 tiene una tabla de páginas de 5 niveles y admite superpáginas de 2 MiB, gigapáginas de 1 GiB, terapáginas de 512 GiB y petapáginas de 256 TiB. Las superpáginas se alinean en los límites de página para el siguiente tamaño de página más bajo. [3]
Algunas extensiones de manipulación de bits de la ISA fueron ratificadas en noviembre de 2021 (Zba, Zbb, Zbc, Zbs). [47] Las extensiones Zba, Zbb y Zbs son posiblemente extensiones de las instrucciones de enteros I estándar: Zba contiene instrucciones para acelerar el cálculo de las direcciones de los elementos de la matriz en matrices de tipos de datos de tamaño 2, 4 u 8 bytes (sh1add, sh2add, sh3add), y para procesadores de 64 (y 128) bits cuando se indexan con enteros sin signo (add.uw, sh1add.uw, sh2add.uw, sh3add.uw y slli.uw). Las instrucciones Zbb contienen operaciones para contar los bits 0 iniciales y finales o todos los bits 1 en un registro completo y operaciones de 32 palabras (clz, clzw, ctz, ctzw, cpop, cpopw), reversión del orden de bytes (rev8), instrucciones lógicas con negación de la segunda entrada (andn, orn, xnor), extensión de signo y cero (sext.b, sext.h, zext.h) que no se pudieron proporcionar como casos especiales de otras instrucciones (andi, addiw, add.wu), mínimo y máximo de números enteros (con y sin signo), rotación (izquierda y derecha) de bits en un registro y palabras de 32 bits (rori, roriw, ror, rorw, rol, rolw), y una operación "o combinar" byte por byte que permite la detección de un byte cero en un registro completo, útil para manejar funciones de cadenas terminadas en nulo estilo C. La extensión Zbs permite configurar, obtener, borrar y alternar bits individuales en un registro por su índice (bseti, bset, bexti, bext, bclri, bclr, binvi, binv).
La extensión Zbc tiene instrucciones para la "multiplicación sin acarreo", que realiza la multiplicación de polinomios sobre el campo de Galois GF(2) (clmul, clmulh, clmulr). Estas son útiles para criptografía y comprobaciones CRC de la integridad de los datos.
Si se hace bien, un subconjunto de manipulación de bits más especializado puede ayudar a las operaciones criptográficas, gráficas y matemáticas. Otras instrucciones que se han analizado incluyen instrucciones para desplazar en unos, una inversión de bits generalizada, permutaciones aleatorias y de barra cruzada, colocación de campos de bits, extracción y depósito de paquetes de dos palabras, bytes o medias palabras en un registro, instrucciones CRC, operaciones de matriz de bits (solo RV64), mezcla condicional, movimiento condicional, desplazamientos de embudo. Los criterios de inclusión documentados en el borrador fueron el cumplimiento de las filosofías RISC-V y los formatos ISA, mejoras sustanciales en la densidad o velocidad del código (es decir, al menos una reducción de 3 por 1 en las instrucciones) y aplicaciones sustanciales en el mundo real, incluido el soporte de compiladores preexistente. La versión 0.93 de la extensión de manipulación de bits incluye esas instrucciones; [61] algunas de ellas están ahora en la versión 1.0.1 de la extensión de criptografía de instrucciones de fuente escalares y de entropía . [49]
Las instrucciones SIMD empaquetadas son ampliamente utilizadas por las CPU comerciales para acelerar de forma económica el procesamiento de señales digitales y multimedia . [25] Para sistemas RISC-V simples y de costo reducido, la especificación ISA base propuso utilizar los bits de los registros de punto flotante para realizar aritmética de subpalabras de instrucción única, múltiples datos ( SIMD ) en paralelo.
En 2017, un proveedor publicó una propuesta más detallada en la lista de correo, y esta puede citarse como la versión 0.1. [62] A partir de 2019 [actualizar], la eficiencia de esta ISA propuesta varía de 2x a 5x una CPU base para una variedad de códecs DSP. [63] La propuesta carecía de formatos de instrucciones y una asignación de licencia a RISC-V International, pero fue revisada por la lista de correo. [62] Algunas partes impopulares de esta propuesta fueron que agregó un código de condición, el primero en un diseño RISC-V, registros adyacentes vinculados (también una novedad) y tiene un contador de bucle que puede ser difícil de implementar en algunas microarquitecturas.
El conjunto de instrucciones de procesamiento vectorial propuesto puede hacer que el conjunto SIMD empaquetado quede obsoleto. Los diseñadores esperan tener suficiente flexibilidad para que una CPU pueda implementar instrucciones vectoriales en los registros de un procesador estándar. Esto permitiría implementaciones mínimas con un rendimiento similar al de una ISA multimedia, como la mencionada anteriormente. Sin embargo, un verdadero coprocesador vectorial podría ejecutar el mismo código con un rendimiento superior. [64]
A partir del 19 de septiembre de 2021 [actualizar], la extensión vectorial se encuentra en la versión 1.0. [65] Es un diseño conservador y flexible de un procesador vectorial de precisión mixta de propósito general, adecuado para ejecutar núcleos de cómputo . El código se podría trasladar fácilmente a CPU con diferentes longitudes de vector, idealmente sin recompilación. [64]
Por el contrario, las extensiones SIMD de vector corto son menos convenientes. Se utilizan en x86 , ARM y PA-RISC . En ellas, un cambio en el ancho de palabra obliga a un cambio en el conjunto de instrucciones para expandir los registros vectoriales (en el caso de x86, de registros MMX de 64 bits a extensiones Streaming SIMD (SSE) de 128 bits, a extensiones de vector avanzadas (AVX) de 256 bits y AVX-512 ). El resultado es un conjunto de instrucciones en crecimiento y la necesidad de trasladar el código funcional a las nuevas instrucciones.
En la ISA vectorial RISC-V, en lugar de fijar la longitud del vector en la arquitectura, están disponibles las instrucciones ( vsetvli
, vsetivli
, y vsetvl
) que toman un tamaño solicitado y establecen la longitud del vector al mínimo del límite de hardware y el tamaño solicitado. Por lo tanto, la propuesta RISC-V se parece más a un diseño de vector largo de Cray o a la Extensión de Vector Escalable de ARM. Es decir, cada vector en hasta 32 vectores tiene la misma longitud. [65] : 25
La aplicación especifica el ancho total del vector que requiere, y el procesador determina la longitud del vector que puede proporcionar con los recursos disponibles en el chip. Esto toma la forma de una instrucción ( vsetcfg
) con cuatro operandos inmediatos, que especifican el número de registros vectoriales de cada ancho disponible necesarios. El total no debe ser mayor que el límite direccionable de 32, pero puede ser menor si la aplicación no los requiere todos. La longitud del vector está limitada por el almacenamiento disponible en el chip dividido por el número de bytes de almacenamiento necesarios para cada entrada. (También pueden existir límites de hardware adicionales, lo que a su vez puede permitir implementaciones de estilo SIMD). [64]
Fuera de los bucles vectoriales, la aplicación puede poner a cero el número de registros vectoriales solicitados, ahorrándole al sistema operativo el trabajo de preservarlos en los cambios de contexto . [64]
La longitud del vector no sólo es variable arquitectónicamente, sino que también está diseñada para variar en tiempo de ejecución. Para lograr esta flexibilidad, es probable que el conjunto de instrucciones utilice rutas de datos de ancho variable y operaciones de tipo variable utilizando sobrecarga polimórfica. [64] El plan es que esto pueda reducir el tamaño y la complejidad de la ISA y el compilador. [64]
Los procesadores vectoriales experimentales recientes con rutas de datos de ancho variable también muestran aumentos rentables en operaciones por segundo (velocidad), área (menor costo) y vatio (mayor duración de la batería). [66]
A diferencia de una unidad de procesamiento de gráficos moderna típica , no hay planes para proporcionar hardware especial para soportar la predicción de bifurcaciones . En su lugar, se utilizará una predicción basada en compiladores de menor costo. [64] [67]
Existe una especificación preliminar para el depurador asistido por hardware de RISC-V . El depurador utilizará un sistema de transporte como Joint Test Action Group ( JTAG ) o Universal Serial Bus ( USB ) para acceder a los registros de depuración. Una interfaz de depuración de hardware estándar puede admitir una interfaz abstracta estandarizada o la alimentación de instrucciones . [68] [69]
A partir de enero de 2017 [actualizar], la forma exacta de la interfaz abstracta sigue sin definirse, pero las propuestas incluyen un sistema mapeado en memoria con direcciones estandarizadas para los registros de dispositivos de depuración o un registro de comando y un registro de datos accesibles al sistema de comunicación. [68] Los corresponsales afirman que sistemas similares son utilizados por la interfaz de modo de depuración en segundo plano (BDM) de Freescale para algunas CPU, ARM , OpenRISC y LEON de Aeroflex . [68]
En la alimentación de instrucciones , la CPU procesará una excepción de depuración para ejecutar instrucciones individuales escritas en un registro. Esto se puede complementar con un registro de paso de datos y un módulo para acceder directamente a la memoria. La alimentación de instrucciones permite al depurador acceder a la computadora exactamente como lo haría el software. También minimiza los cambios en la CPU y se adapta a muchos tipos de CPU. Se dijo que esto era especialmente apto para RISC-V porque está diseñado explícitamente para muchos tipos de computadoras. El registro de paso de datos permite a un depurador escribir un bucle de movimiento de datos en la RAM y luego ejecutar el bucle para mover datos dentro o fuera de la computadora a una velocidad cercana a la velocidad máxima del canal de datos del sistema de depuración. [68] Los corresponsales dicen que MIPS Technologies MIPS , Intel Quark , Xtensa de Tensilica y la interfaz de modo de depuración en segundo plano (BDM) de las CPU Freescale Power ISA utilizan sistemas similares . [68]
Un proveedor propuso un subsistema de rastreo de hardware para estandarización, donó un diseño conforme e inició una revisión. [70] [71] La propuesta es para un módulo de hardware que puede rastrear la ejecución de código en la mayoría de las CPU RISC-V. Para reducir la tasa de datos y permitir rutas más simples o menos costosas para los datos de rastreo, la propuesta no genera datos de rastreo que se puedan calcular a partir de una imagen binaria del código. Envía solo datos que indican rutas "no inferibles" a través del programa, como qué ramas condicionales se toman. Para reducir las tasas de datos, no se rastrean las ramas que se pueden calcular, como las ramas incondicionales. La interfaz propuesta entre el módulo y la unidad de control es una señal lógica para cada tipo de instrucción no inferible. Las direcciones y otros datos se deben proporcionar en un bus especializado conectado a fuentes de datos apropiadas en una CPU. La estructura de datos enviada a una unidad de rastreo externa es una serie de mensajes cortos con los datos necesarios. Los detalles del canal de datos no se describen intencionalmente en la propuesta, porque es probable que varios tengan sentido.
La organización RISC-V mantiene una lista de implementaciones de CPU y SoC RISC-V. [72] Debido a las guerras comerciales y posibles sanciones que impedirían a China acceder a ISA patentadas, a partir de 2023 el país planeaba cambiar la mayoría de sus arquitecturas de CPU y MCU a núcleos RISC-V. [73]
En 2023, la Unión Europea tenía previsto proporcionar 270 millones de euros en el marco de un denominado Acuerdo Marco de Asociación (FPA) a una única empresa que fuera capaz y estuviera dispuesta a llevar a cabo un proyecto de desarrollo de CPU RISC-V destinado a supercomputadoras, servidores y centros de datos. [74] El objetivo de la Unión Europea era independizarse de los acontecimientos políticos de otros países y "fortalecer su soberanía digital y establecer estándares, en lugar de seguir los de otros". [75]
Las implementaciones propietarias existentes incluyen:
DeepComputing de Hong Kong anunció el lanzamiento el 13 de abril de 2023 de la "primera computadora portátil del mundo con procesador RISC-V"; la computadora portátil, llamada "ROMA", se entregó a sus primeros clientes en agosto de 2023 [160] y venía preinstalada con el sistema operativo chino openKylin Linux. [161] El modelo básico del dispositivo, disponible en Alibaba , todavía era caro, aproximadamente US$1500 [162] considerando que estaba alimentado por la no muy rápida [163] CPU "XuanTie C910" de Alibaba (DAMO).
Una actualización en junio de 2024 duplicó el número de núcleos a 8 núcleos y aumentó la velocidad del reloj a 2 GHz (desde 1,5 GHz), al tiempo que redujo el precio a 1000 dólares estadounidenses. [164] Una colaboración con Canonical [165] significó que el ROMA II vino preinstalado con la principal distribución internacional de Linux Ubuntu . [166]
Un problema normal para un nuevo conjunto de instrucciones es la falta de diseños de CPU y de software, lo que limita su usabilidad y reduce su adopción. [20] Además de contar ya con una gran cantidad de diseños de hardware de CPU, RISC-V también es compatible con cadenas de herramientas, sistemas operativos (por ejemplo, Linux ), middleware [ vague ] y software de diseño.
Las herramientas de software RISC-V disponibles incluyen una cadena de herramientas GNU Compiler Collection (GCC) (con GDB , el depurador), una cadena de herramientas LLVM , el simulador OVPsim (y biblioteca de modelos de procesadores rápidos RISC-V), el simulador Spike y un simulador en QEMU (RV32GC/RV64GC). JEP 422: Linux/RISC-V Port ya está integrado en el repositorio principal OpenJDK . Las compilaciones Java 21+ Temurin OpenJDK para RISC-V están disponibles en Adoptium .
Existe soporte para sistemas operativos como el núcleo Linux , FreeBSD , NetBSD y OpenBSD , pero las instrucciones en modo supervisor no estaban estandarizadas antes de la versión 1.11 de la especificación ISA privilegiada, [3] por lo que este soporte es provisional. La adaptación preliminar de FreeBSD a la arquitectura RISC-V se publicó en febrero de 2016 y se incluyó en FreeBSD 11.0. [167] [116]
Los puertos de las distribuciones Linux Debian [168] [169] y Fedora [170] , y un puerto de Haiku [171] se están estabilizando (todos solo admiten RISC-V de 64 bits , sin planes de admitir la versión de 32 bits). En junio de 2024, la empresa de Hong Kong DeepComputing anunció la disponibilidad comercial de la primera computadora portátil RISC-V del mundo que ejecuta el popular sistema operativo Linux Ubuntu en su forma estándar ("listo para usar"). [14] "Como RISC-V se está convirtiendo en una ISA competitiva en múltiples mercados, portar Ubuntu a RISC-V para convertirse en el SO [sistema operativo] de referencia para los primeros usuarios fue una elección natural", declaró el desarrollador de Ubuntu Canonical en junio de 2024. [172]
Existe un puerto de Das U-Boot . [173] La especificación UEFI v2.7 ha definido el enlace RISC-V y los ingenieros de HPE han realizado un puerto TianoCore [174] y se espera que se publique en el canal ascendente. Hay un puerto preliminar del microkernel seL4 . [175] [176] Hex Five lanzó la primera pila de IoT segura para RISC-V con soporte FreeRTOS . [177] También se portó xv6 , una reimplementación moderna de Sexta Edición Unix en ANSI C utilizada con fines pedagógicos en MIT . Pharos RTOS se ha portado a RISC-V de 64 bits [178] (incluida la protección de tiempo y memoria). Consulte también Comparación de sistemas operativos en tiempo real .
Existe un simulador para ejecutar un sistema Linux RISC-V en un navegador web usando JavaScript . [179] [180] [181]
QEMU admite la ejecución (mediante traducción binaria ) de sistemas RISC-V de 32 y 64 bits (por ejemplo, Linux) con muchos dispositivos emulados o virtualizados (serie, paralelo, USB, red, almacenamiento, reloj de tiempo real, watchdog, audio), así como la ejecución de binarios RISC-V de Linux (traduciendo llamadas al sistema al núcleo del host). Admite emulación multinúcleo (SMP). [182]
El simulador Creator es portátil y permite al usuario aprender varios lenguajes ensambladores de diferentes procesadores (Creator tiene ejemplos con una implementación de instrucciones RISC-V y MIPS32). [183] [184] [185] [186] [187]
Se han aplicado varios lenguajes para crear núcleos IP RISC-V, incluido un lenguaje de descripción de hardware basado en Scala , Chisel , [188] que puede reducir los diseños a Verilog para su uso en dispositivos, y el lenguaje de descripción de procesador CodAL que se ha utilizado para describir núcleos de procesador RISC-V y generar HDK ( RTL , testbench y UVM ) y SDK correspondientes. [189] El Grupo de trabajo de cumplimiento internacional RISC-V tiene un repositorio GitHub para RV32IMC. [190]
En ASTC (www.astc-design.com), tenemos una implementación de RV32EC como un núcleo IP sintetizable destinado a pequeñas aplicaciones embebidas, como sensores inteligentes e IoT.