RISC-V [b] (pronunciado "riesgo cinco" [2] : 1 ) es una arquitectura de conjunto de instrucciones (ISA) estándar abierta basada en principios establecidos de computadora con conjunto de instrucciones reducido (RISC). A diferencia de la mayoría de los otros diseños ISA, RISC-V se proporciona bajo licencias de código abierto libres de regalías . Muchas empresas ofrecen o han anunciado hardware RISC-V; Hay disponibles sistemas operativos de código abierto compatibles con RISC-V y el conjunto de instrucciones es compatible con varias cadenas de herramientas de software populares .
Como arquitectura RISC, RISC-V ISA es una arquitectura de almacenamiento de carga . Sus instrucciones de punto flotante utilizan punto flotante IEEE 754 . Las características notables de RISC-V ISA incluyen: ubicaciones de los campos 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 ] y una ubicación fija para el bit de signo de valores inmediatos para acelerar la extensión de señales . [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 alineadas naturalmente de 32 bits , y 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 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 "no congelado" intencionalmente, porque a partir de 2023 , hay muy poco práctico experiencia con sistemas de memoria tan grandes. [2] : 41 [actualizar]
A diferencia de otros diseños académicos que normalmente se optimizan sólo 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 [5] 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 congeló como versión 20191213. [2] Hay una especificación de depuración externa disponible como borrador, versión 0.13.2. [6]
El proyecto comenzó en 2010 en la Universidad de California, Berkeley. Actualmente hay miembros en más de 70 países que contribuyen y colaboran para definir las especificaciones abiertas de RISC-V. RISC-V International, la organización sin fines de lucro que gestiona RISC-V, tiene actualmente su sede en Suiza . [7] [8]
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 dicho equipo, los proveedores comerciales de propiedad intelectual (IP) del procesador, como Arm Ltd. y MIPS Technologies , cobran regalías por el uso de sus diseños, patentes y derechos de autor . [9] [10] [11] 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 los motivos 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 desplegable en cualquier diseño de hardware o software sin regalías. [2] : 1 [12] Además, se explican los fundamentos que justifican cada decisión de diseño del proyecto, al menos en términos amplios. Los autores de RISC-V son académicos que tienen una experiencia sustancial en diseño de computadoras, y RISC-V ISA 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 estos proyectos. [2] : 1 [12]
Para construir una comunidad grande y continua de usuarios y así acumular diseños y software, los diseñadores de RISC-V ISA admiten intencionalmente una amplia variedad de casos de uso práctico: implementaciones compactas, de rendimiento y de bajo consumo en el mundo real [2] : 1– 2, 153-154 [13] sin sobrearquitectura para una microarquitectura determinada . [2] : 1 [14] [15] [16] Los requisitos de una gran base de contribuyentes es parte de la razón por la cual RISC-V fue diseñado para abordar muchos usos posibles.
La afirmación principal de los diseñadores es que el conjunto de instrucciones es la interfaz clave en una computadora, ya que está situada en la interfaz entre el hardware y el software. Si un buen conjunto de instrucciones estuviera abierto y disponible para que todos lo usaran, entonces podría reducir drásticamente el costo del software al permitir una reutilización mucho mayor. También debería desencadenar una mayor competencia entre los proveedores de hardware, quienes luego podrán dedicar más recursos al diseño y menos al soporte de software. [12]
Los diseñadores sostienen que los nuevos principios se están volviendo raros 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 hizo porque sus empresas patrocinadoras no tuvieron éxito financiero, no porque los conjuntos de instrucciones fueran técnicamente deficientes. Por lo tanto, un conjunto de instrucciones abiertas bien diseñado utilizando principios bien establecidos debería atraer el apoyo a largo plazo de muchos proveedores. [12]
RISC-V también fomenta el uso académico. La simplicidad del subconjunto de números enteros permite ejercicios básicos para los estudiantes y es un ISA lo suficientemente simple como para permitir que el software controle las máquinas de investigación. El ISA de longitud variable proporciona espacio para extensiones de conjuntos de instrucciones tanto para ejercicios como para investigaciones de los estudiantes, [2] : 7 y el conjunto de instrucciones privilegiadas separadas permite la investigación sobre el soporte del sistema operativo sin rediseñar los compiladores. [3] El paradigma abierto de propiedad intelectual de RISC-V permite publicar, reutilizar y modificar diseños derivados. [17]
El término RISC data aproximadamente de 1980. [18] Antes de eso, había cierto conocimiento (ver John Cocke ) de que las computadoras más simples pueden ser efectivas, pero los principios de diseño no se describieron ampliamente. 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, del cual David Patterson fue coautor, y luego participó en el RISC- Originación V. DLX estaba destinado a 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 todavía son compatibles con GNU Compiler Collection (GCC), un popular compilador de software libre . Existen tres núcleos de código abierto para esta ISA, pero nunca se fabricaron. [19] [20] OpenRISC es un ISA de código abierto basado en DLX, con diseños RISC asociados, y es totalmente compatible con implementaciones de GCC y Linux , aunque también tiene pocas implementaciones comerciales.
Krste Asanović de la Universidad de California, Berkeley , tenía un requisito 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 a los usuarios académicos e industriales. [12] David Patterson de Berkeley se unió a la colaboración ya que fue el creador de Berkeley RISC , [18] y RISC-V es la quinta generación homónima de su larga serie de proyectos cooperativos de investigación basados en RISC en la Universidad de California. Berkeley ( RISC-I y RISC-II publicados en 1981 por Patterson, quien se refiere [21] a la arquitectura SOAR [22] de 1984 como "RISC-III" y a la arquitectura SPUR [23] de 1988 como "RISC-IV" ). En esta etapa, los estudiantes proporcionaron software inicial, simulaciones y diseños de CPU. [24]
Los autores de RISC-V y su institución obtuvieron originalmente los documentos ISA [25] 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, [26] 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 su mejora por parte de contribuyentes 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. [27]
Los usuarios comerciales necesitan que una ISA sea estable antes de poder utilizarla en un producto que pueda 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. [28] Los autores y propietarios originales han cedido sus derechos a la fundación. [ cita necesaria ] 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 . [29] [ 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. [30]
En noviembre de 2019, la Fundación RISC-V anunció que se trasladaría a Suiza , citando preocupaciones sobre las regulaciones comerciales estadounidenses. [31] [32] En marzo de 2020, la organización pasó a denominarse RISC-V International, una asociación empresarial suiza sin fines de lucro. [33]
A partir de 2019 [actualizar], RISC-V International publica libremente los documentos que definen RISC-V y permite el uso ilimitado de ISA para el diseño de software y hardware. Sin embargo, sólo los miembros de RISC-V International pueden votar para aprobar los cambios, y sólo las organizaciones miembros utilizan el logotipo de compatibilidad de marca registrada . [34] [ verificación fallida ]
RISC-V tiene un diseño modular, que consta de piezas base alternativas, con extensiones opcionales adicionales. La base ISA y sus extensiones se desarrollan en un esfuerzo colectivo entre la industria, la comunidad investigadora 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 lógica (es decir, de números enteros) y accesorios. 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 pueden 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 admitir hipervisores y virtualización . [3]
Junto con la extensión supervisora, 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á integrada) y la extensión C, define todas las instrucciones necesarias para soportar cómodamente un sistema operativo de propósito general . [2] : 129, 154
Para controlar las combinaciones de funciones que pueden implementarse, se define una nomenclatura para especificarlas en el Capítulo 27 de la actual Especificación ISA sin privilegios ratificada. 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 cartas que especifican las extensiones implementadas, en el orden de la tabla anterior. Cada letra puede ir seguida de una letra mayor, opcionalmente seguida de una "p" y un número de opción menor. El valor predeterminado es 0 si falta un número de versión menor y 1,0 si falta todo el número de versión. Por lo tanto, RV64IMAFD puede escribirse como RV64I1p0M1p0A1p0F1p0D1p0 o más simplemente como RV64I1M1A1F1D1 . Se pueden utilizar guiones bajos entre extensiones para facilitar la lectura, por ejemplo RV32I2_M2_A2 .
Los cálculos básicos, 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 lo tanto, tenemos la abreviatura "G".
Una pequeña computadora 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 prevé que las extensiones se nombren 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 búsqueda de instrucciones. Zifencei2 y Zifencei2p0 nombran la versión 2.0 del mismo. La primera letra que sigue a la "Z" por convención indica la categoría de extensión alfabética más estrechamente relacionada, IMAFDQLCBJTPVN . Así, 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 estar separadas por guiones bajos, agrupadas por categoría y luego alfabéticamente dentro de cada categoría. Por ejemplo, Zicsr_Zifencei_Zam .
Las extensiones específicas del nivel de privilegio de supervisor se nombran de la misma manera usando "S" como prefijo. Las extensiones específicas del nivel de hipervisor se denominan utilizando "H" como prefijo. Las extensiones a nivel de máquina tienen el prefijo "Zxm". Las extensiones de conjunto de instrucciones a 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. Siguen la convención de nomenclatura "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 debatiendo 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 de 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 recursos en la construcción de un ecosistema de software rico. [39]
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 diversos términos utilizados en esta especificación de plataforma. La política de la plataforma también proporciona los detalles necesarios con respecto al alcance, la cobertura, la denominación, el control de versiones, la estructura, el ciclo de vida y las afirmaciones de compatibilidad para la especificación de la plataforma. [40]
RISC-V tiene 32 registros enteros (o 16 en la variante integrada), [2] : 13, 33 y cuando se implementa la extensión de punto flotante, 32 registros de punto flotante adicionales . [2] : 63 Excepto por las instrucciones de acceso a la memoria, las instrucciones solo dirigen los 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 simplifica el conjunto de instrucciones.
Existen registros de control y estado, pero los programas en modo de usuario sólo pueden acceder a aquellos utilizados 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. [17]
Como muchos diseños RISC, RISC-V es una arquitectura de carga y almacenamiento : las instrucciones solo dirigen registros, con instrucciones de carga y almacenamiento que 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 el origen (para una tienda).
El desplazamiento se agrega a un registro base para obtener la dirección. [2] : 24 Formar la dirección como un registro base más un 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, las instrucciones individuales pueden acceder a las variables locales de una subrutina en la pila. Asimismo, 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 aborda como bytes de 8 bits, con las instrucciones en orden little-endian , [2] : 9–10 y con los datos en el orden de bytes definido por la interfaz del entorno de ejecución en el que se ejecuta el código. [2] : Se puede acceder a 3, 9–10, 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 con la dirección más baja de la instrucción. Se definieron variantes big-endian y bi-endian para admitir bases de código heredadas que asumen big-endian. [2] : 9–10 El ISA privilegiado 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, distintos de la recuperación de instrucciones, son little-endian o big -endian; esos bits pueden ser de sólo lectura, en cuyo caso el endianismo de la implementación está cableado o se puede escribir. [3] : 23–24
Una interfaz del entorno de ejecución puede permitir que las direcciones de memoria a las que se accede no estén alineadas con el ancho de su 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
Como muchos conjuntos de instrucciones RISC (y algunos conjuntos de instrucciones de computadora con conjuntos de instrucciones complejos (CISC), como x86 e IBM System/360 y sus sucesores a través de 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 gestiona sistemas de memoria que se comparten entre CPU o subprocesos garantizando 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 está simplificado: 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 asignadas en memoria y en memoria. Por ejemplo, puede separar las operaciones de lectura y escritura de la memoria, sin afectar las operaciones de E/S. O, si un sistema puede operar dispositivos de E/S en paralelo con la memoria, fence
no los obliga a esperarse unos a otros. Una CPU con un subproceso puede decodificarse fence
como nop
.
Algunas CPU RISC (como MIPS , PowerPC , DLX y RISC-I de Berkeley) colocan 16 bits de compensación en las cargas y almacenes. Establecen los 16 bits superiores mediante una instrucción de carga de palabra superior . Esto permite establecer fácilmente los valores de la mitad superior de la palabra, sin cambiar los bits. Sin embargo, la mayor parte del uso de la instrucción de la mitad superior de la palabra genera constantes de 32 bits, como direcciones. RISC-V utiliza una combinación similar a SPARC de compensaciones de 12 bits e instrucciones superiores configuradas de 20 bits . El desplazamiento más pequeño de 12 bits ayuda a que las instrucciones compactas de carga y almacenamiento de 32 bits seleccionen dos de los 32 registros y aún así tengan 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. Cargar cargas inmediatas superiores lui
20 bits en los bits 31 a 12. Luego, una segunda instrucción como la que addi
puede configurar los 12 bits inferiores. Se pueden formar números pequeños o direcciones utilizando el registro cero en lugar de lui
.
Este método se amplía para permitir código independiente de la posición agregando una instrucción auipc
que genera 20 bits de dirección superiores agregando 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 a menudo se puede utilizar tal cual con los desplazamientos de 12 bits de las cargas y almacenes. Si es necesario, addi
puede configurar los 12 bits inferiores de un registro. En ISA de 64 y 128 bits, lui
extienda auipc
con signo el resultado para obtener la dirección más grande. [2] : 37
Algunas CPU rápidas pueden interpretar combinaciones de instrucciones como instrucciones fusionadas únicas . lui
o auipc
son buenos candidatos para fusionarse con jalr
, addi
cargas o tiendas.
La llamada a subrutina de RISC-V jal
(salto y enlace) coloca su dirección de remitente en un registro. Esto es más rápido en muchos diseños de computadoras, porque ahorra 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 agrega a la PC para generar una dirección relativa a una instrucción de 32 bits. Si el resultado no está en una dirección de 32 bits (es decir, 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 registro de enlace jalr
. jalr
es similar a jal
, pero obtiene su dirección de destino agregando un desplazamiento de 12 bits a un registro base. (Por el contrario, jal
agrega un desplazamiento mayor de 20 bits a la PC).
jalr
El formato de bits es como las cargas y tiendas relativas al registro. Al igual que ellos, jalr
se puede usar con las instrucciones que configuran los 20 bits superiores de un registro base para realizar ramas de 32 bits, ya sea a una dirección absoluta (usando lui
) o relativa a la PC (usando auipc
para código independiente de la posición ). (El uso de una dirección de base cero constante permite llamadas de una sola instrucción a una dirección pequeña (el desplazamiento), fija positiva o negativa).
RISC-V recicla jal
y jalr
obtiene saltos incondicionales relativos a la PC de 20 bits y saltos incondicionales de 12 bits basados en registros. Los saltos simplemente hacen que el enlace registre 0 para que no se guarde 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 está configurado para que sea el registro de enlace guardado por jal
o jalr
. jalr
El desplazamiento de es cero y el registro de vinculación es cero, por lo que no hay desplazamiento y no se guarda ninguna dirección de retorno.
Como muchos diseños RISC, en una llamada de subrutina, un compilador RISC-V debe usar instrucciones individuales para guardar registros en la pila al principio y luego restaurarlos desde la pila al salir. RISC-V no tiene instrucciones para guardar múltiples registros ni restaurar múltiples registros. Se pensaba que esto hacía que la CPU fuera demasiado compleja y posiblemente lenta. [41] 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. [42]
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 hacían que las CPU rápidas fueran 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 predicación (la ejecución condicional de instrucciones). Los diseñadores afirman que los diseños de CPU muy rápidos y desordenados realizan predicaciones 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 bifurcaciones , lo que puede evitar la mayoría de los bloqueos asociados con las bifurcaciones 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. [17] [ 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 rama de comparación con solo seis instrucciones, invirtiendo el orden de los operandos en el ensamblador . Por ejemplo, la bifurcación si es mayor que se puede realizar mediante menor que con un orden inverso de operandos. [2] : 20–23, Sección 2.5
Las ramas de comparación tienen un rango de doce bits con signo y saltan en relación con la 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 que se tome o no la bifurcación. [2] : 20–23, Sección 2.5 RISC-V omite una ranura de retardo de rama porque complica las CPU multiciclo, las CPU superescalares y las canalizaciones largas. Los predictores de sucursales dinámicas han tenido éxito lo suficientemente bien como para reducir la necesidad de sucursales retrasadas. [17]
En el primer encuentro con una rama, las CPU RISC-V deben asumir que se tomará una rama relativa negativa (es decir, el bit de signo del desplazamiento es "1"). [2] : 20–23, Sección 2.5 Esto supone que una rama hacia atrás es un bucle y proporciona una dirección predeterminada para que las CPU con canalización simple puedan llenar su canal de instrucciones. Aparte de esto, RISC-V no requiere predicción de rama , pero las implementaciones centrales pueden agregarla. RV32I reserva un espacio de instrucción "HINT" que actualmente no contiene ninguna sugerencia sobre las ramas; [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. Estos 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 enteros RISC-V carecen del conteo de ceros iniciales y de las operaciones de campo de bits que normalmente se usan para acelerar el punto flotante del software en un procesador de enteros puros. Sin embargo, aunque nominalmente están en la extensión de manipulación de bits, las extensiones Zbb, Zba y Zbs ratificadas contienen más instrucciones de números enteros, incluida una instrucción de conteo a la izquierda del cero.
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 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 operaciones de coma 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 están separados de los registros de números enteros. Las instrucciones de coma flotante de doble precisión (conjunto D ) generalmente suponen que los registros de coma flotante son de 64 bits (es decir, de doble ancho) y que el subconjunto F está coordinado con el conjunto D. También se define un ISA ( Q ) de punto flotante de 128 bits de precisión cuádruple . [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, incluido el desbordamiento , [2] : 17–20 subdesbordamiento, subnormal y división por cero. [2] : 44–45 En cambio, tanto la aritmética de números 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 se puede descubrir mediante una rama después de la división. [2] : 44–45 Los bits de estado pueden probarse mediante 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 coherencia de memoria estándar de RISC-V es la coherencia de versiones . Es decir, las cargas y los almacenes generalmente pueden reordenarse, pero algunas cargas pueden designarse como operaciones de adquisición que deben preceder a los accesos posteriores a la memoria, y algunas tiendas pueden designarse como operaciones de liberación que deben seguir a los accesos anteriores a la memoria. [2] : 83–94
El conjunto de instrucciones base incluye un soporte mínimo en forma de fence
instrucción para hacer cumplir el orden de memoria. [2] : 26–27 Aunque esto es suficiente ( fence r, rw
proporciona adquisición y fence rw, w
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 coherencia en la liberación. En primer lugar, proporciona instrucciones de carga reservada lr
y condicionales de almacenamiento sc
lr
de uso general. realiza una carga e intenta reservar esa dirección para su hilo. sc
Se realizará una tienda condicional posterior a la dirección reservada solo si la reserva no es cancelada por una tienda interviniente de otra fuente. Si la tienda tiene éxito, se coloca un cero en una caja registradora. Si falla, un valor distinto de cero indica que el software debe volver a intentar la operación. En cualquier caso, la reserva queda liberada. [2] : Capítulo 8
El segundo grupo de instrucciones atómicas realiza secuencias de lectura, modificación y escritura : una carga (que opcionalmente es una carga-adquisición) en 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 lanzamiento en tienda). 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: intercambio (usar el valor del registro fuente directamente); agregar; bit a bit y, o, y exclusivo-o; y mínimo y máximo firmados y sin firmar. [2] : Capítulo 8
El diseño de un sistema puede optimizar estas operaciones combinadas más que lr
y sc
. Por ejemplo, si el registro de destino de un intercambio es el cero constante, se puede omitir la carga. Si el valor almacenado no se modifica desde la carga, es posible que se omita el almacenamiento. [5] : 44
IBM System/370 y sus sucesores, incluidos z/Architecture y x86 , implementan una instrucción de comparación e intercambio ( cas
), que prueba y actualiza condicionalmente una ubicación en la memoria: si la ubicación contiene un valor antiguo esperado, cas
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 para cas
recuperar el valor anterior. El problema clásico es que si un hilo lee (carga) un valor A , calcula un nuevo valor C y luego usa ( cas
) 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 generar resultados incorrectos. La solución más común emplea una instrucción de doble anchocas
para actualizar tanto el puntero como un contador adyacente; desafortunadamente, dicha 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
La alternativa lr
/ sc
es más eficiente. Por lo general, requiere solo una carga de memoria y es deseable minimizar las operaciones de memoria lentas. También es exacto: controla todos los accesos a la celda de memoria, en lugar de limitarse a garantizar un patrón de bits. Sin embargo, a diferencia de cas
, puede permitir livelock , en el que dos o más subprocesos provocan repetidamente que fallen las instrucciones de cada uno. RISC-V garantiza el progreso hacia adelante (sin bloqueo en vivo) si el código sigue reglas sobre el tiempo y la secuencia de instrucciones: 1) Debe usar solo el subconjunto I. 2) Para evitar errores repetitivos de caché, el código (incluido el bucle de reintento) no debe ocupar más de 16 instrucciones consecutivas. 3) No debe incluir ningún sistema ni instrucciones de vallado, ni ramas tomadas hacia atrás entre el lr
y sc
. 4) La rama hacia atrás al bucle de reintento debe realizarse en la secuencia original. [2] : 48–49
La especificación ofrece un ejemplo de cómo utilizar las instrucciones atómicas de lectura, modificación y 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 lo convierte en una implementación particularmente simple, 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 [41]
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 está reservado para un conjunto de instrucciones comprimido de longitud variable opcional (pero recomendado) , RVC, que incluye instrucciones de 16 bits. Como en ARM Thumb y MIPS16 , las instrucciones comprimidas son simplemente codificaciones alternativas para un subconjunto de instrucciones más grandes. A diferencia de los conjuntos comprimidos ARM o MIPS, el espacio se reservó desde el principio, por lo que no existe un modo de funcionamiento independiente. Las instrucciones estándar y comprimidas se pueden mezclar libremente. [2] : 97 [41] (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. [41] El código del prototipo era un 20% más pequeño que una PC x86 y un código comprimido MIPS , y un 2% más grande que el código ARM Thumb-2 . [41] También redujo sustancialmente tanto la memoria caché necesaria como el uso de energía estimado del sistema de memoria. [41]
El investigador pretendía reducir el tamaño binario del código para ordenadores pequeños, especialmente sistemas informáticos integrados . El prototipo incluía 33 de las instrucciones más utilizadas, recodificadas en formatos compactos de 16 bits utilizando códigos de operación previamente reservados para el conjunto comprimido. [41] La compresión se realizó en el ensamblador , sin cambios en el compilador. Las instrucciones comprimidas omitieron campos que a menudo son cero, utilizaron pequeños valores inmediatos o accedieron a subconjuntos (16 u 8) de los registros. addi
Es muy común y a menudo comprimible. [41]
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 cambio, el compilador generó instrucciones convencionales que acceden a la pila. El ensamblador prototipo RVC a menudo los convertía en formas comprimidas que tenían la mitad de tamaño. Sin embargo, esto aún requirió 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 un caché de código y, por lo tanto, se ejecutarían rápidamente, aunque probablemente no tan rápido como una instrucción de guardado múltiple. [41]
El RVC estándar requiere el uso ocasional de instrucciones de 32 bits. Varias propuestas RVC no estándar están completas, no requieren instrucciones de 32 bits y se dice que tienen densidades más altas que las RVC estándar. [43] [44] Otra propuesta se basa en estos y afirma utilizar también un menor rango de codificación. [45]
Un conjunto de instrucciones para las CPU integradas más pequeñas (conjunto E) se reduce de otras maneras: sólo 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 registros enteros para valores de punto flotante. El conjunto de instrucciones privilegiadas solo admite el modo máquina, el modo usuario y esquemas de memoria que utilizan la reubicación de direcciones base y vinculada. [3]
Se ha debatido un perfil de microcontrolador para RISC-V, para facilitar el desarrollo de sistemas profundamente integrados . Se centra en un soporte de lenguaje C más rápido y sencillo para interrupciones, modos de seguridad simplificados y una interfaz binaria de aplicación POSIX simplificada . [46]
Los corresponsales también han propuesto ISA RV16E de 16 bits, no estándar, más pequeños : varias propuestas serias utilizarían instrucciones C de 16 bits con registros de 8 × 16 bits. [44] [43] Una broma de los Inocentes propuso un arreglo muy práctico: utilizar registros enteros de 16 × 16 bits, con los ISA EIMC estándar ( incluidas instrucciones de 32 bits). La CPU de bits sería claramente superior con un espacio de direcciones más grande. [47]
ISA de RISC-V incluye una especificación de conjunto de instrucciones privilegiadas independiente, que describe principalmente tres niveles de privilegios más un modo de hipervisor ortogonal. A diciembre de 2021 [actualizar], RISC-V International ratifica la versión 1.12. [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 capa delgada de software de soporte estandarizado que se comunique con una capa o hardware más privilegiado. [3]
ISA también incluye un modo de hipervisor que es ortogonal a los modos de usuario y supervisor. [48] 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 provoca una interrupción en los accesos. Este bit permite que el modo supervisor maneje directamente el hardware que necesita un hipervisor. Esto simplifica la implementación de hipervisores 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 provocar que estos accesos interrumpan a un hipervisor. El diseño también simplifica el anidamiento de hipervisores, en el que un hipervisor se ejecuta bajo un hipervisor y, si es necesario, permite que el kernel use funciones de hipervisor dentro de su propio código de kernel. Como resultado, la forma de hipervisor de 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 subprocesos de hardware o harts . Múltiples subprocesos de hardware son una práctica común en computadoras con mayor capacidad. Cuando un hilo se detiene, esperando memoria, otros a menudo 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 y desordenadas. Finalmente, los subprocesos de hardware pueden ser una forma simple y poderosa de manejar las interrupciones : no es necesario guardar ni restaurar registros, simplemente ejecutar 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 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 registro de estado y control existentes admiten 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). [49] 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 mayores 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, durante la configuración, puede configurar bits para reenviar la interrupción. [3]
La especificación admite varios sistemas de memoria. Solo físico es adecuado para los sistemas integrados más simples . También hay cuatro sistemas de memoria virtual estilo UNIX para 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 desplazarse por tablas de páginas de hardware o software. Para reducir opcionalmente el costo de los recorridos por la tabla de páginas, las páginas de gran tamaño pueden ser páginas hoja en niveles superiores del árbol de la tabla de páginas de un sistema. SV32 solo se admite en implementaciones de 32 bits, tiene un árbol de tabla 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. Se requiere SV48 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 petapaginas de 256 TiB. Las superpáginas están alineadas en los límites de la página para el siguiente tamaño de página más bajo. [3]
Algunas extensiones ISA de manipulación de bits fueron ratificadas en noviembre de 2021 (Zba, Zbb, Zbc, Zbs). [36] Las extensiones Zba, Zbb y Zbs son posiblemente extensiones de las instrucciones estándar I entero: 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 0 bits iniciales, finales o todos los 1 bits en un total y operaciones de 32 palabras (clz, clzw, ctz, ctzw, cpop, cpopw), inversión del orden de los bytes (rev8), instrucciones lógicas con negación del segunda entrada (andn,orn, xnor), signo y extensión cero (sext.b, sext.h, zext.h) que no se pudieron proporcionar como casos especiales de otras instrucciones (andi, addiw, add.wu), min y máximo de 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 de bytes "o combinar" que permite 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). Son útiles para criptografía y comprobaciones CRC de la integridad de los datos.
Bien hecho, un subconjunto de manipulación de bits más especializado puede ayudar en las operaciones criptográficas, gráficas y matemáticas. Otras instrucciones que se han discutido incluyen instrucciones para cambiar en unos, inversión de bits generalizada, permutaciones aleatorias y de barras transversales, ubicación de campos de bits, extraer y depositar paquetes de dos palabras, bytes o medias palabras en un registro, instrucciones CRC, operaciones de matriz de bits. (solo RV64), combinación condicional, movimiento condicional, cambios de embudo. Los criterios de inclusión documentados en el borrador cumplían con 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, incluidas soporte de compilador preexistente. La versión 0.93 de la extensión de manipulación de bits incluye esas instrucciones; [50] algunos de ellos se encuentran ahora en la versión 1.0.1 de la extensión de criptografía de instrucciones Scalar and Entropy Source . [38]
Las CPU comerciales utilizan ampliamente las instrucciones SIMD empaquetadas para acelerar de forma económica el procesamiento de señales digitales y multimedia . [17] Para sistemas RISC-V simples y de costo reducido, la especificación básica de ISA proponía utilizar los bits de los registros de punto flotante para realizar aritmética de subpalabras de datos múltiples y una sola instrucción en paralelo ( SIMD ).
En 2017, un proveedor publicó una propuesta más detallada en la lista de correo, que puede citarse como la versión 0.1. [51] A partir de 2019 [actualizar], la eficiencia de este ISA propuesto varía de 2 a 5 veces una CPU base para una variedad de códecs DSP. [52] La propuesta carecía de formatos de instrucción y una asignación de licencia a RISC-V International, pero fue revisada por la lista de correo. [51] Algunas partes impopulares de esta propuesta fueron que agregó un código de condición, el primero en un diseño RISC-V, vinculó registros adyacentes (también el primero) y tiene un contador de bucles que puede ser difícil de implementar en algunas microarquitecturas.
El conjunto de instrucciones de procesamiento de vectores 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 se indicó anteriormente. Sin embargo, un verdadero coprocesador vectorial podría ejecutar el mismo código con mayor rendimiento. [53]
A partir del 19 de septiembre de 2021 [actualizar], la extensión vectorial tiene la versión 1.0. [54] Es un diseño conservador y flexible de un procesador vectorial de precisión mixta de uso general , adecuado para ejecutar núcleos informáticos . El código se trasladaría fácilmente a CPU con diferentes longitudes de vectores, idealmente sin recompilar. [53]
Por el contrario, las extensiones SIMD de vector corto son menos convenientes. Estos se utilizan en x86 , ARM y PA-RISC . En estos, un cambio en el ancho de palabra fuerza un cambio en el conjunto de instrucciones para expandir los registros vectoriales (en el caso de x86, de registros MMX de 64 bits a Streaming SIMD Extensions (SSE) de 128 bits, a Advanced de 256 bits. Extensiones vectoriales (AVX) y AVX-512 ). El resultado es un conjunto de instrucciones cada vez mayor y la necesidad de trasladar el código de trabajo a las nuevas instrucciones.
En el ISA vectorial RISC-V, en lugar de fijar la longitud del vector en la arquitectura, hay instrucciones disponibles ( 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. Entonces, la propuesta RISC-V se parece más al diseño de vector largo de Cray o a la extensión vectorial escalable de ARM. Es decir, cada vector en hasta 32 vectores tiene la misma longitud. [54] : 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 exceder el límite direccionable de 32, pero puede ser menor si la solicitud no los requiere todos. La longitud del vector está limitada por el almacenamiento disponible en el chip dividido por la cantidad 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). [53]
Fuera de los bucles vectoriales, la aplicación puede poner a cero el número de registros vectoriales solicitados, ahorrando al sistema operativo el trabajo de preservarlos en los cambios de contexto . [53]
La longitud del vector no sólo es variable desde el punto de vista arquitectónico, 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 mediante sobrecarga polimórfica. [53] El plan es que estos puedan reducir el tamaño y la complejidad de la ISA y el compilador. [53]
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 vatios (mayor duración de la batería). [55]
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 en rama . En su lugar, se utilizará una predicción basada en compiladores de menor costo. [53] [56]
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 alimentación de instrucciones . [57] [58]
A partir de enero de 2017 [actualizar], la forma exacta de la interfaz abstracta permanece sin definir, 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 accesible al sistema de comunicación. [57] Los corresponsales afirman que la interfaz de modo de depuración en segundo plano (BDM) de Freescale utiliza sistemas similares para algunas CPU, ARM , OpenRISC y LEON de Aeroflex . [57]
En la alimentación de instrucciones , la CPU procesará una excepción de depuración para ejecutar instrucciones individuales escritas en un registro. Este puede complementarse con un registro de paso de datos y un módulo para acceder directamente a la memoria. La alimentación de instrucciones permite que el depurador acceda 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 es especialmente adecuado para RISC-V porque está diseñado explícitamente para muchos tipos de computadoras. El registro de paso de datos permite que un depurador escriba un bucle de movimiento de datos en la RAM y luego ejecute 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. [57] 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 . [57]
Un proveedor propuso un subsistema de rastreo de hardware para estandarización, donó un diseño conforme e inició una revisión. [59] [60] 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 velocidad de datos y permitir rutas más simples o menos costosas para los datos de seguimiento, la propuesta no genera datos de seguimiento que puedan calcularse a partir de una imagen binaria del código. Sólo envía datos que indican rutas "inferibles" a través del programa, como qué ramas condicionales se toman. Para reducir las velocidades de datos, no se rastrean las ramas calculables, 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 ininferible. Las direcciones y otros datos deben proporcionarse 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 de ellos tengan sentido.
La organización RISC-V mantiene una lista de implementaciones de CPU y SoC de RISC-V. [61]
Las implementaciones propietarias existentes incluyen:
Existen muchos diseños de CPU RISC-V de código abierto, que incluyen:
Un problema normal para un nuevo conjunto de instrucciones es la falta de software y diseños de CPU; ambos problemas limitan su usabilidad y reducen su adopción. [12] RISC-V tiene una gran cantidad de diseños de CPU. El software RISC-V incluye cadenas de herramientas, sistemas operativos, middleware [ vago ] 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 procesador rápido RISC-V), el simulador Spike y un simulador en QEMU (RV32GC/RV64GC). JEP 422: El puerto Linux/RISC-V ya está integrado en el repositorio OpenJDK principal .
Existe soporte del sistema operativo para el kernel de 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 actualizó en febrero de 2016 y se envió en FreeBSD 11.0. [134] [100] Los puertos de las distribuciones de Linux Debian [135] y Fedora [136] , y un puerto de Haiku , [137] se están estabilizando (todos solo admiten RISC-V de 64 bits, sin planes para admitir 32- versión de bits). Existe un puerto de Das U-Boot . [138] UEFI Spec v2.7 ha definido el enlace RISC-V y los ingenieros de HPE han realizado un puerto TianoCore [139] y se espera que se actualice. Hay un puerto preliminar del microkernel seL4 . [140] [141] Hex Five lanzó la primera pila segura de IoT para RISC-V con soporte FreeRTOS . [142] También se portó xv6 , una reimplementación moderna de la sexta edición de Unix en ANSI C utilizada con fines pedagógicos en el MIT . Pharos RTOS ha sido portado a RISC-V de 64 bits [143] (incluida protección de tiempo y memoria). Véase 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 . [144] [145] [146]
QEMU también 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 en tiempo real, vigilancia, audio). como ejecutar binarios RISC-V de Linux (traducir llamadas al sistema al kernel del host). Admite emulación multinúcleo (SMP). [147]
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). [148] [149] [150] [151]
El simulador educativo extensible WepSIM implementa un subconjunto (microprogramado) de instrucciones RISC-V (RV32I+M) y permite la ejecución de subrutinas en ensamblador. [152] [153]
Se han aplicado varios lenguajes para crear núcleos IP RISC-V, incluido un lenguaje de descripción de hardware basado en Scala, Chisel , [154] que puede reducir los diseños a Verilog para su uso en dispositivos, y el lenguaje de descripción del procesador CodAL que se ha utilizado en describir los núcleos del procesador RISC-V y generar los HDK correspondientes ( RTL , testbench y UVM ) y SDK. [155] El Grupo de Trabajo de Cumplimiento Internacional RISC-V tiene un repositorio GitHub para RV32IMC. [156]
En ASTC (www.astc-design.com), tenemos una implementación de RV32EC como un núcleo IP sintetizable destinado a pequeñas aplicaciones integradas, como sensores inteligentes e IoT.