Microcódigo - Microcode

En el diseño de procesadores , el microcódigo es una técnica que interpone una capa de organización de la computadora entre el hardware de la CPU y la arquitectura de conjunto de instrucciones visible del programador de la computadora. El microcódigo es una capa de instrucciones a nivel de hardware que implementan instrucciones de código de máquina de nivel superior o secuenciación de máquina de estado interna en muchos elementos de procesamiento digital . El microcódigo se usa en unidades de procesamiento central de propósito general , aunque en las CPU de escritorio actuales, es solo una ruta de respaldo para los casos que la unidad de control cableada más rápida no puede manejar.

El microcódigo normalmente reside en una memoria especial de alta velocidad y traduce las instrucciones de la máquina, los datos de la máquina de estado u otra entrada en secuencias de operaciones detalladas a nivel de circuito. Separa las instrucciones de la máquina de la electrónica subyacente para que las instrucciones se puedan diseñar y modificar con mayor libertad. También facilita la construcción de instrucciones complejas de varios pasos, al tiempo que reduce la complejidad de los circuitos de la computadora. La escritura de microcódigo a menudo se denomina microprogramación y el microcódigo en una implementación de procesador particular a veces se denomina microprograma .

Más extensa microcoding permite a las pequeñas y simples microarquitectura a emular arquitecturas más potentes con mayor longitud de la palabra , más unidades de ejecución y así sucesivamente, que es una forma relativamente sencilla de lograr la compatibilidad de software entre los diferentes productos en una familia de procesadores.

Algunos proveedores de hardware, especialmente IBM , utilizan el término microcódigo como sinónimo de firmware . De esa manera, todo el código dentro de un dispositivo se denomina microcódigo, independientemente de que sea un microcódigo o un código de máquina ; por ejemplo, se dice que las unidades de disco duro tienen su microcódigo actualizado, aunque normalmente contienen tanto microcódigo como firmware.

Visión general

La capa más baja en la pila de software de una computadora es tradicionalmente instrucciones de código de máquina sin procesar para el procesador. En los procesadores microcodificados, el microcódigo busca y ejecuta esas instrucciones. Para evitar confusiones, cada elemento relacionado con el microprograma se diferencia por el prefijo micro : microinstrucción, microensamblador, microprogramador, microarquitectura , etc.

Los ingenieros normalmente escriben el microcódigo durante la fase de diseño de un procesador, almacenándolo en una memoria de solo lectura (ROM) o estructura de matriz lógica programable (PLA), o en una combinación de ambas. Sin embargo, también existen máquinas que tienen algunos o todos los microcódigos almacenados en SRAM o memoria flash . Esto se denota tradicionalmente como almacén de control grabable en el contexto de las computadoras, que puede ser memoria de solo lectura o de lectura y escritura . En el último caso, el proceso de inicialización de la CPU carga el microcódigo en el almacén de control desde otro medio de almacenamiento, con la posibilidad de alterar el microcódigo para corregir errores en el conjunto de instrucciones o para implementar nuevas instrucciones de máquina.

Los procesadores digitales complejos también pueden emplear más de una unidad de control (posiblemente basada en microcódigo) para delegar subtareas que deben realizarse esencialmente de forma asíncrona en paralelo. Un programador de alto nivel, o incluso un programador ensamblador , normalmente no ve ni cambia el microcódigo. A diferencia del código de máquina, que a menudo conserva cierta compatibilidad con versiones anteriores entre los diferentes procesadores de una familia, el microcódigo solo se ejecuta en el circuito electrónico exacto para el que está diseñado, ya que constituye una parte inherente del diseño particular del procesador en sí.

Los microprogramas consisten en una serie de microinstrucciones que controlan la CPU a un nivel muy fundamental de los circuitos de hardware. Por ejemplo, una sola microinstrucción horizontal típica podría especificar las siguientes operaciones:

  • Conecte el registro 1 al lado A de la ALU
  • Conecte el registro 7 al lado B de la ALU
  • Establecer la ALU para realizar en complemento a dos adición
  • Establezca la entrada de acarreo de la ALU en cero
  • Almacene el valor del resultado en el registro 8
  • Actualice los códigos de condición de las banderas de estado de ALU ( negativo , cero , desbordamiento y acarreo )
  • Microjump a micro PC nnn para la siguiente microinstrucción

Para controlar simultáneamente todas las funciones del procesador en un ciclo, la microinstrucción suele tener más de 50 bits; por ejemplo, 128 bits en un 360/85 con una función de emulador. Los microprogramas están cuidadosamente diseñados y optimizados para la ejecución más rápida posible, ya que un microprograma lento daría como resultado una instrucción de máquina lenta y un rendimiento degradado para los programas de aplicación relacionados que usan tales instrucciones.

Justificación

El microcódigo se desarrolló originalmente como un método más simple de desarrollar la lógica de control para una computadora . Inicialmente, los conjuntos de instrucciones de la CPU estaban cableados . Cada paso necesario para obtener, decodificar y ejecutar las instrucciones de la máquina (incluidos los cálculos , lecturas y escrituras de direcciones de operandos ) se controlaba directamente mediante lógica combinacional y circuitos de máquina de estados secuenciales bastante mínimos . Si bien estos procesadores cableados eran muy eficientes, la necesidad de conjuntos de instrucciones potentes con direccionamiento de varios pasos y operaciones complejas ( ver más abajo ) los hacía difíciles de diseñar y depurar; Las instrucciones altamente codificadas y de longitud variada también pueden contribuir a esto, especialmente cuando se utilizan codificaciones muy irregulares.

El microcódigo simplificó el trabajo al permitir que gran parte del comportamiento del procesador y el modelo de programación se definieran mediante rutinas de microprogramas en lugar de mediante circuitos dedicados. Incluso al final del proceso de diseño, el microcódigo se podía cambiar fácilmente, mientras que los diseños de CPU cableados eran muy engorrosos de cambiar. Por lo tanto, este diseño de CPU facilitó enormemente.

Desde la década de 1940 hasta finales de la de 1970, una gran parte de la programación se realizó en lenguaje ensamblador ; Las instrucciones de mayor nivel significan una mayor productividad del programador, por lo que una ventaja importante del microcódigo fue la relativa facilidad con la que se pueden definir poderosas instrucciones de máquina. La máxima extensión de esto son los diseños de "Lenguaje de alto nivel ejecutable directamente", en los que cada declaración de un lenguaje de alto nivel como PL / I se ejecuta completa y directamente mediante microcódigo, sin compilación. El proyecto IBM Future Systems y Data General Fountainhead Processor son ejemplos de esto. Durante la década de 1970, las velocidades de la CPU crecieron más rápidamente que las velocidades de la memoria y se utilizaron numerosas técnicas como la transferencia de bloques de memoria , la recuperación previa de memoria y las cachés de varios niveles para aliviar esto. Las instrucciones de máquina de alto nivel, hechas posibles por microcódigo, ayudaron aún más, ya que menos instrucciones de máquina más complejas requieren menos ancho de banda de memoria. Por ejemplo, una operación en una cadena de caracteres se puede realizar como una sola instrucción de máquina, evitando así la obtención de múltiples instrucciones.

Las arquitecturas con conjuntos de instrucciones implementadas por microprogramas complejos incluían IBM System / 360 y Digital Equipment Corporation VAX . El enfoque de conjuntos de instrucciones implementados por microcódigo cada vez más complejos se denominó más tarde CISC . Un enfoque alternativo, utilizado en muchos microprocesadores , es usar PLA o ROM (en lugar de lógica combinacional) principalmente para decodificar instrucciones, y dejar que una máquina de estado simple (sin mucho o ningún microcódigo) haga la mayor parte de la secuenciación. La tecnología MOS 6502 es un ejemplo de un microprocesador que utiliza un PLA para la decodificación y secuenciación de instrucciones. El PLA es visible en las microfotografías del chip y su funcionamiento se puede ver en la simulación a nivel de transistor.

La microprogramación todavía se utiliza en los diseños de CPU modernos. En algunos casos, después de depurar el microcódigo en la simulación, las funciones lógicas se sustituyen por el almacén de control. Las funciones lógicas suelen ser más rápidas y menos costosas que la memoria de microprograma equivalente.

Beneficios

Los microprogramas de un procesador operan en una arquitectura más primitiva, totalmente diferente y mucho más orientada al hardware que las instrucciones de ensamblaje visibles para los programadores normales. En coordinación con el hardware, el microcódigo implementa la arquitectura visible para el programador. El hardware subyacente no necesita tener una relación fija con la arquitectura visible. Esto facilita la implementación de una arquitectura de conjunto de instrucciones determinada en una amplia variedad de microarquitecturas de hardware subyacentes.

IBM System / 360 tiene una arquitectura de 32 bits con 16 registros de propósito general, pero la mayoría de las implementaciones de System / 360 en realidad usan hardware que implementó una microarquitectura subyacente mucho más simple; por ejemplo, el System / 360 Model 30 tiene rutas de datos de 8 bits a la unidad aritmética lógica (ALU) y la memoria principal e implementó los registros de propósito general en una unidad especial de memoria central de mayor velocidad , y el System / 360 Model 40 tiene rutas de datos de 8 bits a la ALU y rutas de datos de 16 bits a la memoria principal y también implementó los registros de propósito general en una unidad especial de memoria central de mayor velocidad. El Modelo 50 tiene rutas de datos completas de 32 bits e implementa los registros de propósito general en una unidad especial de memoria central de mayor velocidad. El modelo 65 al modelo 195 tienen rutas de datos más grandes e implementan los registros de propósito general en circuitos de transistores más rápidos. De esta manera, la microprogramación permitió a IBM diseñar muchos modelos System / 360 con hardware sustancialmente diferente y abarcando una amplia gama de costos y rendimiento, al tiempo que los hacía todos compatibles arquitectónicamente. Esto reduce drásticamente la cantidad de programas de software de sistema únicos que deben escribirse para cada modelo.

Digital Equipment Corporation (DEC) utilizó un enfoque similar en su familia de computadoras VAX. Como resultado, los diferentes procesadores VAX utilizan diferentes microarquitecturas, pero la arquitectura visible para el programador no cambia.

La microprogramación también reduce el costo de los cambios de campo para corregir defectos ( errores ) en el procesador; A menudo, un error se puede solucionar reemplazando una parte del microprograma en lugar de realizar cambios en la lógica y el cableado del hardware .

Historia

En 1947, el diseño del MIT Whirlwind introdujo el concepto de una tienda de control como una forma de simplificar el diseño de la computadora y avanzar más allá de los métodos ad hoc . El almacén de control es una matriz de diodos : una red bidimensional, donde una dimensión acepta "pulsos de tiempo de control" del reloj interno de la CPU, y la otra se conecta a señales de control en puertas y otros circuitos. Un "distribuidor de pulsos" toma los pulsos generados por el reloj de la CPU y los divide en ocho pulsos de tiempo separados, cada uno de los cuales activa una fila diferente de la red. Cuando la fila está activada, activa las señales de control conectadas a ella.

Descrito de otra manera, las señales transmitidas por la tienda de control se reproducen de forma muy parecida a la de un piano roll. Es decir, están controlados por una secuencia de palabras muy amplias construidas con bits y se "reproducen" secuencialmente. En una tienda de control, sin embargo, la "canción" es corta y se repite continuamente.

En 1951, Maurice Wilkes mejoró este concepto al agregar la ejecución condicional , un concepto similar al condicional en el software de computadora. Su implementación inicial consistió en un par de matrices: la primera generaba señales a la manera del almacén de control Whirlwind, mientras que la segunda matriz seleccionaba qué fila de señales (la palabra de instrucción del microprograma, por así decirlo) invocar en el siguiente ciclo. Los condicionales se implementaron proporcionando una forma en que una sola línea en el almacén de control podría elegir entre las alternativas en la segunda matriz. Esto condicionó las señales de control a la señal interna detectada. Wilkes acuñó el término microprogramación para describir esta característica y distinguirla de una simple tienda de control.

Ejemplos de

  • Se dice que el EMIDEC 1100 utiliza un almacén de control cableado que consta de cables enhebrados a través de núcleos de ferrita, conocidos como "los cordones".
  • La mayoría de los modelos de la serie IBM System / 360 están microprogramados:
    • El modelo 25 es único entre los modelos System / 360 en el uso de los 16 K bytes superiores de almacenamiento central para mantener el almacenamiento de control para el microprograma. El 2025 utiliza una microarquitectura de 16 bits con siete palabras de control (o microinstrucciones). Después del mantenimiento del sistema o al cambiar el modo de funcionamiento, el microcódigo se carga desde el lector de tarjetas, la cinta u otro dispositivo. La emulación IBM 1410 para este modelo se carga de esta manera.
    • El Modelo 30 utiliza una microarquitectura de 8 bits con solo unos pocos registros de hardware; todo lo que vio el programador es emulado por el microprograma. El microcódigo para este modelo también se guarda en tarjetas perforadas especiales, que se almacenan dentro de la máquina en un lector dedicado por tarjeta, llamado unidades "CROS" (almacenamiento de solo lectura de capacitores). Se agrega una unidad CROS adicional para máquinas solicitadas con emulación 1401/1440/1460 y para máquinas solicitadas con emulación 1620.
    • El Modelo 40 utiliza palabras de control de 56 bits. La caja 2040 implementa tanto el procesador principal System / 360 como el canal multiplex (el procesador de E / S). Este modelo utiliza lectores dedicados "TROS" similares a las unidades "CROS", pero con una captación inductiva (Transformer Read-only Store).
    • El Modelo 50 tiene dos rutas de datos internas que operan en paralelo: una ruta de datos de 32 bits utilizada para operaciones aritméticas y una ruta de datos de 8 bits utilizada en algunas operaciones lógicas. El almacén de control utiliza microinstrucciones de 90 bits.
    • El modelo 85 tiene una búsqueda de instrucciones (unidad I) y una ejecución (unidad E) separadas para proporcionar un alto rendimiento. La unidad I está controlada por hardware. La unidad E está microprogramada; las palabras de control tienen 108 bits de ancho en un 360/85 básico y más anchas si se instala una función de emulador.
  • El NCR 315 está microprogramado con núcleos de ferrita cableados a mano (una ROM ) pulsados ​​por un secuenciador con ejecución condicional. Los cables enrutados a través de los núcleos están habilitados para varios datos y elementos lógicos en el procesador.
  • Los procesadores PDP-11 de Digital Equipment Corporation , con la excepción del PDP-11/20, están microprogramados.
  • La mayoría de las miniordenadores Data General Eclipse están microprogramadas. La tarea de escribir microcódigo para el Eclipse MV / 8000 se detalla en el libro ganador del Premio Pulitzer titulado El alma de una nueva máquina .
  • Muchos sistemas de Burroughs están microprogramados:
  • El "microprocesador" B700 ejecuta códigos de operación a nivel de aplicación utilizando secuencias de microinstrucciones de 16 bits almacenadas en la memoria principal; cada uno de ellos es una operación de carga de registro o se asigna a una única instrucción de "nanocódigo" de 56 bits almacenada en la memoria de sólo lectura. Esto permite que un hardware relativamente simple actúe como un controlador periférico de mainframe o se empaquete como una computadora independiente.
  • El B1700 se implementa con hardware radicalmente diferente, incluida la memoria principal direccionable por bits, pero tiene una organización multicapa similar. El sistema operativo carga previamente el intérprete para cualquier idioma que se requiera. Estos intérpretes presentan diferentes máquinas virtuales para COBOL , Fortran , etc.
  • Las unidades vectoriales VU0 y VU1 de Sony PlayStation 2 son microprogramables; de hecho, solo se puede acceder a VU1 mediante microcódigo durante las primeras generaciones del SDK.
  • Los MicroCore Labs MCL86 , MCL51 y MCL65 son ejemplos de implementaciones de microsecuenciadores "verticales" altamente codificados de Intel 8086/8088, 8051 y MOS 6502.
  • El sistema informático Meta 4 Series 16 de Digital Scientific Corp. fue un sistema microprogramable por el usuario disponible por primera vez en 1970. El microcódigo tenía un estilo principalmente vertical con microinstrucciones de 32 bits. Las instrucciones se almacenaron en placas de programa reemplazables con una cuadrícula de posiciones de bits. Un (1) bit estaba representado por pequeños cuadrados de metal que fueron detectados por amplificadores, cero (0) bits por la ausencia de los cuadrados. El sistema se puede configurar con hasta 4K palabras de 16 bits de microstore. Uno de los productos de Digital Scientific fue un emulador para IBM 1130 .
  • Los procesadores x86 anteriores están completamente microcodificados; a partir del Intel 80486 , las instrucciones menos complicadas se implementan directamente en el hardware. Los procesadores x86 implementaron microcódigo parcheable (parche por BIOS o sistema operativo ) desde la microarquitectura Intel P6 y la microarquitectura AMD K7 .
  • Algunas tarjetas de video , controladores de interfaz de red inalámbrica implementaron microcódigo parcheable (parche por sistema operativo).

Implementación

Cada microinstrucción en un microprograma proporciona los bits que controlan los elementos funcionales que componen internamente una CPU. La ventaja sobre una CPU cableada es que el control interno de la CPU se convierte en una forma especializada de un programa informático. El microcódigo transforma así un complejo desafío de diseño electrónico (el control de una CPU) en un desafío de programación menos complejo. Para aprovechar esto, una CPU se divide en varias partes:

  • Un I-unidad puede decodificar instrucciones de hardware y determinar la dirección de microcódigo para el procesamiento de la instrucción en paralelo con el E-unidad .
  • Un microsecuenciador elige la siguiente palabra del almacén de control. Un secuenciador es principalmente un contador, pero generalmente también tiene alguna forma de saltar a una parte diferente del almacén de control dependiendo de algunos datos, generalmente datos del registro de instrucciones y siempre alguna parte del almacén de control. El secuenciador más simple es solo un registro cargado desde unos pocos bits del almacén de control.
  • Un conjunto de registros es una memoria rápida que contiene los datos de la unidad central de procesamiento. Puede incluir el contador de programa y el puntero de pila , y también puede incluir otros registros que no son fácilmente accesibles para el programador de la aplicación. A menudo, el conjunto de registros es un archivo de registro de triple puerto ; es decir, se pueden leer dos registros y escribir un tercero al mismo tiempo.
  • Una unidad aritmética y lógica realiza cálculos, generalmente suma, negación lógica, desplazamiento a la derecha y Y lógico. A menudo también realiza otras funciones.

También puede haber un registro de direcciones de memoria y un registro de datos de memoria , que se utilizan para acceder al almacenamiento principal de la computadora . Juntos, estos elementos forman una " unidad de ejecución ". La mayoría de las CPU modernas tienen varias unidades de ejecución. Incluso las computadoras simples suelen tener una unidad para leer y escribir en la memoria y otra para ejecutar el código de usuario. Estos elementos a menudo se pueden unir como un solo chip. Este chip viene en un ancho fijo que formaría un "corte" a través de la unidad de ejecución. Estos se conocen como chips de " rebanada de bits ". La familia AMD Am2900 es uno de los ejemplos más conocidos de elementos de segmento de bits. Las partes de las unidades de ejecución y las propias unidades de ejecución están interconectadas por un haz de cables llamado bus .

Los programadores desarrollan microprogramas utilizando herramientas de software básicas. Un microensamblador permite a un programador definir la tabla de bits de forma simbólica. Debido a su estrecha relación con la arquitectura subyacente, "el microcódigo tiene varias propiedades que dificultan la generación mediante un compilador". Un programa simulador está diseñado para ejecutar los bits de la misma manera que la electrónica y permite mucha más libertad para depurar el microprograma. Una vez finalizado el microprograma y probado exhaustivamente, a veces se utiliza como entrada a un programa de computadora que construye lógica para producir los mismos datos. Este programa es similar a los que se utilizan para optimizar una matriz lógica programable . Incluso sin una lógica totalmente óptima, la lógica optimizada heurísticamente puede reducir enormemente la cantidad de transistores del número requerido para un almacén de control de ROM. Esto reduce el costo de producción y la electricidad consumida por una CPU.

El microcódigo se puede caracterizar como horizontal o vertical , refiriéndose principalmente a si cada microinstrucción controla los elementos de la CPU con poca o ninguna decodificación (microcódigo horizontal) o requiere una decodificación extensa por lógica combinatoria antes de hacerlo (microcódigo vertical). En consecuencia, cada microinstrucción horizontal es más ancha (contiene más bits) y ocupa más espacio de almacenamiento que una microinstrucción vertical.

Microcódigo horizontal

"El microcódigo horizontal tiene varias microoperaciones discretas que se combinan en una sola microinstrucción para una operación simultánea". El microcódigo horizontal suele estar contenido en un almacén de control bastante amplio; no es raro que cada palabra tenga 108 bits o más. En cada tic de un reloj secuenciador se lee, decodifica y utiliza una palabra de microcódigo para controlar los elementos funcionales que componen la CPU.

En una implementación típica, una palabra de microprograma horizontal comprende grupos de bits bastante definidos. Por ejemplo, un arreglo simple podría ser:

Registrar fuente A Registrar fuente B Registro de destino Operación de unidades lógicas y aritméticas Tipo de salto Dirección de salto

Para que este tipo de micromáquina implemente una instrucción JUMP con la dirección que sigue al código de operación, el microcódigo puede requerir dos tics de reloj. El ingeniero que lo diseñaba escribiría el código fuente del microensamblador con un aspecto parecido a esto:

  # Any line starting with a number-sign is a comment
  # This is just a label, the ordinary way assemblers symbolically represent a 
  # memory address.
InstructionJUMP:
      # To prepare for the next instruction, the instruction-decode microcode has already
      # moved the program counter to the memory address register. This instruction fetches
      # the target address of the jump instruction from the memory word following the
      # jump opcode, by copying from the memory data register to the memory address register.
      # This gives the memory system two clock ticks to fetch the next 
      # instruction to the memory data register for use by the instruction decode.
      # The sequencer instruction "next" means just add 1 to the control word address.
   MDR, NONE, MAR, COPY, NEXT, NONE
      # This places the address of the next instruction into the PC.
      # This gives the memory system a clock tick to finish the fetch started on the
      # previous microinstruction.
      # The sequencer instruction is to jump to the start of the instruction decode.
   MAR, 1, PC, ADD, JMP, InstructionDecode
      # The instruction decode is not shown, because it is usually a mess, very particular
      # to the exact processor being emulated. Even this example is simplified.
      # Many CPUs have several ways to calculate the address, rather than just fetching
      # it from the word following the op-code. Therefore, rather than just one
      # jump instruction, those CPUs have a family of related jump instructions.

Para cada tick, es común encontrar que solo se usan algunas partes de la CPU, y los grupos restantes de bits en la microinstrucción son no operativos. Con un diseño cuidadoso de hardware y microcódigo, esta propiedad puede explotarse para paralelizar operaciones que utilizan diferentes áreas de la CPU; por ejemplo, en el caso anterior, la ALU no se requiere durante el primer tick, por lo que podría usarse para completar una instrucción aritmética anterior.

Microcódigo vertical

En el microcódigo vertical, cada microinstrucción está codificada de manera significativa, es decir, los campos de bits generalmente pasan a través de una lógica combinatoria intermedia que, a su vez, genera las señales de control y secuenciación reales para los elementos internos de la CPU (ALU, registros, etc.). Esto contrasta con el microcódigo horizontal, en el que los propios campos de bits producen directamente las señales de control y secuenciación o solo se codifican mínimamente. En consecuencia, el microcódigo vertical requiere longitudes de instrucción más pequeñas y menos almacenamiento, pero requiere más tiempo para decodificar, lo que resulta en un reloj de CPU más lento.

Algún microcódigo vertical es solo el lenguaje ensamblador de una computadora convencional simple que está emulando una computadora más compleja. Algunos procesadores, como los procesadores DEC Alpha y los microprocesadores CMOS en mainframes IBM System / 390 posteriores y mainframes z / Architecture , usan código de máquina, ejecutándose en un modo especial que le da acceso a instrucciones especiales, registros especiales y otros recursos de hardware que no son disponible para código de máquina normal, para implementar algunas instrucciones y otras funciones, como recorridos de tablas de páginas en procesadores Alpha. Esto se denomina PALcode en procesadores Alpha y milicode en procesadores de mainframe IBM.

Otra forma de microcódigo vertical tiene dos campos:

Seleccionar campo Valor de campo

El campo de selección selecciona qué parte de la CPU será controlada por esta palabra del almacén de control. El valor del campo realmente controla esa parte de la CPU. Con este tipo de microcódigo, un diseñador elige explícitamente hacer una CPU más lenta para ahorrar dinero al reducir los bits no utilizados en el almacén de control; sin embargo, la complejidad reducida puede aumentar la frecuencia de reloj de la CPU, lo que disminuye el efecto de un mayor número de ciclos por instrucción.

A medida que los transistores se volvieron más baratos, el microcódigo horizontal llegó a dominar el diseño de las CPU que utilizan microcódigo, y el microcódigo vertical se usa con menos frecuencia.

Cuando se utilizan tanto microcódigo vertical como horizontal, el microcódigo horizontal puede denominarse nanocódigo o picocódigo .

Tienda de control de escritura

Algunas computadoras se construyeron usando "microcódigo escribible". En este diseño, en lugar de almacenar el microcódigo en ROM o lógica cableada, el microcódigo se almacena en una RAM llamada almacenamiento de control de escritura o WCS . Este tipo de computadora a veces se denomina computadora de conjunto de instrucciones de escritura o WISC .

Muchas computadoras prototipo experimentales utilizan almacenes de control de escritura; También hay máquinas comerciales que utilizan microcódigo grabable, como Burroughs Small Systems , las primeras estaciones de trabajo Xerox , la familia DEC VAX 8800 ("Nautilus"), las máquinas Symbolics L y G, una serie de IBM System / 360 y System. / 370 , algunas máquinas DEC PDP-10 y Data General Eclipse MV / 8000 .

Muchos más máquinas ofrecen tiendas de control de escritura programables por el usuario como una opción, incluyendo la HP 2100 , DEC PDP-11/60 y Varian Data Máquinas V-70 de la serie miniordenadores . IBM System / 370 incluye una función denominada Carga inicial de microprograma ( IML o IMPL ) que se puede invocar desde la consola, como parte del reinicio de encendido ( POR ) o desde otro procesador en un complejo de multiprocesador estrechamente acoplado .

Algunas máquinas comerciales, por ejemplo IBM 360/85, tienen un almacenamiento de solo lectura y un almacén de control de escritura para microcódigo.

WCS ofrece varias ventajas, incluida la facilidad de parchear el microprograma y, para ciertas generaciones de hardware, un acceso más rápido que el que pueden proporcionar las ROM. El WCS programable por el usuario permite al usuario optimizar la máquina para fines específicos.

A partir del Pentium Pro en 1995, varias CPU x86 tienen microcódigo Intel grabable . Esto, por ejemplo, ha permitido que los errores en los microcódigos Intel Core 2 e Intel Xeon se corrijan al parchear sus microprogramas, en lugar de requerir que se reemplacen todos los chips. Un segundo ejemplo destacado es el conjunto de parches de microcódigo que Intel ofreció para algunas de sus arquitecturas de procesadores de hasta 10 años de antigüedad, en un intento por contrarrestar las vulnerabilidades de seguridad descubiertas en sus diseños, Spectre y Meltdown , que se hicieron públicas al principio. de 2018. Linux, FreeBSD , Microsoft Windows o el BIOS de la placa base pueden instalar una actualización de microcódigo .

Comparación con VLIW y RISC

La tendencia de diseño hacia procesadores altamente microcodificados con instrucciones complejas comenzó a principios de la década de 1960 y continuó hasta aproximadamente mediados de la década de 1980. En ese momento, la filosofía de diseño de RISC comenzó a ser más prominente.

Una CPU que usa microcódigo generalmente necesita varios ciclos de reloj para ejecutar una sola instrucción, un ciclo de reloj por cada paso en el microprograma para esa instrucción. Algunos procesadores CISC incluyen instrucciones que pueden tardar mucho en ejecutarse. Tales variaciones interfieren tanto con la latencia de interrupción como, lo que es mucho más importante en los sistemas modernos, con la canalización .

Al diseñar un nuevo procesador, un RISC de control cableado tiene las siguientes ventajas sobre el CISC microcodificado:

  • La programación se ha alejado en gran medida del nivel de ensamblaje, por lo que ya no vale la pena proporcionar instrucciones complejas por razones de productividad.
  • Los conjuntos de instrucciones más simples permiten la ejecución directa por hardware, evitando la penalización del rendimiento de la ejecución microcodificada.
  • El análisis muestra que las instrucciones complejas rara vez se utilizan, por lo que los recursos de la máquina dedicados a ellas se desperdician en gran medida.
  • Los recursos de la máquina dedicados a instrucciones complejas que rara vez se utilizan se utilizan mejor para acelerar la ejecución de instrucciones más sencillas y de uso común.
  • Las instrucciones microcodificadas complejas pueden requerir muchos ciclos de reloj que varían y son difíciles de canalizar para un mayor rendimiento.

También hay contrapuntos:

  • Es posible que las complejas instrucciones de las implementaciones muy microcodificadas no requieran muchos recursos adicionales de la máquina, a excepción del espacio del microcódigo. Por ejemplo, la misma ALU se usa a menudo para calcular una dirección efectiva, así como para calcular el resultado de los operandos reales (por ejemplo, el Z80 original , 8086 y otros).
  • Los compiladores modernos utilizan con frecuencia las instrucciones más simples que no son RISC (es decir, que involucran operandos de memoria directa ). Incluso se emplean comúnmente operaciones aritméticas inmediatas a apilar (es decir, resultado de memoria). Aunque tales operaciones de memoria, a menudo con codificaciones de longitud variable, son más difíciles de canalizar, todavía es completamente factible hacerlo, ejemplificado claramente por i486 , AMD K5 , Cyrix 6x86 , Motorola 68040 , etc.
  • Las instrucciones que no son RISC realizan de forma inherente más trabajo por instrucción (en promedio) y normalmente también están altamente codificadas, por lo que permiten un tamaño general más pequeño del mismo programa y, por lo tanto, un mejor uso de las memorias caché limitadas.

Muchos procesadores RISC y VLIW están diseñados para ejecutar todas las instrucciones (siempre que estén en la caché) en un solo ciclo. Esto es muy similar a la forma en que las CPU con microcódigo ejecutan una microinstrucción por ciclo. Los procesadores VLIW tienen instrucciones que se comportan de manera similar a un microcódigo horizontal muy amplio, aunque normalmente sin un control tan detallado sobre el hardware como lo proporciona el microcódigo. Las instrucciones RISC a veces son similares al microcódigo vertical estrecho.

La microcodificación ha sido popular en procesadores de aplicaciones específicas como procesadores de red , microcontroladores , procesadores de señales digitales , controladores de canal , controladores de disco , controladores de interfaz de red , unidades de procesamiento de gráficos y en otro hardware.

Micro operaciones

Las implementaciones modernas de CISC, como la familia x86 , decodifican instrucciones en microoperaciones almacenadas dinámicamente ("μops") con una codificación de instrucciones similar a RISC o microcódigo tradicional. Una unidad de decodificación de instrucciones cableada emite directamente μops para instrucciones x86 comunes, pero recurre a una ROM de microcódigo más tradicional para instrucciones más complejas o poco utilizadas.

Por ejemplo, un x86 puede buscar μops del microcódigo para manejar operaciones complejas de varios pasos como instrucciones de cadena o bucle, funciones trascendentales de unidad de punto flotante o valores inusuales como números desnormales e instrucciones de propósito especial como CPUID .

Ver también

Notas

Referencias

Otras lecturas

enlaces externos