Set de instrucciones arquitectura
En informática, una arquitectura de conjunto de instrucciones (ISA), también llamada arquitectura informática, es un modelo abstracto de una computadora. Un dispositivo que ejecuta instrucciones descritas por ese ISA, como una unidad central de procesamiento (CPU), se denomina implementación.
En general, una ISA define las instrucciones admitidas, los tipos de datos, los registros, el soporte de hardware para administrar la memoria principal, las características fundamentales (como la consistencia de la memoria, los modos de direccionamiento, la memoria virtual) y el modelo de entrada/salida de una familia de implementaciones de la ISA.
Un ISA especifica el comportamiento del código de máquina que se ejecuta en las implementaciones de ese ISA de una manera que no depende de las características de esa implementación, proporcionando compatibilidad binaria entre las implementaciones. Esto permite múltiples implementaciones de un ISA que difieren en características como rendimiento, tamaño físico y costo monetario (entre otras cosas), pero que son capaces de ejecutar el mismo código de máquina, de modo que una máquina de menor rendimiento y menor costo puede reemplazarse con una máquina de mayor costo y mayor rendimiento sin tener que reemplazar el software. También permite la evolución de las microarquitecturas de las implementaciones de esa ISA, de modo que una implementación más nueva y de mayor rendimiento de una ISA pueda ejecutar software que se ejecuta en generaciones anteriores de implementaciones.
Si un sistema operativo mantiene una interfaz binaria de aplicación (ABI) estándar y compatible para un ISA en particular, el código de máquina se ejecutará en implementaciones futuras de ese ISA y sistema operativo. Sin embargo, si una ISA admite la ejecución de varios sistemas operativos, no garantiza que el código de máquina de un sistema operativo se ejecutará en otro sistema operativo, a menos que el primer sistema operativo admita la ejecución de código de máquina creado para el otro sistema operativo.
Un ISA se puede ampliar agregando instrucciones u otras capacidades, o agregando soporte para direcciones y valores de datos más grandes; una implementación de la ISA extendida aún podrá ejecutar código de máquina para versiones de la ISA sin esas extensiones. El código de máquina que usa esas extensiones solo se ejecutará en implementaciones que admitan esas extensiones.
La compatibilidad binaria que brindan convierte a las ISA en una de las abstracciones más fundamentales de la informática.
Resumen
Una arquitectura de conjunto de instrucciones se distingue de una microarquitectura, que es el conjunto de técnicas de diseño de procesador utilizadas, en un procesador particular, para implementar el conjunto de instrucciones. Los procesadores con diferentes microarquitecturas pueden compartir un conjunto de instrucciones común. Por ejemplo, Intel Pentium y AMD Athlon implementan versiones casi idénticas del conjunto de instrucciones x86, pero tienen diseños internos radicalmente diferentes.
El concepto de una arquitectura, distinta del diseño de una máquina específica, fue desarrollado por Fred Brooks en IBM durante la fase de diseño de System/360.
Antes de NPL [System/360], los diseñadores informáticos de la empresa habían sido libres de honrar los objetivos de coste no sólo seleccionando tecnologías sino también definiendo funcionales y arquitectónicos. El objetivo de compatibilidad SPREAD, en cambio, posulló una arquitectura única para una serie de cinco procesadores que abarcan una amplia gama de costes y rendimiento. Ninguno de los cinco equipos de diseño de ingeniería podría contar con la posibilidad de introducir ajustes en las especificaciones arquitectónicas como una manera de aliviar las dificultades para alcanzar los objetivos de coste y rendimiento.
Algunas máquinas virtuales que admiten código de bytes como su ISA, como Smalltalk, la máquina virtual de Java y Common Language Runtime de Microsoft, implementan esto traduciendo el código de bytes para rutas de código de uso común en código de máquina nativo. Además, estas máquinas virtuales ejecutan rutas de código utilizadas con menos frecuencia por interpretación (ver: Compilación justo a tiempo). Transmeta implementó el conjunto de instrucciones x86 sobre los procesadores VLIW de esta manera.
Clasificación de las ISA
Una ISA se puede clasificar de varias maneras diferentes. Una clasificación común es por complejidad arquitectónica. Una computadora con conjunto de instrucciones complejas (CISC) tiene muchas instrucciones especializadas, algunas de las cuales rara vez se usan en programas prácticos. Una computadora con conjunto de instrucciones reducido (RISC) simplifica el procesador al implementar de manera eficiente solo las instrucciones que se usan con frecuencia en los programas, mientras que las operaciones menos comunes se implementan como subrutinas, lo que hace que el tiempo de ejecución del procesador adicional resultante sea compensado por el uso poco frecuente.
Otros tipos incluyen arquitecturas de palabra de instrucción muy larga (VLIW), y las arquitecturas de palabra de instrucción larga (LIW) y cómputo de instrucciones explícitamente paralelas (EPIC) estrechamente relacionadas. Estas arquitecturas buscan explotar el paralelismo a nivel de instrucción con menos hardware que RISC y CISC al hacer que el compilador sea responsable de la emisión y programación de instrucciones.
Se han estudiado arquitecturas con una complejidad aún menor, como la computadora con conjunto mínimo de instrucciones (MISC) y la computadora con un conjunto de instrucciones (OISC). Estos son tipos teóricamente importantes, pero no han sido comercializados.
Instrucciones
El lenguaje de la máquina se construye a partir de declaraciones o instrucciones discretas. En la arquitectura de procesamiento, una instrucción dada puede especificar:
- opcode (la instrucción a realizar) por ejemplo añadir, copiar, probar
- cualquier operación explícita:
- registros
- valores literales y constantes
- modos de manejo utilizados para acceder a la memoria
Las operaciones más complejas se construyen combinando estas instrucciones simples, que se ejecutan secuencialmente, o según lo indiquen las instrucciones de flujo de control.
Tipos de instrucciones
Los ejemplos de operaciones comunes a muchos conjuntos de instrucciones incluyen:
Manejo de datos y operaciones de memoria
- Set un registro a un valor constante fijo.
- Copiado datos de una ubicación de memoria o un registro a una ubicación de memoria o un registro (una instrucción de la máquina se llama a menudo Muévanse.; sin embargo, el término es engañoso). Se utilizan para almacenar el contenido de un registro, el contenido de otra ubicación de memoria o el resultado de un cálculo, o para recuperar datos almacenados para realizar un cálculo en él más adelante. A menudo se les llama operaciones de carga y almacenamiento.
- Leer y escribir datos de dispositivos de hardware.
Operaciones aritméticas y lógicas
- Añadir, subtract, multiplica multiplica multiplica multiplica multiplica multiplica, o dividir los valores de dos registros, colocando el resultado en un registro, posiblemente estableciendo uno o más códigos de condición en un registro de estado.
- aumento, decremento en algunos ISA, ahorro de operación de captura en casos triviales.
- Realizar operaciones bitwise, por ejemplo, tomar el conjunción y disjunción de bits correspondientes en un par de registros, tomando el negación de cada bit en un registro.
- Compare dos valores en registros (por ejemplo, para ver si uno es menos, o si son iguales).
- Instrucciones de punto flotantes para aritmética en números flotantes.
Operaciones de flujo de control
- Subdivisión a otra ubicación en el programa y ejecutar instrucciones allí.
- Rama condicional a otra ubicación si una determinada condición tiene.
- Rama indirecta a otro lugar.
- Call otro bloque de código, mientras que guarda la ubicación de la siguiente instrucción como un punto a el que regresar.
Instrucciones del coprocesador
- Cargar / almacenar datos desde y hacia un coprocesador o intercambiar con registros CPU.
- Realizar operaciones de coprocesador.
Instrucciones complejas
Los procesadores pueden incluir "complejos" instrucciones en su conjunto de instrucciones. Un solo "complejo" instrucción hace algo que puede requerir muchas instrucciones en otras computadoras. Dichas instrucciones se caracterizan por instrucciones que toman múltiples pasos, controlan múltiples unidades funcionales o aparecen en una escala mayor que la mayoría de las instrucciones simples implementadas por el procesador dado. Algunos ejemplos de "complejo" las instrucciones incluyen:
- transferir múltiples registros a o desde memoria (especialmente la pila) a la vez
- mover grandes bloques de memoria (por ejemplo, copia de cadena o transferencia DMA)
- complicado integer y aritmética de punto flotante (por ejemplo, raíz cuadrada, o funciones trascendentales como logaritmo, sine, cosine, etc.)
- Instrucciones SIMDs, una única instrucción que realiza una operación en muchos valores homogéneos en paralelo, posiblemente en registros SIMD dedicados
- realizar una instrucción atómica de prueba y conjunto u otra instrucción atómica de lectura-modificar-escribir
- instrucciones que realizan operaciones ALU con un operand de memoria en lugar de un registro
Las instrucciones complejas son más comunes en los conjuntos de instrucciones CISC que en los conjuntos de instrucciones RISC, pero los conjuntos de instrucciones RISC también pueden incluirlas. Los conjuntos de instrucciones RISC generalmente no incluyen operaciones ALU con operandos de memoria o instrucciones para mover grandes bloques de memoria, pero la mayoría de los conjuntos de instrucciones RISC incluyen instrucciones SIMD o vectoriales que realizan la misma operación aritmética en múltiples piezas de datos al mismo tiempo. Las instrucciones SIMD tienen la capacidad de manipular vectores y matrices grandes en un tiempo mínimo. Las instrucciones SIMD permiten una fácil paralelización de algoritmos comúnmente involucrados en el procesamiento de sonido, imagen y video. Se han lanzado al mercado varias implementaciones de SIMD con nombres comerciales como MMX, 3DNow! y AltiVec.
Codificación de instrucciones
En las arquitecturas tradicionales, una instrucción incluye un código de operación que especifica la operación a realizar, como agregar contenido de la memoria al registro, y cero o más especificadores de operandos, que pueden especificar registros, ubicaciones de memoria, o datos literales. Los especificadores de operandos pueden tener modos de direccionamiento que determinen su significado o pueden estar en campos fijos. En las arquitecturas de palabra de instrucción muy larga (VLIW), que incluyen muchas arquitecturas de microcódigo, se especifican múltiples códigos de operación y operandos simultáneos en una sola instrucción.
Algunos conjuntos de instrucciones exóticos no tienen un campo de código de operación, como las arquitecturas activadas por transporte (TTA), solo operandos.
La mayoría de las máquinas de pila tienen "0-operando" conjuntos de instrucciones en los que las operaciones aritméticas y lógicas carecen de campos especificadores de operandos; solo las instrucciones que insertan operandos en la pila de evaluación o que sacan operandos de la pila a variables tienen especificadores de operandos. El conjunto de instrucciones lleva a cabo la mayoría de las acciones de ALU con operaciones de sufijo (notación polaca inversa) que funcionan solo en la pila de expresiones, no en registros de datos o celdas de memoria principal arbitrarias. Esto puede ser muy conveniente para compilar lenguajes de alto nivel, porque la mayoría de las expresiones aritméticas se pueden traducir fácilmente a la notación de sufijos.
Las instrucciones condicionales a menudo tienen un campo de predicado: unos pocos bits que codifican la condición específica para hacer que se realice una operación en lugar de no realizarla. Por ejemplo, una instrucción de bifurcación condicional transferirá el control si la condición es verdadera, de modo que la ejecución proceda a una parte diferente del programa, y no transferirá el control si la condición es falsa, de modo que la ejecución continúe secuencialmente. Algunos conjuntos de instrucciones también tienen movimientos condicionales, de modo que el movimiento se ejecutará y los datos se almacenarán en la ubicación de destino, si la condición es verdadera, y no se ejecutarán, y la ubicación de destino no se modificará, si la condición es falsa. De manera similar, IBM z/Architecture tiene una instrucción de almacenamiento condicional. Algunos conjuntos de instrucciones incluyen un campo de predicado en cada instrucción; esto se llama predicación de rama.
Número de operandos
Los conjuntos de instrucciones pueden clasificarse por el número máximo de operandos explícitamente especificados en las instrucciones.
(En los siguientes ejemplos, a, b y c son direcciones (directas o calculadas) que se refieren a celdas de memoria, mientras que reg1 y así sucesivamente se refieren a registros de máquina).
C = A+B
- 0-operandMáquinas de dirección cero), llamadas máquinas de pila: Todas las operaciones aritméticas tienen lugar usando la primera o dos posiciones en la pila:
push a
,push b
,add
,pop c
.C = A+B
necesidades 4 instrucciones. Para las máquinas de apilación, los términos "0-operand" y "zero-address" se aplican a las instrucciones aritméticas, pero no a todas las instrucciones, ya que las instrucciones de 1-operand push y pop se utilizan para acceder a la memoria.
- 1-operandmáquinas de una sola dirección), así llamadas máquinas acumuladoras, incluyen computadoras tempranas y muchos microcontroladores pequeños: la mayoría de las instrucciones especifican un solo operado derecho (es decir, constante, un registro o una ubicación de memoria), con el acumulador implícito como el operado izquierdo (y el destino si hay uno):
load a
,add b
,store c
.C = A+B
necesidades tres instrucciones.
- 2-operand - muchas máquinas CISC y RISC entran en esta categoría:
- CISC —
move A
a C; entoncesadd B
a C.C = A+B
necesidades dos instrucciones. Esto efectivamente 'establece' el resultado sin un explícito tienda instrucción.
- CISC — A menudo las máquinas se limitan a un dispositivo de memoria por instrucción:
load a,reg1
;add b,reg1
;store reg1,c
; Esto requiere un par de carga / tienda para cualquier movimiento de memoria independientemente de siadd
resultado es un aumento almacenado en un lugar diferente, como enC = A+B
, o la misma ubicación de memoria:A = A+B
.C = A+B
necesidades tres instrucciones.
- RISC — Requiriendo cargas explícitas de memoria, las instrucciones serían:
load a,reg1
;load b,reg2
;add reg1,reg2
;store reg2,c
.C = A+B
necesidades 4 instrucciones.
- CISC —
- 3-operand, permitiendo una mejor reutilización de datos:
- CISC — Se convierte en una sola instrucción:
add a,b,c
C = A+B
necesidades una instrucción.
- CISC — O, en máquinas limitadas a dos operandos de memoria por instrucción,
move a,reg1
;add reg1,b,c
;C = A+B
necesidades dos instrucciones.
- RISC: las instrucciones aritméticas solo usan registros, por lo que se necesitan instrucciones explícitas de carga/tienda de 2 operandos:
load a,reg1
;load b,reg2
;add reg1+reg2->reg3
;store reg3,c
;C = A+B
necesidades 4 instrucciones.- A diferencia de 2-operand o 1-operand, esto deja los tres valores a, b, y c en los registros disponibles para su posterior reutilización.
- CISC — Se convierte en una sola instrucción:
- más operandos: algunas máquinas CISC permiten una variedad de modos de abordaje que permiten más de 3 operandos (registros o accesos a la memoria), como la instrucción de evaluación polinomio VAX "POLY".
Debido a la gran cantidad de bits necesarios para codificar los tres registros de una instrucción de 3 operandos, las arquitecturas RISC que tienen instrucciones de 16 bits son invariablemente diseños de 2 operandos, como Atmel AVR, TI MSP430 y algunas versiones. de BRAZO Pulgar. Las arquitecturas RISC que tienen instrucciones de 32 bits suelen ser diseños de 3 operandos, como las arquitecturas ARM, AVR32, MIPS, Power ISA y SPARC.
Cada instrucción especifica cierto número de operandos (registros, ubicaciones de memoria o valores inmediatos) explícitamente. Algunas instrucciones proporcionan uno o ambos operandos de forma implícita, por ejemplo, si se almacenan en la parte superior de la pila o en un registro implícito. Si algunos de los operandos se dan de forma implícita, es necesario especificar menos operandos en la instrucción. Cuando un "operando de destino" especifica explícitamente el destino, se debe proporcionar un operando adicional. En consecuencia, el número de operandos codificados en una instrucción puede diferir del número matemáticamente necesario de argumentos para una operación lógica o aritmética (la aridad). Los operandos están codificados en el "opcode" representación de la instrucción, o bien se dan como valores o direcciones después del código de operación.
Presión de registro
Presión de registros mide la disponibilidad de registros libres en cualquier momento durante la ejecución del programa. La presión de registro es alta cuando se utiliza una gran cantidad de registros disponibles; por lo tanto, cuanto mayor sea la presión del registro, más a menudo el contenido del registro debe volcarse en la memoria. Aumentar el número de registros en una arquitectura disminuye la presión de registro pero aumenta el costo.
Mientras que los conjuntos de instrucciones integradas, como Thumb, sufren una presión de registro extremadamente alta porque tienen conjuntos de registros pequeños, los RISC ISA de uso general como MIPS y Alpha disfrutan de una presión de registro baja. Los CISC ISA como x86-64 ofrecen una presión de registro baja a pesar de tener conjuntos de registros más pequeños. Esto se debe a los muchos modos de direccionamiento y optimizaciones (como direccionamiento de subregistro, operandos de memoria en instrucciones ALU, direccionamiento absoluto, direccionamiento relativo a la PC y derrames de registro a registro) que ofrecen los CISC ISA.
Longitud de la instrucción
El tamaño o la longitud de una instrucción varía mucho, desde tan solo cuatro bits en algunos microcontroladores hasta varios cientos de bits en algunos sistemas VLIW. Los procesadores utilizados en computadoras personales, mainframes y supercomputadoras tienen tamaños de instrucción mínimos entre 8 y 64 bits. La instrucción más larga posible en x86 es de 15 bytes (120 bits). Dentro de un conjunto de instrucciones, diferentes instrucciones pueden tener diferentes longitudes. En algunas arquitecturas, en particular en la mayoría de las computadoras con conjunto de instrucciones reducido (RISC), las instrucciones tienen una longitud fija, que normalmente se corresponden con el tamaño de palabra de esa arquitectura. En otras arquitecturas, las instrucciones tienen una longitud variable, típicamente múltiplos enteros de un byte o media palabra. Algunos, como ARM con Thumb-extension, tienen codificación variable mixta, es decir, dos codificaciones fijas, generalmente de 32 y 16 bits, donde las instrucciones no se pueden mezclar libremente. pero debe cambiarse entre una rama (o un límite de excepción en ARMv8).
Las instrucciones de longitud fija son menos complicadas de manejar que las instrucciones de longitud variable por varios motivos (no tener que comprobar si una instrucción se extiende a ambos lados de una línea de caché o un límite de página de memoria virtual, por ejemplo) y, por lo tanto, son algo más fáciles de optimizar para velocidad.
Densidad de código
A principios de la década de 1960, la memoria principal era cara y muy limitada, incluso en los mainframes. Minimizar el tamaño de un programa para asegurarse de que cabría en la memoria limitada a menudo era fundamental. Así, el tamaño de las instrucciones necesarias para realizar una tarea en particular, la densidad del código, era una característica importante de cualquier conjunto de instrucciones. Siguió siendo importante en las memorias inicialmente diminutas de las minicomputadoras y luego en los microprocesadores. La densidad sigue siendo importante hoy en día, para aplicaciones de teléfonos inteligentes, aplicaciones descargadas en navegadores a través de conexiones de Internet lentas y en ROM para aplicaciones integradas. Una ventaja más general del aumento de la densidad es la eficacia mejorada de las memorias caché y la captación previa de instrucciones.
Las computadoras con alta densidad de código a menudo tienen instrucciones complejas para la entrada de procedimientos, retornos parametrizados, bucles, etc. (por lo tanto, se denominan retroactivamente Computadoras con conjunto de instrucciones complejas, CISC). Sin embargo, más típico, o frecuente, "CISC" Las instrucciones simplemente combinan una operación ALU básica, como 'agregar', con el acceso de uno o más operandos en la memoria (usando modos de direccionamiento como directo, indirecto, indexado, etc.). Ciertas arquitecturas pueden permitir dos o tres operandos (incluido el resultado) directamente en la memoria o pueden realizar funciones como el incremento automático del puntero, etc. Los conjuntos de instrucciones implementados por software pueden tener instrucciones aún más complejas y poderosas.
Las computadoras con conjunto de instrucciones reducido, RISC, se implementaron ampliamente por primera vez durante un período de rápido crecimiento de los subsistemas de memoria. Sacrifican la densidad del código para simplificar los circuitos de implementación e intentan aumentar el rendimiento a través de frecuencias de reloj más altas y más registros. Una sola instrucción RISC generalmente realiza una sola operación, como "agregar" de registros o una "carga" de una ubicación de memoria a un registro. Un conjunto de instrucciones RISC normalmente tiene una longitud de instrucción fija, mientras que un conjunto de instrucciones CISC típico tiene instrucciones de longitud muy variable. Sin embargo, dado que las computadoras RISC normalmente requieren más instrucciones y, a menudo, más largas para implementar una tarea determinada, inherentemente hacen un uso menos óptimo del ancho de banda del bus y las memorias caché.
Ciertos RISC ISA incorporados, como Thumb y AVR32, suelen exhibir una densidad muy alta debido a una técnica llamada compresión de código. Esta técnica empaqueta dos instrucciones de 16 bits en una palabra de 32 bits, que luego se desempaqueta en la etapa de decodificación y se ejecuta como dos instrucciones.
Las computadoras con conjunto mínimo de instrucciones (MISC) son comúnmente una forma de máquina de pila, donde hay pocas instrucciones separadas (8–32), de modo que varias instrucciones pueden caber en una sola palabra de máquina. Estos tipos de núcleos a menudo requieren poco silicio para implementarse, por lo que se pueden realizar fácilmente en un FPGA o en forma de múltiples núcleos. La densidad de código de MISC es similar a la densidad de código de RISC; la mayor densidad de instrucciones se compensa al requerir más instrucciones primitivas para realizar una tarea.
Se ha investigado la compresión de ejecutables como mecanismo para mejorar la densidad del código. Las matemáticas de la complejidad de Kolmogorov describen los desafíos y límites de esta.
En la práctica, la densidad del código también depende del compilador. La mayoría de los compiladores de optimización tienen opciones que controlan si optimizar la generación de código para la velocidad de ejecución o para la densidad del código. Por ejemplo, GCC tiene la opción -Os para optimizar el tamaño del código de máquina pequeño y -O3 para optimizar la velocidad de ejecución a costa de un código de máquina más grande.
Representación
Las instrucciones que constituyen un programa rara vez se especifican usando su forma numérica interna (código de máquina); pueden ser especificados por programadores usando un lenguaje ensamblador o, más comúnmente, pueden ser generados por compiladores a partir de lenguajes de programación de alto nivel.
Diseño
El diseño de conjuntos de instrucciones es un tema complejo. Hubo dos etapas en la historia del microprocesador. El primero fue el CISC (computadora con conjunto de instrucciones complejas), que tenía muchas instrucciones diferentes. Sin embargo, en la década de 1970, lugares como IBM investigaron y descubrieron que se podían eliminar muchas instrucciones del conjunto. El resultado fue el RISC (computadora con conjunto de instrucciones reducido), una arquitectura que utiliza un conjunto de instrucciones más pequeño. Un conjunto de instrucciones más simple puede ofrecer el potencial para velocidades más altas, tamaño de procesador reducido y consumo de energía reducido. Sin embargo, un conjunto más complejo puede optimizar las operaciones comunes, mejorar la eficiencia de la memoria y la memoria caché, o simplificar la programación.
Algunos diseñadores de conjuntos de instrucciones reservan uno o más códigos de operación para algún tipo de llamada al sistema o interrupción de software. Por ejemplo, MOS Technology 6502 usa 00H, Zilog Z80 usa los ocho códigos C7,CF,D7,DF,E7,EF,F7,FFH mientras que Motorola 68000 usa códigos en el rango A000..AFFFH.
Las máquinas virtuales rápidas son mucho más fáciles de implementar si un conjunto de instrucciones cumple con los requisitos de virtualización de Popek y Goldberg.
La diapositiva NOP utilizada en la programación con conciencia de inmunidad es mucho más fácil de implementar si el "no programado" El estado de la memoria se interpreta como NOP.
En sistemas con múltiples procesadores, los algoritmos de sincronización sin bloqueo son mucho más fáciles de implementar si el conjunto de instrucciones incluye soporte para algo como "buscar y agregar", "cargar enlace/ almacenamiento condicional" (LL/SC), o "comparación e intercambio atómico".
Implementación del conjunto de instrucciones
Cualquier conjunto de instrucciones dado se puede implementar de varias maneras. Todas las formas de implementar un conjunto de instrucciones en particular proporcionan el mismo modelo de programación, y todas las implementaciones de ese conjunto de instrucciones pueden ejecutar los mismos ejecutables. Las diversas formas de implementar un conjunto de instrucciones ofrecen diferentes compensaciones entre costo, rendimiento, consumo de energía, tamaño, etc.
Al diseñar la microarquitectura de un procesador, los ingenieros usan bloques de "cableado duro" circuitos electrónicos (a menudo diseñados por separado) como sumadores, multiplexores, contadores, registros, ALU, etc. Luego, a menudo se usa algún tipo de lenguaje de transferencia de registros para describir la decodificación y secuenciación de cada instrucción de un ISA usando esta microarquitectura física. Hay dos formas básicas de construir una unidad de control para implementar esta descripción (aunque muchos diseños utilizan vías intermedias o compromisos):
- Algunos diseños de computadora "hardwire" el conjunto completo de instrucciones decodificación y secuenciación (como el resto de la microarquitectura).
- Otros diseños emplean rutinas o tablas de microcódigos (o ambas) para hacer esto –típicamente como ROMs en chip o PLAs o ambos (aunque RAMs y ROMs separados se han utilizado históricamente). El Western Digital MCP-1600 es un ejemplo más antiguo, utilizando un ROM dedicado y separado para microcódigo.
Algunos diseños utilizan una combinación de diseño cableado y microcódigo para la unidad de control.
Algunos diseños de CPU usan un almacén de control grabable: compilan el conjunto de instrucciones en una memoria RAM grabable o flash dentro de la CPU (como el procesador Rekursiv y el Imsys Cjip) o una FPGA (computación reconfigurable).
Un intérprete también puede emular una ISA en software. Naturalmente, debido a la sobrecarga de interpretación, esto es más lento que ejecutar programas directamente en el hardware emulado, a menos que el hardware que ejecuta el emulador sea un orden de magnitud más rápido. Hoy en día, es una práctica común que los proveedores de nuevas ISA o microarquitecturas pongan los emuladores de software a disposición de los desarrolladores de software antes de que la implementación del hardware esté lista.
A menudo, los detalles de la implementación tienen una fuerte influencia en las instrucciones particulares seleccionadas para el conjunto de instrucciones. Por ejemplo, muchas implementaciones de la canalización de instrucciones solo permiten una sola carga de memoria o almacenamiento de memoria por instrucción, lo que lleva a una arquitectura de almacenamiento de carga (RISC). Para otro ejemplo, algunas formas tempranas de implementar la canalización de instrucciones llevaron a una ranura de retraso.
Las demandas del procesamiento de señales digitales de alta velocidad han empujado en la dirección opuesta, obligando a que las instrucciones se implementen de una manera particular. Por ejemplo, para realizar filtros digitales lo suficientemente rápido, la instrucción MAC en un procesador de señal digital (DSP) típico debe usar un tipo de arquitectura Harvard que puede obtener una instrucción y dos palabras de datos simultáneamente, y requiere un solo ciclo de multiplicación y acumulación. multiplicador.
Contenido relacionado
Distancia de hamming
Código Morse
QNX