Sie sind auf Seite 1von 18

Página 1

256 Capítulo 4 El procesador

4.1 Introducción

El Capítulo 1 explica que el rendimiento de una computadora está determinado por tres claves
factores: recuento de instrucciones, tiempo de ciclo de reloj y ciclos de reloj por instrucción (CPI).
El Capítulo 2 explica que el compilador y la arquitectura del conjunto de instrucciones determinan
el recuento de instrucciones requerido para un programa dado. Sin embargo, la implementación
del procesador determina tanto el tiempo de ciclo del reloj como el número de reloj
ciclos por instrucción. En este capítulo, construimos la ruta de datos y la unidad de control.
para dos implementaciones diferentes del conjunto de instrucciones LEGv8.
Este capítulo contiene una explicación de los principios y técnicas utilizadas en
Implementar un procesador, comenzando con un resumen altamente abstracto y simplificado.
en esta sección. Le sigue una sección que construye una ruta de datos y construye una
Versión simple de un procesador suficiente para implementar un conjunto de instrucciones como LEGv8.
La mayor parte del capítulo abarca la aplicación LEGv8 pipeline más realista,
seguido de una sección que desarrolla los conceptos necesarios para implementar más
Conjuntos de instrucciones complejas, como el x86.
Para el lector interesado en entender la interpretación de alto nivel de
Las instrucciones y su impacto en el rendimiento del programa, esta sección inicial y la sección
4.5 Presentar los conceptos básicos de la canalización. Las tendencias actuales están cubiertas en la sección
4.10, y la Sección 4.11 describe el reciente Intel Core i7 y ARM Cortex-A53
arquitecturas La sección 4.12 muestra cómo usar el paralelismo a nivel de instrucción para más
Que el doble del rendimiento de la matriz se multiplica de la Sección 3.9 . Estas secciones
proporcionar suficiente información para comprender los conceptos de canalización a un alto nivel.
Para el lector interesado en entender el procesador y su desempeño en
Más profundidad, las secciones 4.3, 4.4 y 4.6 serán útiles. Aquellos interesados ​en aprender como
para construir un procesador también debe cubrir las Secciones 4.2, 4.7, 4.8 y 4.9. Para lectores con
un interés en el diseño de hardware moderno, la Sección 4.13 describe cómo el hardware
Los lenguajes de diseño y las herramientas CAD se utilizan para implementar hardware, y luego cómo
use un lenguaje de diseño de hardware para describir una implementación canalizada. También da
Varias ilustraciones más de cómo se ejecuta el hardware de la canalización. (Los modelos de hardware.
en este capítulo han sido obtenidos por los autores y no implican aprobación ARM
arquitecturas.)

Una implementación básica de LEGv8


Examinaremos una implementación que incluya un subconjunto del núcleo LEGv8
conjunto de instrucciones:

■ Las instrucciones de referencia de memoria cargan el registro sin escalar ( LDUR ) y almacenan
registro sin escala ( STUR )

■ Las instrucciones aritmético-lógicas ADD, SUB, AND y ORR


■ Las instrucciones comparan y se ramifican en cero ( CBZ ) y en la rama ( B ), que
añadir el último

Página 2

4.1 Introducción 257

Este subconjunto no incluye todas las instrucciones de enteros (por ejemplo, shift,
multiplicar, y faltar la división), ni incluye instrucciones de punto flotante.
Sin embargo, ilustra los principios clave utilizados para crear una ruta de datos y diseñar
el control. La implementación de las instrucciones restantes es similar.
Al examinar la implementación, tendremos la oportunidad de ver cómo la
la arquitectura del conjunto de instrucciones determina muchos aspectos de la implementación, y cómo
La elección de varias estrategias de implementación afecta la frecuencia del reloj y el IPC para la
computadora. Muchos de los principios de diseño clave introducidos en el Capítulo 1 pueden ilustrarse
Al observar la implementación, como la simplicidad favorece la regularidad. Además, la mayoría
Los conceptos utilizados para implementar el subconjunto LEGv8 en este capítulo son las mismas ideas básicas
que se utilizan para construir un amplio espectro de computadoras, desde equipos de alto rendimiento
Servidores para microprocesadores de propósito general para procesadores embebidos.

Un resumen de la implementación
En el Capítuloaritmético-lógicas,
instrucciones 2 , observamos laslas
instrucciones principales
instrucciones de LEGv8,
de referencia incluido
de memoria y laelrama
número entero
instrucciones. Mucho de lo que se necesita hacer para implementar estas instrucciones es el
Igual, independiente de la clase exacta de instrucción. Para cada instrucción, la primera
Dos pasos son idénticos:
1. Envíe el contador de programas (PC) a la memoria que contiene el código y
obtener las instrucciones de esa memoria.
2. Lea uno o dos registros, usando los campos de la instrucción para seleccionar los registros
leer. Para las instrucciones LDUR y CBZ , necesitamos leer solo un registro,
pero la mayoría de las otras instrucciones requieren leer dos registros.
Después de estos dos pasos, las acciones requeridas para completar la instrucción dependen
en la clase de instrucción. Afortunadamente, para cada una de las tres clases de instrucción.
(memoria-referencia, aritmética-lógica, y ramas), las acciones son en gran parte las
Igual, independientemente de la instrucción exacta. La sencillez y regularidad de la
El conjunto de instrucciones LEGv8 simplifica la implementación al hacer la ejecución de
Muchas de las clases de instrucción son similares.
Por ejemplo, todas las clases de instrucción, excepto la rama incondicional, usan la aritmética
unidad lógica (ALU) después de leer los registros. Las instrucciones de referencia de memoria utilizan
La ALU para un cálculo de dirección, las instrucciones lógicas aritméticas para la operación.
Ejecución, y ramas condicionales para comparación a cero. Después de usar la ALU, la
Las acciones requeridas para completar varias clases de instrucción son diferentes. Una memoria de referencia
la instrucción deberá acceder a la memoria para leer datos de una carga o escribir datos
para una tienda. Una instrucción aritmética-lógica o de carga debe escribir los datos de la ALU
o la memoria de nuevo en un registro. Por último, para una instrucción de rama condicional, podemos
necesita cambiar la siguiente dirección de instrucción en función de la comparación; de lo contrario, el
La PC debe incrementarse en cuatro para obtener la dirección de la siguiente instrucción.
La Figura 4.1 muestra la vista de alto nivel de una implementación de LEGv8, centrándose en
Las distintas unidades funcionales y su interconexión. Aunque esta figura muestra
La mayor parte del flujo de datos a través del procesador, omite dos aspectos importantes de
Ejecución de instrucciones.

Página 3

258 Capítulo 4 El procesador

Primero, en varios lugares, La Figura 4.1 muestra los datos que van a una unidad particular como viene
de dos fuentes diferentes. Por ejemplo, el valor escrito en la PC puede venir
de uno de los dos sumadores, los datos escritos en el archivo de registro pueden provenir de
La ALU o la memoria de datos, y la segunda entrada a la ALU puede provenir de
Un registro o el campo inmediato de la instrucción. En la práctica, estas líneas de datos
no se puede simplemente conectar juntos; Hay que añadir un elemento lógico que elige desde
Entre las múltiples fuentes y dirige una de esas fuentes a su destino. Esta
La selección se realiza comúnmente con un dispositivo llamado multiplexor, aunque este dispositivo
mejor podría llamarse un selector de datos. El apéndice A describe el multiplexor, que
Selecciona entre varias entradas basadas en la configuración de sus líneas de control. los
Las líneas de control se establecen principalmente en base a la información tomada de la instrucción.
ser ejecutado.
La segunda omisión en La figura 4.1 es que varias de las unidades deben ser controladas.
Dependiendo del tipo de instrucción. Por ejemplo, la memoria de datos debe leer

Añadir Añadir

Datos
Registro #
ordenador personal
Dirección de Instrucción Registros ALU Dirección
Registro # Datos
Instrucción
memoria memoria
Registro #
Datos

FIGURA 4.1 Una vista abstracta de la implementación del subconjunto LEGv8 que muestra la
Las principales unidades funcionales y las principales conexiones entre ellas. Todas las instrucciones comienzan usando
el contador del programa para suministrar la dirección de instrucciones a la memoria de instrucciones. Después de la instrucción es
extraídos, los operandos de registro utilizados por una instrucción se especifican por los campos de esa instrucción. Una vez el
los operandos de registro se han recuperado, se pueden operar para calcular una dirección de memoria (para una carga o
almacenar), para calcular un resultado aritmético (para una instrucción aritmético-lógica entera), o una comparación a cero
(para una rama). Si la instrucción es una instrucción aritmética-lógica, el resultado de la ALU debe escribirse
a un registro. Si la operación es una carga o almacenamiento, el resultado de ALU se usa como una dirección para almacenar un valor de
los registros o cargar un valor de la memoria en los registros. El resultado de la ALU o memoria está escrito.
de nuevo en el archivo de registro. Las ramas requieren el uso de la salida ALU para determinar la siguiente instrucción
Dirección, que proviene de la ALU (donde se suman el PC y el desplazamiento de la rama) o de un sumador
que incrementa la PC actual en cuatro. Las líneas gruesas que interconectan las unidades funcionales representan autobuses,
que consisten en múltiples señales. Las flechas se utilizan para guiar al lector a saber cómo fluye la información.
Como las líneas de señal pueden cruzarse, mostramos explícitamente cuando las líneas que se cruzan están conectadas por la presencia de un
donde las lineas se cruzan.
Página 4

4.1 Introducción 259

en una carga y escribir en una tienda. El archivo de registro debe estar escrito solo en una carga o
Una instrucción aritmética-lógica. Y, por supuesto, la ALU debe realizar una de
Varias operaciones. (El apéndice A describe el diseño detallado de la ALU).
Los multiplexores, líneas de control que se establecen en base a varios campos en la instrucción.
Dirigir estas operaciones.
La figura 4.2 muestra la ruta de datos de Figura 4.1 con los tres multiplexores requeridos.
Agregado, así como líneas de control para las principales unidades funcionales. Una unidad de control,
que tiene la instrucción como entrada, se utiliza para determinar cómo configurar el control
Líneas para las unidades funcionales y dos de los multiplexores. El multiplexor superior,

Rama

METRO
tu
X

Añadir Añadir METRO


tu
X
Operación ALU
Datos

Registro # MemWrite
ordenador
Dirección
personal
de Instrucción Registros ALU Dirección
Registro # METRO Cero
Instrucción tu Datos
X memoria
memoria Registro #RegWrite
Datos
MemRead

Controlar

FIGURA 4.2 La implementación básica del subconjunto LEGv8, incluidos los multiplexores y las líneas de control necesarios. los
el multiplexor superior ("Mux") controla qué valor reemplaza a la PC (PC + 4 o la dirección de destino de la sucursal);
ese "AND" junto
El multiplexor es acontrolado
la salida cero depuerta.
por la la ALU y una señal de control que indica que la instrucción es una rama. El multiplexor medio, cuyo
la salida regresa al archivo de registro, se utiliza para dirigir la salida de la ALU (en el caso de una instrucción aritmética-lógica) o la salida de los datos
Memoria (en el caso de una carga) para escribir en el archivo de registro. Finalmente, el multiplexor de la parte inferior se usa para determinar si la segunda ALU
la entrada proviene de los registros (para una instrucción aritmética-lógica o una rama) o del campo de compensación de la instrucción (para una carga o almacena
las
los líneas de control agregadas son sencillas y determinan la operación realizada en la ALU, si la memoria de datos debe leer o escribir, y
Si los registros deben realizar una operación de escritura. Las líneas de control se muestran en color para que sean más fáciles de ver.

Página 5

260 Capítulo 4 El procesador

lo que determina si se escribe PC + 4 o la dirección de destino de la rama


en la PC, se establece en función de la salida cero de la ALU, que se utiliza para realizar
La comparación de una instrucción CBZ . La regularidad y sencillez del LEGv8.
conjunto de instrucciones significa que se puede usar un proceso de descodificación simple para determinar cómo
para establecer las líneas de control.
En el resto del capítulo, refinamos esta vista para completar los detalles, que
Requiere que agreguemos unidades funcionales adicionales, aumente el número de conexiones.
entre unidades, y, por supuesto, mejorar una unidad de control para controlar qué acciones
Se toman para diferentes clases de instrucción. Las secciones 4.3 y 4.4 describen un simple
Implementación que utiliza un solo ciclo de reloj largo para cada instrucción y sigue
la forma general de Figuras 4.1 y 4.2 . En este primer diseño, cada instrucción comienza.
la ejecución en un borde del reloj y completa la ejecución en el siguiente borde del reloj.
Aunque es más fácil de entender, este enfoque no es práctico, ya que el ciclo del reloj
debe ser estirado severamente para acomodar la instrucción más larga. Despues de diseñar
En el control de esta computadora simple, veremos la implementación canalizada con
Todas sus complejidades, incluidas las excepciones.

Comprobar¿Cuántos de los cinco componentes clásicos de una computadora, que se muestran en la página 255?
Tú mismo Las figuras 4.1 y 4.2 incluyen?
4.2 Convenciones de diseño lógico

Para discutir el diseño de una computadora, debemos decidir cómo la lógica del hardware
la implementación de la computadora funcionará y cómo se sincroniza la computadora. Esta
La sección revisa algunas ideas clave en lógica digital que usaremos ampliamente en este
capítulo. Si tiene poco o ningún fondo en lógica digital, lo encontrará útil
Leer el Apéndice A antes de continuar.
Los elementos de ruta de datos en la implementación de LEGv8 constan de dos
tipos de elementos lógicos: elementos que operan sobre valores de datos y elementos que
combinacional contienen estado Los elementos que operan en valores de datos son todos combinacionales , que
un elemento operacional significa que sus salidas dependen solo de las entradas actuales. Dada la misma entrada, un
elemento, como un ANDEl elemento combinacional produce siempre la misma salida. La ALU se muestra en Figura
puerta o una ALU 4.1 y discutido en el Apéndice A es un ejemplo de un elemento combinacional. Dado un
conjunto de entradas, siempre produce la misma salida porque no tiene almacenamiento interno.
Otros elementos en el diseño no son combinatorios, sino que contienen estado. Un
El elemento contiene estado si tiene algún almacenamiento interno. A estos elementos los llamamos estado.
elemento de estado A memoria
elemento, como un registro
elementos porque, si desconectamos el enchufe de la computadora, podríamos reiniciarlo
o un recuerdo. con precisión cargando los elementos de estado con los valores que contenían antes de que nosotros
sacó el tapón. Además, si guardamos y restauramos los elementos de estado, sería
Ser como si la computadora nunca hubiera perdido el poder. Así, estos elementos de estado completamente
Caracterizar el ordenador. En la figura 4.1 , las instrucciones y memorias de datos, como
así como los registros, son todos ejemplos de elementos de estado.

Página 6

4.2 Convenciones de diseño lógico 261

Un elemento de estado tiene al menos dos entradas y una salida. Las entradas requeridas son
el valor de datos que se escribirá en el elemento y el reloj, que determina cuándo
el valor de los datos se escribe. La salida de un elemento de estado proporciona el valor que
Fue escrito en un ciclo de reloj anterior. Por ejemplo, uno de los lógicamente más sencillos.
elementos de estado es un flip-flop tipo D (ver Apéndice A ), que tiene exactamente estos dos
Entradas (un valor y un reloj) y una salida. Además de los flip-flops, nuestro LEGv8
la implementación utiliza otros dos tipos de elementos de estado: memorias y registros,
ambos de los cuales aparecen en Figura 4.1 . El reloj se utiliza para determinar cuándo el estado
el elemento debe estar escrito; Un elemento de estado se puede leer en cualquier momento.
Los componentes lógicos que contienen estado también se denominan secuenciales, porque sus
Las salidas dependen tanto de sus entradas como del contenido del estado interno. por
ejemplo, la salida de la unidad funcional que representa los registros depende
tanto en los números de registro suministrados como en lo que estaba escrito en los registros
previamente. En el Apéndice A se discute el funcionamiento de la combinación y
Elementos secuenciales y su construcción con más detalle.

Metodología del reloj


Una metodología de temporización define cuándo se pueden leer las señales y cuándo se pueden leer.
cronometrando
escrito. Es importante especificar el tiempo de lectura y escritura, porque si una señal
metodología el
se escribe al mismo tiempo que se lee, el valor de la lectura podría corresponder enfoque utilizado para
determinar cuando los datos son
al valor antiguo, el valor recién escrito, o incluso alguna mezcla de los dos! Computadora
válido y estable en relación con
Los diseños no pueden tolerar tal imprevisibilidad. Se diseña una metodología de relojería.
el reloj.
hacer hardware predecible.
Para simplificar, asumiremos una metodología de reloj activada por el borde . Un disparado por el borde
Metodología de reloj activada por el borde significa que cualquier valor almacenadocronometrando
en una secuenciaun cronometro
los elementos lógicos se actualizan solo en el borde del reloj, que es una transición esquema en el que todo estado
rápida desde
los cambios
De bajo a alto o viceversa (ver Figura 4.3 ). Porque solo los elementos del estado pueden ocurren
almacenar un en un reloj
valor de datos, cualquier colección de lógica combinacional debe tener sus entradasborde.
provenientes de un
conjunto de elementos de estado y sus resultados escritos en un conjunto de elementos de estado. Las entradas
son valores que se escribieron en un ciclo de reloj anterior, mientras que las salidas son valores
que se puede utilizar en un ciclo de reloj siguiente.

Estado Estado
elemento Lógica combinacional elemento
1 2

Ciclo de reloj
FIGURA 4.3 La lógica combinacional, los elementos de estado y el reloj están estrechamente relacionados. en un
En el sistema digital síncrono, el reloj determina cuándo los elementos con estado escribirán valores en interno
almacenamiento. Cualquier entrada a un elemento de estado debe alcanzar un valor estable (es decir, haber alcanzado un valor desde el cual
no cambiarán hasta después del borde del reloj) antes de que el borde del reloj activo haga que se actualice el estado. Todos
los elementos de estado en este capítulo, incluida la memoria, se suponen activados por flanco positivo; es decir, cambian
en el borde ascendente del reloj.

Página 7

262 Capítulo 4 El procesador


La figura 4.3 muestra los dos elementos de estado que rodean un bloque de combinación
lógica, que opera en un solo ciclo de reloj: todas las señales deben propagarse desde el estado
elemento 1, a través de la lógica combinacional, y para indicar el elemento 2 en el momento de
un ciclo de reloj El tiempo necesario para que las señales alcancen el elemento de estado 2 define
La duración del ciclo de reloj.
señal de control una señal Para simplificar, no mostramos una señal de control de escritura cuando un elemento de estado es
utilizado para multiplexorescrito en cada borde activo del reloj. Por el contrario, si un elemento de estado no se actualiza en
selección o para dirigir Cada reloj, entonces se requiere una señal de control de escritura explícita. Tanto la señal del reloj
el funcionamiento de un y la señal de control de escritura son entradas, y el elemento de estado se cambia solo cuando
unidad Funcional; contrastes
la señal de control de escritura se activa y se produce un flanco de reloj.
con una señal de datos, que Usaremos la palabra afirmada para indicar una señal que es lógicamente alta y afirmar
contiene información
que es operado por un para especificar que una señal debe ser manejada lógicamente alta, y desactiva o desactiva
unidad Funcional. Para representar lógicamente bajo. Usamos los términos afirmar y desmentir porque cuando
implementamos hardware, a veces 1 representa lógicamente alto y a veces puede
afirmada la señal es Representan lógicamente bajo.
lógicamente alta o verdadera. Una metodología activada por el borde nos permite leer el contenido de un registro,
envíe el valor a través de alguna lógica combinacional, y escriba ese registro en el
desactivada la señal es
lógicamente bajo o falso.mismo ciclo de reloj. La figura 4.4 da un ejemplo genérico. No importa si nosotros
Supongamos que todas las escrituras tienen lugar en el borde ascendente del reloj (de bajo a alto) o en
la caída del borde del reloj (de alto a bajo), ya que las entradas a la combinación
el bloque lógico no puede cambiar excepto en el borde del reloj elegido. En este libro usamos
el borde del reloj ascendente. Con una metodología de temporización activada por el borde, no hay
retroalimentación dentro de un solo ciclo de reloj, y la lógica en la Figura 4.4 funciona correctamente.
En el Apéndice A , discutimos brevemente las restricciones de tiempo adicionales (como la configuración y
tiempos de espera), así como otras metodologías de tiempo.
Para la arquitectura LEGv8 de 64 bits, casi todos estos elementos lógicos y de estado
tendrá entradas y salidas de 64 bits de ancho, ya que es el ancho de la mayoría
de los datos que maneja el procesador. Dejaremos claro cada vez que una unidad tiene una
Entrada o salida que no sea de 64 bits de ancho. Las cifras indicarán los autobuses,
que son señales más anchas que 1 bit, con líneas más gruesas. A veces, querremos
combina varios autobuses para formar un autobús más ancho; por ejemplo, podemos querer obtener
un bus de 64 bits combinando dos buses de 32 bits. En tales casos, las etiquetas en las líneas de autobús.

Estado Lógica combinacional


elemento

FIGURA 4.4 Una metodología activada por el borde permite que un elemento de estado sea leído y
escrito en el mismo ciclo de reloj sin crear una carrera que podría llevar a indeterminado
valores de los datos.
el
Porborde del reloj
supuesto, activo
el ciclo delsereloj
produce. Ladebe
todavía retroalimentación no puedelargo
ser lo suficientemente ocurrir dentro
para de un
que los ciclode
valores deentrada
reloj debido a la activación
sean estables cuandopor flanco
Actualización del elemento de estado. Si la retroalimentación fuera posible, este diseño no podría funcionar correctamente. Nuestros diseños
en este capítulo y en el siguiente se basan en la metodología de temporización activada por el borde y en estructuras como la
Se muestra en esta figura.

Página 8

4.3 Construyendo un Datapath 263

dejará claro que estamos concatenando autobuses para formar un autobús más amplio. Flechas
también se agregan para ayudar a aclarar la dirección del flujo de datos entre elementos.
Finalmente, el color indica una señal de control contraria a una señal que transporta datos; esta
la distinción se hará más clara a medida que avanzamos en este capítulo.

Verdadero o falso: porque el archivo de registro se lee y se escribe en el mismo relojComprobar


ciclo, cualquier ruta de datos LEGv8 que use escrituras activadas por bordes debe tener más de una
Tú mismo
Copia del archivo de registro.

Elaboración: También hay una versión de 32 bits de la arquitectura ARMv8 y, naturalmente,


Bastante, la mayoría de los caminos en su implementación serían de 32 bits de ancho.

4.3 Construyendo un Datapath

Una forma razonable de iniciar un diseño de ruta de datos es examinar los componentes principales
Se requiere ejecutar cada clase de instrucciones LEGv8. Empecemos por arriba mirando
en qué elementos de ruta de datos necesita cada instrucción, y luego desciende
A través de los niveles de abstracción . Cuando mostramos los elementos de la ruta de datos, lo haremos
También muestran sus señales de control. Usamos la abstracción en esta explicación, comenzando
de abajo hacia arriba.
La Figura 4.5a muestra el primer elemento que necesitamos: una unidad de memoria para almacenar
Instrucciones de un programa e instrucciones de suministro dadas una dirección. Figura 4.5b
También muestra el contador de programas (PC) , que, como vimos en el Capítulo 2, es un registro.
que contiene la dirección de la instrucción actual. Por último, necesitaremos un sumador.
elemento de ruta de datos A
para incrementarselapuede
combinacional, PC a construir
la dirección de lade
a partir siguiente
la ALUinstrucción. Este sumador,
descrita en detalle queunidad
oesmantener
en el Apéndice utilizada
A simplemente para dentro
los datos operar de
en una
cableando las líneas de control para que el control siempre especifique una operación procesador.
de adición. EnNosotros
el LEGv8
dibujará dicha ALU con la etiqueta Agregar, como en la Figura 4.5 , para indicar que implementación,
tiene la
Los elementos de la ruta de datos incluyen
ha sido hecho permanentemente un sumador y no puede realizar las otras funcionesladeinstrucción
ALU. y los datos
Para ejecutar cualquier instrucción, debemos comenzar por obtener la instrucciónrecuerdos,
de el registro
memoria. Para prepararnos para ejecutar la siguiente instrucción, también debemos archivo,
incrementar
la ALU,la y los agregadores.
Programe el contador para que apunte a la siguiente instrucción, 4 bytes después. Figura 4.6
muestra cómo combinar los tres elementos de la Figura 4.5 para formar una ruta de contador
datos de programa
(PC) El registro
que obtiene instrucciones e incrementa la PC para obtener la dirección del siguienteque contiene la dirección
instrucción secuencial. de la instrucción en el
Ahora consideremos las instrucciones en formato R (vea la Figura 2.21 en la página 124). en ejecución.
programa
Todos ellos leen dos registros, realizan una operación ALU en los contenidos de la
registros, y escribir el resultado en un registro. Llamamos a estas instrucciones ya sea tipo R
instrucciones o instrucciones aritmético-lógicas (ya que realizan aritmética o
operaciones lógicas). Esta clase de instrucción incluye ADD, SUB, AND y ORR , que

Página 9

264 Capítulo 4 El procesador

Instrucción
dirección
Instrucción ordenador personal Añadir suma
Instrucción
memoria

a. Memoria de instrucciones segundo. Contador de


do.programa
Sumador
FIGURA 4.5 Se necesitan dos elementos de estado para almacenar y acceder a las instrucciones, y una
se necesita un sumador para calcular la siguiente dirección de instrucciones. Los elementos del estado son la instrucción.
Memoria y el contador del programa. La memoria de instrucciones solo necesita proporcionar acceso de lectura porque la
datapath no escribe instrucciones. Como la memoria de instrucciones solo lee, la tratamos como combinatoria
lógica: la salida en cualquier momento refleja el contenido de la ubicación especificada por la entrada de la dirección, y no se lee
Se necesita señal de control. (Tendremos que escribir la memoria de instrucciones cuando carguemos el programa; esto es
no es difícil de agregar, y lo ignoramos por simplicidad.) El contador del programa es un registro de 64 bits que se escribe en la
Final de cada ciclo de reloj y por lo tanto no necesita una señal de control de escritura. El sumador es una ALU cableada para siempre.
agregue sus dos entradas de 64 bits y coloque la suma en su salida.

fueron introducidos en el capítulo 2 . Recordemos que una instancia típica de tal instrucción
es ADD X1, X2, X3 , que lee X2 y X3 y escribe la suma en X1 .
Los 32 registros de propósito general del procesador se almacenan en una estructura llamada
registrar archivo A estado Registrar archivo . Un archivo de registro es una colección de registros en los que cualquier registro puede ser
elemento que consiste leído o escrito especificando el número del registro en el archivo. El archivo de registro
de un conjunto de registros que el estado de registro de la computadora. Además, necesitaremos una ALU para
Contiene
se puede leer y escribir Operar sobre los valores leídos de los registros.
suministrando un registro Las instrucciones en formato R tienen tres operandos de registro, por lo que necesitaremos leer dos
Número a acceder.
palabras de datos del archivo de registro y escriba una palabra de datos en el archivo de registro para
cada instrucción Para que cada palabra de datos se lea de los registros, necesitamos una entrada
al archivo de registro que especifica el número de registro a leer y una salida de
el archivo de registro que llevará el valor que se ha leído de los registros. A
escriba una palabra de datos, necesitaremos dos entradas: una para especificar el número de registro a ser
escrito y uno para suministrar los datos que se escribirán en el registro. El archivo de registro
siempre da salida al contenido de cualquier número de registro que esté en el registro de lectura
entradas Sin embargo, las escrituras están controladas por la señal de control de escritura, que debe ser
afirmado para que se produzca una escritura en el borde del reloj. La figura 4.7a muestra el resultado; nosotros
necesita un total de cuatro entradas (tres para los números de registro y una para los datos) y dos
Salidas (tanto para los datos). Las entradas de número de registro tienen 5 bits de ancho para especificar una
de 32 registros (32 = 2 5 ), mientras que la entrada de datos y dos buses de salida de datos son cada uno
64 bits de ancho.
La Figura 4.7b muestra la ALU, que toma dos entradas de 64 bits y produce una de 64 bits.
resultado, así como una señal de 1 bit si el resultado es 0. La señal de control de 4 bits de la ALU
se describe en detalle en el Apéndice A ; Vamos a revisar el control de ALU en breve cuando
Necesitamos saber como configurarlo.

Página 10

4.3 Construyendo un Datapath 265

Añadir
4

Leer
ordenador personal
dirección
Instrucción
Instrucción
memoria

FIGURA 4.6 Una parte de la ruta de datos utilizada para obtener instrucciones e incrementar
El contador del programa. La instrucción recuperada es utilizada por otras partes de la ruta de datos.

5 Leer
registro 1 4 Operación ALU
Leer
Registro 5 Leer datos 1
números registro 2 Cero
Datos ALUALU
5 EscribirRegistros
resultado
registro Leer
Escribir datos 2
Datos Datos
RegWrite
a. Registros segundo. ALU
FIGURA 4.7 Los dos elementos necesarios para implementar operaciones de ALU en formato R son los
Registrar archivo y la ALU. El archivo de registro contiene todos los registros y tiene dos puertos de lectura y uno
escribir puerto El diseño de los archivos de registro multipuerto se describe en la Sección A.8 del Apéndice A. El registro
el archivo siempre genera el contenido de los registros correspondientes a las entradas del registro de lectura en las salidas;
no se necesitan otras entradas de control. En contraste, una escritura de registro debe indicarse explícitamente mediante la afirmación de
escribir la señal de control. Recuerde que las escrituras se activan desde el borde, de modo que todas las entradas de escritura (es decir, el valor a
debe escribirse, el número de registro y la señal de control de escritura) deben ser válidos en el borde del reloj. Ya que escribe
Los archivos de registro se activan desde el borde, nuestro diseño puede leer y escribir legalmente el mismo registro en un reloj
ciclo: la lectura obtendrá el valor escrito en un ciclo de reloj anterior, mientras que el valor escrito estará disponible para
Una lectura en un ciclo de reloj posterior. Las entradas que llevan el número de registro al archivo de registro son todos 5 bits
de ancho, mientras que las líneas que transportan valores de datos son de 64 bits de ancho. La operación a realizar por la ALU es
controlado con la señal de operación ALU, que tendrá un ancho de 4 bits, utilizando la ALU diseñada en el Apéndice A.
Usaremos la salida de detección de cero de la ALU en breve para implementar ramas condicionales.

Página 11

266 Capítulo 4 El procesador

A continuación, considere el registro de carga LEGv8 y guarde las instrucciones de registro,


que tienen la forma general LDUR X1, [X2, offset_value] o STUR X1,
[X2, offset_value] . Estas instrucciones calculan una dirección de memoria agregando
El registro base, que es X2 , al campo de desplazamiento firmado de 9 bits contenido en el
instrucción. Si la instrucción es una tienda, el valor a almacenar también debe leerse
del archivo de registro donde reside en X1 . Si la instrucción es una carga, el valor
la lectura de la memoria debe escribirse en el archivo de registro en el registro especificado,
que es X1 . Por lo tanto, necesitaremos tanto el archivo de registro como la ALU de la Figura 4.7 .
firmar-extender para aumentar Además, necesitaremos una unidad para extender el campo de desplazamiento de 9 bits en el
el tamaño de un elementoinstrucción
de datos pora un valor firmado de 64 bits, y una unidad de memoria de datos para leer o escribir
replicando el orden superior
a. La memoria de datos debe estar escrita en las instrucciones de la tienda; por lo tanto, memoria de datos
firmar un poco del original
tiene señales de control de lectura y escritura, una entrada de dirección y una entrada para que los datos sean
elemento de datos en el alto
escrito en la memoria. La figura 4.8 muestra estos dos elementos.
pedir bits de los más grandes,
elemento de datos de destino. La instrucción CBZ tiene dos operandos, un registro que se prueba para cero, y
un desplazamiento de 19 bits utilizado para calcular la dirección de destino de la rama en relación con la rama
objetivo de rama dirección de instrucciones. Su forma es CBZ X1, offset . Para implementar esta instrucción,
dirección la dirección debemos calcular la dirección de destino de la sucursal agregando el desplazamiento extendido de signo
especificado en una rama,Campo de la instrucción al PC. Hay dos detalles en la definición de rama.
que se convierte en el nuevo
contador del programa (PC)Instrucciones
si (ver capítulo 2 ) a las que debemos prestar atención:
se toma la rama. En el
Arquitectura LEGv8, la ■ La arquitectura del conjunto de instrucciones especifica que la base para la dirección de la sucursal
El cálculo es la dirección de la instrucción de rama.
El objetivo de la rama está dado por
la suma del campo de desplazamiento
de la instrucción y la ■ La arquitectura también indica que el campo de desplazamiento se desplaza hacia la izquierda 2 bits para que
es una palabra offset; este cambio aumenta el rango efectivo del campo de compensación en un
Dirección de la sucursal. factor de 4.
rama tomada Para lidiar con esta última complicación, tendremos que cambiar el campo de desplazamiento en 2.
Una rama donde el Además de calcular la dirección de destino de la sucursal, también debemos determinar si
condición de la rama es la siguiente instrucción es la instrucción que sigue secuencialmente o la instrucción en
satisfecho y el programa la dirección de la rama de destino. Cuando la condición es verdadera (es decir, el operando es cero), el
contador (PC) se convierteLaendirección de destino de la sucursal se convierte en la nueva PC, y decimos que se toma la sucursal . Si
el objetivo de la rama. Todos
ramas incondicionales el operando no es cero, la PC incrementada debe reemplazar la PC actual (al igual que
Se toman ramas. para cualquier otra instrucción normal); En este caso, decimos que no se toma la rama .
Por lo tanto, la ruta de datos de la rama debe realizar dos operaciones: calcular el objetivo de la rama
rama no tomada o Dirigir y probar el contenido del registro. (Las ramas también afectan la instrucción fetch
(rama sin tomar) parte de la ruta de datos, como trataremos en breve.) La figura 4.9 muestra la estructura.
Una rama donde el del segmento de ruta de datos que maneja ramas. Para calcular el objetivo de la rama
la condición de la rama esdirección,
falsa la ruta de datos de la rama incluye una unidad de extensión de señal, de la Figura 4.8 y
y el contador del programaun sumador. Para realizar la comparación, necesitamos usar el archivo de registro que se muestra en Figura
(PC) se convierte en la dirección
de la instrucción que 4.7a para suministrar el operando de registro (aunque no tendremos que escribir en el
sigue secuencialmente el registrar archivo). Además, la comparación se puede hacer utilizando la ALU que diseñamos.
rama. en el apéndice a . Dado que esa ALU proporciona una señal de salida que indica si

Pagina 12

4.3 Construyendo un Datapath 267

MemWrite
Leer
Dirección datos
32 Firmar-64
Datos ampliar
Escribir memoria
datos

MemRead
a. Unidad de memoria de datos segundo. Unidad de extensión de señal
FIGURA 4.8 Las dos unidades necesarias para implementar cargas y almacenes, además de la
El archivo de registro y la ALU de la Figura 4.7 son la unidad de memoria de datos y la unidad de extensión de rótulos.
La unidad de memoria es un elemento de estado con entradas para la dirección y los datos de escritura, y una salida única para
El resultado leído. Hay controles de lectura y escritura separados, aunque solo uno de estos puede ser activado en
cualquier reloj dado. La unidad de memoria necesita una señal de lectura, ya que, a diferencia del archivo de registro, lee el valor de
una dirección no válida puede causar problemas, como veremos en el Capítulo 5 . La unidad de extensión de señal tiene una de 32 bits.
instrucción como entrada que selecciona un 9 bits para cargar y almacenar o un campo de 19 bits para comparar y derivar en cero que
El signo se extiende a un resultado de 64 bits que aparece en la salida (consulte el Capítulo 2 ). Asumimos que la memoria de datos es
Edge-disparado para escrituras. Los chips de memoria estándar realmente tienen una señal de habilitación de escritura que se utiliza para las escrituras.
Aunque la función de escritura no es activada por el borde, nuestro diseño activado por el borde podría adaptarse fácilmente al trabajo
Con chips de memoria reales. Consulte la Sección A.8 del Apéndice A para obtener más información sobre cómo utilizar chips de memoria reales.
trabajo.

el resultado fue 0, podemos enviar el operando de registro a la ALU con el control establecido en
pasar el valor de registro. Si se confirma la señal de cero de la unidad ALU, lo sabemos
que el valor de registro es cero. Aunque la salida cero siempre señala si el resultado
es 0, lo usaremos solo para implementar la prueba de comparación de ramas condicionales.
Más adelante, le mostraremos exactamente cómo conectar las señales de control de la ALU para su uso.
en la ruta de datos.
La instrucción de bifurcación opera agregando la PC con los 26 bits más bajos de
La instrucción se desplaza a la izquierda por 2 bits. Simplemente concatenando 00 al offset de la rama.
logra este cambio, como se describe en el Capítulo 2 .

Creando un único Datapath


Ahora que hemos examinado los componentes de ruta de datos necesarios para el individuo
clases de instrucción, podemos combinarlas en una única ruta de datos y agregar el control
Para completar la implementación. Esta ruta de datos más simple intentará ejecutar todos
Instrucciones en un ciclo de reloj. Este diseño significa que ningún recurso de ruta de datos puede ser
utilizado más de una vez por instrucción, por lo que cualquier elemento necesario más de una vez debe
ser duplicado Por lo tanto, necesitamos una memoria para instrucciones separadas de una para
datos. Aunque algunas de las unidades funcionales necesitarán ser duplicadas, muchas de las
Los elementos pueden ser compartidos por diferentes flujos de instrucciones.

Página 13

268 Capítulo 4 El procesador

PC + 4 de la instrucción datapath
Rama
Añadir suma objetivo
Cambio
izquierda 2
Leer
Instrucción registro 1 4 Operación ALU
Leer
Leer datos 1
registro 2 Para ramificar
ALU Zero
EscribirRegistros lógica de control
registro Leer 2
datos
Escribir
datos
RegWrite

32 Firmar-64
ampliar

FIGURA 4.9 La ruta de datos para una rama usa la ALU para evaluar la condición de la rama
y un sumador separado para calcular el objetivo de la rama como la suma de la PC y el signo
19 bits extendidos de la instrucción (el desplazamiento de rama), desplazados a la izquierda 2 bits. La unidad
etiquetado Shift left 2 es simplemente un enrutamiento de las señales entre la entrada y la salida que agrega 00 al orden inferior
dos

final del campo de desplazamiento de signo extendido; no se necesita hardware de cambio real, ya que la cantidad del "cambio" es
constante. Como sabemos que el desplazamiento se extendió por signo de 19 bits, el cambio solo tirará "signo"
bits ”. La lógica de control se utiliza para decidir si el PC incrementado o el objetivo de rama debe reemplazar el PC,
Basado en la salida cero de la ALU.

Para compartir un elemento de ruta de datos entre dos clases de instrucción diferentes, podemos
es necesario permitir múltiples conexiones a la entrada de un elemento, utilizando un multiplexor
y señal de control para seleccionar entre las múltiples entradas.

Construyendo un Datapath
EJEMPLO
Las operaciones de instrucciones aritmético-lógicas (o tipo R) y la memoria.
Las instrucciones datapath son bastante similares. Las diferencias clave son las siguientes:

■ Las instrucciones aritmético-lógicas usan la ALU, con las entradas que vienen
De los dos registros. Las instrucciones de memoria también pueden utilizar la ALU.
para hacer el cálculo de la dirección, aunque la segunda entrada es la signatura
Campo de desplazamiento extendido de 9 bits de la instrucción.

Página 14

4.3 Construyendo un Datapath 269

■ El valor almacenado en un registro de destino proviene de la ALU (para un


Instrucción de tipo R) o la memoria (para una carga).
Mostrar cómo construir una ruta de datos para la parte operativa de la memoria
Instrucciones de referencia y aritmético-lógicas que utilizan un único archivo de registro.
y una sola ALU para manejar ambos tipos de instrucciones, agregando cualquier
multiplexores.

Para crear una ruta de datos con un solo archivo de registro y una sola ALU, debemos
RESPONDER
admite dos fuentes diferentes para la segunda entrada ALU, así como dos fuentes diferentes
Fuentes para los datos almacenados en el archivo de registro. Así, se coloca un multiplexor.
en la entrada ALU y otra en la entrada de datos al archivo de registro. Figura 4.10
Muestra la parte operativa de la ruta de datos combinada.

Ahora podemos combinar todas las piezas para hacer una ruta de datos simple para el núcleo LEGv8
arquitectura agregando la ruta de datos para la obtención de instrucciones ( Figura 4.6 ), la ruta de datos
A partir de las instrucciones de tipo R y memoria ( Figura 4.10 ), y la ruta de datos para las ramas.
( Figura 4.9 ). La Figura 4.11 muestra la ruta de datos que obtenemos al componer la
piezas. La instrucción de bifurcación usa la ALU principal para probar el operando de registro, por lo que
debemos mantener el sumador de la Figura 4.9 para calcular la dirección de destino de la sucursal.
Se requiere un multiplexor adicional para seleccionar la siguiente secuencia
la dirección de instrucciones (PC + 4) o la dirección de destino de la rama que se escribirá en la PC.

Leer
registro 1 4 Operación ALU
Leer MemWrite
Leer datos 1
Cero MemtoReg
Instrucción registro 2 ALUSrc
RegistrosLeer ALUALU Leer
Escribir 0 Dirección 1
METRO resultado
datos 2 datos METRO
registro tu
tu X
X
Escribir 1 0
datos Datos
Escribirmemoria
RegWrite datos

32 Firmar-64 MemRead
ampliar

FIGURA 4.10 La ruta de datos para las instrucciones de memoria y las instrucciones de tipo R. Esta
el ejemplo muestra
multiplexores. cómo se dos
Se necesitan puede ensamblar una
multiplexores, única
como ruta de datos
se describe en elaejemplo.
partir de las piezas en las Figuras 4.7 y 4.8 agregando

Página 15

270 Capítulo 4 El procesador

PCSrc

METRO
Añadir tu
X
ALU
Añadir
4 resultado
Cambio
izquierda 2

Leer personal Leer


ordenador registro 1 ALUSrc4 Operación ALU
dirección Leer MemWrite
Leer datos 1 MemtoReg
registro 2 Cero
Instrucción Registros ALUALU Leer
Escribir Leer Dirección
Instrucción registro datos 2 METRO resultado datos METRO
memoria tu tu
Escribir X X
datos EscribirDatos
RegWrite datos memoria
32 Firmar-
64 MemRead
ampliar

FIGURA 4.11 La ruta de datos simple para la arquitectura LEGv8 central combina los elementos
Requerido por las diferentes clases de instrucción. Los componentes provienen de Figuras 4.6, 4.9 y 4.10 . Esta
datapath puede ejecutar las instrucciones básicas (registro de almacenamiento-carga, operaciones ALU y sucursales) en un solo
ciclo de reloj. Solo se necesita un multiplexor adicional para integrar las ramas. El soporte para incondicional.
Las ramas se añadirán más tarde.

Comprobar I. ¿Cuál de las siguientes opciones es correcta para una instrucción de carga? Referirse a Figura 4.10 .
Tú mismo
a. MemtoReg debe configurarse para hacer que los datos de la memoria se envíen al
Registrar archivo.
segundo. MemtoReg debe configurarse para hacer que el destino de registro correcto sea
enviado al archivo de registro.
do. No nos importa la configuración de MemtoReg para cargas.
II. La ruta de datos de un solo ciclo descrita conceptualmente en esta sección debe tener
Instrucciones separadas y memorias de datos, porque
a. Los formatos de datos e instrucciones son diferentes en LEGv8, y por lo tanto
Se necesitan diferentes recuerdos;
segundo. tener recuerdos separados es menos costoso;
do. el procesador funciona en un ciclo y no puede usar un (un solo puerto)
Memoria para dos accesos diferentes dentro de ese ciclo.

Página 16

4.4 Un esquema de implementación simple 271

Ahora que hemos completado esta ruta de datos simple, podemos agregar la unidad de control.
La unidad de control debe poder tomar entradas y generar una señal de escritura para cada
elemento de estado, el control selector para cada multiplexor y el control ALU. los
El control de ALU es diferente de varias maneras, y será útil diseñarlo primero
Antes de diseñar el resto de la unidad de control.

Elaboración: La lógica de extensión de signo debe elegir entre la extensión de signo de 9 bits.
campo en los bits de instrucción 20:12 para instrucciones de transferencia de datos o un campo de 19 bits (bits 23: 5)
Para la rama condicional. Como la entrada es de todos los 32 bits de la instrucción, puede usar la
Opcode bits de la instrucción para seleccionar el campo apropiado. El bit 26 de código de operación LEGv8 pasa a
ser 0 para instrucciones de transferencia de datos y 1 para rama condicional. Así, el bit 26 puede controlar
un multiplexor 2: 1 dentro de la lógica de extensión de signo que selecciona el campo de 9 bits si es 0 o
El campo de 19 bits si es 1.

4.4 Un esquema de implementación simple

En esta sección, analizamos lo que podría pensarse como una implementación simple
de nuestro subconjunto LEGv8. Construimos esta implementación simple usando la ruta de datos de
the last section and adding a simple control function. This simple implementation
covers load register ( LDUR ), store register ( STUR ), compare and branch zero ( CBZ ),
and the arithmetic-logical instructions ADD,SUB,AND , and ORR . We will later
enhance the design to include an unconditional branch instruction ( B ).

The ALU Control


The LEGv8 ALU in Appendix A defines the six following combinations of four
control inputs:

ALU control lines Función


0000 Y
0001 O
0010 añadir
0110 subtract
0111 pass input b
1100 NOR
Depending on the instruction class, the ALU will need to perform one of these
first five functions. (NOR can be used for other parts of the LEGv8 instruction set
not found in the subset we are implementing.) For load register and store register
instructions, we use the ALU to compute the memory address by addition. por
the R-type instructions, the ALU needs to perform one of the four actions (AND,
OR, subtract, or add), depending on the value of the 11-bit opcode field in the

Página 17

272 Chapter 4 The Processor

instruction (see Chapter 2 ). For compare and branch zero, the ALU just passes the
register input value.
We can generate the 4-bit ALU control input using a small control unit that
has as inputs the opcode field of the instruction and a 2-bit control field, which
we call ALUOp. ALUOp indicates whether the operation to be performed should
be add (00) for loads and stores, pass input b (01) for CBZ , or be determined by
the operation encoded in the opcode field (10). The output of the ALU control
unit is a 4-bit signal that directly controls the ALU by generating one of the 4-bit
combinations shown previously.
In Figure 4.12 , we show how to set the ALU control inputs based on the 2-bit
ALUOp control and the 11-bit opcode. Later in this chapter, we will see how the
ALUOp bits are generated from the main control unit.
This style of using multiple levels of decoding—that is, the main control unit
generates the ALUOp bits, which then are used as input to the ALU control that
generates the actual signals to control the ALU unit—is a common implementation
técnica. Using multiple levels of control can reduce the size of the main control
unidad. Using several smaller control units may also potentially reduce the latency of
the control unit. Such optimizations are important, since the latency of the control
unit is often a critical factor in determining the clock cycle time.
There are several different ways to implement the mapping from the 2-bit
ALUOp field and the 11-bit opcode field to the four ALU operation control bits.
Because only a small number of the 2048 possible values of the opcode field are of
interest and the opcode field is used only when the ALUOp bits equal 10, we can
use a small piece of logic that recognizes the subset of possible values and generates
the appropriate ALU control signals.
As a step in designing this logic, it is useful to create a truth table for the
interesting combinations of the opcode field and the ALUOp signals, as we've done

Instrucción Desired ALU control


Instruction ALUOp operación Opcode field ALU action input
LDUR 00 load register XXXXXXXXXXX añadir 0010
STUR 00 store register XXXXXXXXXXX añadir 0010
CBZ 01 comparar y XXXXXXXXXXX pass input b 0111
branch on zero
R-type 10 ADD 10001011000 añadir 0010
R-type 10 SUB 11001011000 subtract 0110
R-type 10 Y 10001010000Y 0000
R-type 10 ORR 10101010000O 0001

FIGURE 4.12 How the ALU control bits are set depends on the ALUOp control bits and the
different opcodes for the R-type instruction. The instruction, listed in the first column, determines
the setting of the ALUOp bits. All the encodings are shown in binary. Notice that when the ALUOp code is
00 or 01, the desired ALU action does not depend on the opcode field; in this case, we say that we “don't care”
about the value of the opcode, and the bits are shown as Xs. When the ALUOp value is 10, then the opcode
is used to set the ALU control input. See Appendix A .
Página 18
4.4 A Simple Implementation Scheme 273

in Figure 4.13 ; this truth table shows how the 4-bit ALU control is set depending truth table From logic, a
on these two input fields. Since the full truth table is very large (2 13 = 8192 entries),representation of a logical
and we don't care about the value of the ALU control for many of these input operation by listing all the
combinations, we show only the truth table entries for which the ALU control mustvalues of the inputs and
then in each case showing
have a specific value. Throughout this chapter, we will use this practice of showingwhat the resulting outputs
only the truth table entries for outputs that must be asserted and not showing those should be.
that are all deasserted or don't care. (This practice has a disadvantage, which we
discuss in Section C.2 of Appendix C .)
Because in many instances we do not care about the values of some of the inputs,
and because we wish to keep the tables compact, we also include don't-care termsdon't-care . term An
A don't-care term in this truth table (represented by an X in an input column) element of a logical
indicates that the output does not depend on the value of the input corresponding function in which the
to that column. For example, when the ALUOp bits are 00, as in the first row of output does not depend
Figure 4.13 , we always set the ALU control to 0010, independent of the opcode. Enon the values of all the
this case, then, the opcode inputs will be don't cares in this line of the truth table. inputs. Don't-care terms
Later, we will see examples of another type of don't-care term. If you are unfamiliarmay be specified in
diferentes caminos.
with the concept of don't-care terms, see Appendix A for more information.
Once the truth table has been constructed, it can be optimized and then turned
into gates. This process is completely mechanical. Thus, rather than show the final
steps here, we describe the process and the result in Section C.2 of Appendix C .

Designing the Main Control Unit


Now that we have described how to design an ALU that uses the opcode and a 2-bit
signal as its control inputs, we can return to looking at the rest of the control. A
start this process, let's identify the fields of an instruction and the control lines that
are needed for the datapath we constructed in Figure 4.11 . To understand how to
connect the fields of an instruction to the datapath, it is useful to review the formats

ALUOp Opcode field


ALUOp1 ALUOp0 I[31] I[30] I[29] I[28] I[27] I[26] I[25] I[24] I[23] I[22] I[21] Operación
0 0 X X X X X X X X X X X 0010
X 1 X X X X X X X X X X X 0111
1 X 1 0 0 0 1 0 1 1 0 0 0 0010
1 X 1 1 0 0 1 0 1 1 0 0 0 0110
1 X 1 0 0 0 1 0 1 0 0 0 0 0000
1 X 1 0 1 0 1 0 1 0 0 0 0 0001
FIGURE 4.13 The truth table for the 4 ALU control bits (called Operation). The inputs are the ALUOp and opcode field. Solamente
the entries for which the ALU control is asserted are shown. Some don't-care entries have been added. For example, the ALUOp does not use the
encoding 11, so the truth table can contain entries 1X and X1, rather than 10 and 01. While we show all 11 bits of the opcode, note that the only
bits with different values for the four R-format instructions are bits 30, 29, and 24. Thus, we only need these three opcode bits as input for ALU
control instead of all 11.

Página 19

274 Chapter 4 The Processor

Campo opcode Rm shamt Rn Rd


Bit positions 31:21 20:16 15:10 9:5 4:0
a. R-type instruction

Campo 1986 or 1984 dirección 0 Rn Rt


Bit positions 31:21 20:12 11:10 9:5 4:0
segundo. Load or store instruction

Campo 180 dirección Rt


Bit positions 31:26 23:5 4:0
do. Conditional branch instruction

FIGURE 4.14 The three instruction classes (R-type, load and store, and conditional branch)
use three different instruction formats. The unconditional branch instruction uses another format,
which we will discuss shortly. (a) Instruction format for R-format instructions, have three register operands:
Rn, Rm, and Rd. Fields Rn and Rm are sources, and Rd is the destination. The ALU function is in the opcode
field and is decoded by the ALU control design in the previous section. The R-type instructions that we
implement are ADD,SUB, AND, and ORR. The shamt field is used only for shifts; we will ignore it in this
chapter. (b) Instruction format for load (opcode = 1986 ) and store (opcode = 1984 ) instructions. los
ten ten

register Rn is the base register that is added to the 9-bit address field to form the memory address. For loads,
Rt is the destination register for the loaded value. For stores, Rt is the source register whose value should be
stored into memory. (c) Instruction format for compare and branch on zero (opcode = 180). The register Rt
is the source register that is tested for zero. The 19-bit address field is sign-extended, shifted, and added to the
PC to compute the branch target address.

of the three instruction classes: the R-type, branch, and load-store instructions.
Figure 4.14 shows these formats.
There are several major observations about this instruction format that we will
rely on:
opcode The field that ■ The opcode field, which as we saw in Chapter 2 , is between 6 and 11 bits wide
denotes the operation and and found in bits 31:26 to 31:21.
format of an instruction.
■ The first register operand is always in bit positions 9:5 (Rn) for both R-type
instructions and for the base register for load and store instructions.

■ The other register operand is in one of two places. It is in bit positions 20:16
(Rm) for R-type instructions and it is in bit positions 4:0 (Rt) for the register
to be written by a load. That is also the field that specifies the register to be
tested for zero for compare and branch on zero. Thus, we will need to add
a multiplexor to select which field of the instruction is used to indicate the
register number to be read.

■ Another operand can also be a 19-bit offset for compare and branch on zero
or a 9-bit offset for load and store.

■ The destination register for R-type instructions (Rd) and for loads (Rt) is in
bit positions 4:0.
The first design principle from Chapter 2 —simplicity favors regularity—pays off
here in specifying control.

Página 20

4.4 A Simple Implementation Scheme 275

PCSrc
0
Add METRO
tu
X
ALU
4 resultado 1
Add
RegWrite Shift
left 2
Instruction [9-5] Read
Read personal MemWrite
ordenador 0 register Read
dirección Instruction [20-16] 1
Read data 1 ALUSrc
METRO MemtoReg
tu
Instrucción X register 2 Zero
[31-0] 1 EscribirRead ALU ALU DirecciónRead 1
data 2 0 resultado datos METRO
InstrucciónInstruction [4-0] registro METRO tu
memoria tu X
Reg2LocEscribir X 0
datosRegisters 1
Datos
Escribir
memoria
datos
Instruction [31-0] 32 Sign- 64
ampliar ALU
controlar MemRead
Instruction [31-21]
ALUOp

FIGURE 4.15 The datapath of Figure 4.11 with all necessary multiplexors and all control
lines identified. The control lines are shown in color. The ALU control block has also been added. The PC
does not require a write control, since it is written once at the end of every clock cycle; the branch control
logic determines whether it is written with the incremented PC or the branch target address.

Using this information, we can add the instruction labels and extra multiplexor
(for the Read register 2 number input of the register file) to the simple datapath.
Figure 4.15 shows these additions plus the ALU control block, the write signals for
state elements, the read signal for the data memory, and the control signals for the
multiplexors. Since all the multiplexors have two inputs, they each require a single
control line.
Figure 4.15 shows seven single-bit control lines plus the 2-bit ALUOp control
signal. We have already defined how the ALUOp control signal works, and it is
useful to define what the seven other control signals do informally before we
determine how to set these control signals during instruction execution. Figure
4.16 describes the function of these seven control lines.
Now that we have looked at the function of each of the control signals, we can
look at how to set them. The control unit can set all but one of the control signals
based solely on the opcode field of the instruction. The PCSrc control line is the
exception. That control line should be asserted if the instruction is compare and
branch on zero (a decision that the control unit can make) and the Zero output of
the ALU, which is used for the zero test, is asserted. To generate the PCSrc signal,
we will need to AND together a signal from the control unit, which we call Branch,
with the Zero signal out of the ALU.

Página 21

276 Chapter 4 The Processor

Signal
nombre Effect when deasserted Effect when asserted
Reg2Loc The register number for Read register
The register
2 number for Read register 2
comes from the Rm field (bits 20:16).
comes from the Rt field (bits 4:0).
RegWrite Ninguna. The register on the Write register input is
written with the value on the Write data input.
ALUSrc The second ALU operand comes from The second
the ALU operand is the sign-
second register file output (Read data
extended,
2). lower 16 bits of the instruction.
PCSrc The PC is replaced by the output ofThe
thePC is replaced by the output of the adder
adder that computes the value of PCthat+computes
4. the branch target.
MemRead Ninguna. Data memory contents designated by the
address input are put on the Read data output.
MemWriteNinguna. Data memory contents designated by the
address input are replaced by the value on
the Write data input.
MemtoReg The value fed to the register WriteThedata
value fed to the register Write data input
input comes from the ALU. comes from the data memory.

FIGURE 4.16 The effect of each of the seven control signals. When the 1-bit control to a two-
way multiplexor is asserted, the multiplexor selects the input corresponding to 1. Otherwise, if the control
is deasserted, the multiplexor selects the 0 input. Remember that the state elements all have the clock as an
implicit input and that the clock is used in controlling writes. Gating the clock externally to a state element
can create timing problems. (See Appendix A for further discussion of this problem.)

These nine control signals (seven from Figure 4.16 and two for ALUOp) can
now be set based on the input signals to the control unit, which are the opcode
bits 31 to 21. Figure 4.17 shows the datapath with the control unit and the control
signals.
Before we try to write a set of equations or a truth table for the control unit, it
will be useful to try to define the control function informally. Because the setting
of the control lines depends only on the opcode, we define whether each control
signal should be 0, 1, or don't care (X) for each of the opcode values. Figure 4.18
defines how the control signals should be set for each opcode; this information
follows directly from Figures 4.12, 4.16, and 4.17 .

Operation of the Datapath


With the information contained in Figures 4.16 and 4.18 , we can design the control
unit logic, but before we do that, let's look at how each instruction uses the datapath.
In the next few figures, we show the flow of three different instruction classes
through the datapath. The asserted control signals and active datapath elements
are highlighted in each of these. Note that a multiplexor whose control is 0 has
a definite action, even if its control line is not highlighted. Multiple-bit control
signals are highlighted if any constituent signal is asserted.
Figure 4.19 shows the operation of the datapath for an R-type instruction, such
as ADD X1,X2,X3 . Although everything occurs in one clock cycle, we can think

Página 22

4.4 A Simple Implementation Scheme 277

0
Add METRO
tu
X
ALU
4 resultado 1
Add
Shift
Reg2Loc left 2
Branch
MemRead
Instruction [31–21] MemtoReg
Controlar
ALUOp
MemWrite
ALUSrc
RegWrite
Instruction [9-5] Read
Read
ordenador personal
dirección 0 register Read
Instruction [20-16] 1
METRO
Read data 1
tu Zero
Instrucción X register 2
[31–0] 1 ALUALU DirecciónRead 1
EscribirRead 0 resultado datos METRO
InstrucciónInstruction [4-0] registrodata 2 METRO tu
memoria tu X
Escribir X
datosRegisters 1 0
Datos
Escribir
memoria
datos
Instruction [31–0] 32 Sign- 64
ampliar ALU
controlar

Instruction [31–21]

FIGURE 4.17 The simple datapath with the control unit. The input to the control unit is the 11-bit opcode field from the instruction.
The outputs of the control unit consist of three 1-bit signals that are used to control multiplexors (Reg2Loc, ALUSrc, and MemtoReg), three
signals for controlling reads and writes in the register file and data memory (RegWrite, MemRead, and MemWrite), a 1-bit signal used in
determining whether to possibly branch (Branch), and a 2-bit control signal for the ALU (ALUOp). An AND gate is used to combine the
branch control signal and the Zero output from the ALU; the AND gate output controls the selection of the next PC. Notice that PCSrc is now
a derived signal, rather than one coming directly from the control unit. Thus, we drop the signal name in subsequent figures.

of four steps to execute the instruction; these steps are ordered by the flow of
information:
1. The instruction is fetched, and the PC is incremented.
2. Two registers, X2 and X3 , are read from the register file; also, the main
control unit computes the setting of the control lines during this step.
3. The ALU operates on the data read from the register file, using portions of
the opcode to generate the ALU function.
4. The result from the ALU is written into the destination register ( X1 ) in the
register file.

Página 23

278 Chapter 4 The Processor

Instrucción Reg2Loc ALUSrc MemtoReg RegWrite MemRead MemWrite Branch ALUOp1 ALUOp0
R-format 0 0 0 1 0 0 0 1 0
LDUR X 1 1 1 1 0 0 0 0
STUR 1 1 X 0 0 1 0 0 0
CBZ 1 0 X 0 0 0 1 0 1
FIGURE 4.18 The setting of the control lines is completely determined by the opcode fields of the instruction. los
first row of the table corresponds to the R-format instructions (ADD,SUB, AND, and ORR). For all these instructions, the source register
fields are Rn and Rm, and the destination register field is Rd; this defines how the signals ALUSrc and Reg2Loc are set. Furthermore, an
R-type instruction writes a register (RegWrite = 1), but neither reads nor writes data memory. When the Branch control signal is 0, the PC is
unconditionally replaced with PC + 4; otherwise, the PC is replaced by the branch target if the Zero output of the ALU is also high. The ALUOp
field for R-type instructions is set to 10 to indicate that the ALU control should be generated from the opcode field. The second and third rows
of this table give the control signal settings for LDUR and STUR. These ALUSrc and ALUOp fields are set to perform the address calculation.
The MemRead and MemWrite are set to perform the memory access. Finally, Reg2Loc and RegWrite are set for a load to cause the result to be
stored in the Rt register. The ALUOp field for branch is set for a pass input b (ALU control = 01), which is used to test for zero. Notice that the
MemtoReg field is irrelevant when the RegWrite signal is 0: since the register is not being written, the value of the data on the register data write
port is not used. Thus, the entry MemtoReg in the last two rows of the table is replaced with X for don't care. A don't care can also be added to
Reg2Loc for LDUR, which doesn't use a second register. This type of don't care must be added by the designer, since it depends on knowledge
of how the datapath works.

0
Add METRO
tu
X
4 ALU
Addresultado 1
Shift
Reg2Loc left 2
Branch
MemRead
Instruction [31–21] MemtoReg
Controlar
ALUOp
MemWrite
ALUSrc
RegWrite
Instruction [9-5] Read
Read
ordenador personal
dirección 0 register Read
Instruction [20-16] 1
tu Read data 1
METRO
Zero
Instrucción X register 2 ALU
[31–0] 1 EscribirRead 0 ALU DirecciónRead 1
InstrucciónInstruction [4-0] registrodata 2 METROresultado datos METRO
memoria tu tu
Escribir X X
datosRegisters 1 0
Datos
Escribir
memoria
datos
Instruction [31–0] 32 Sign- 64
ampliar ALU
controlar

Instruction [31–21]

FIGURE 4.19 The datapath in operation for an R-type instruction, such as ADD X1,X2,X3. The control lines, datapath units,
and connections that are active are highlighted.

Página 24

4.4 A Simple Implementation Scheme 279

Similarly, we can illustrate the execution of a load register, such as


LDUR X1, [X2,offset]
in a style similar to Figure 4.19 . Figure 4.20 shows the active functional units and
asserted control lines for a load. We can think of a load instruction as operating in
five steps (similar to how the R-type executed in four):
1. An instruction is fetched from the instruction memory, and the PC is
incremented.
2. A register ( X2 ) value is read from the register file.
3. The ALU computes the sum of the value read from the register file and the
sign-extended 9 bits of the instruction ( offset ).
4. The sum from the ALU is used as the address for the data memory.
5. The data from the memory unit is written into the register file ( X1 ).

0
Add METRO
tu
X
ALU
4 resultado 1
Add
Shift
Reg2Loc left 2
Branch
MemRead
Instruction [31–21] MemtoReg
Controlar
ALUOp
MemWrite
ALUSrc
RegWrite
Instruction [9-5] Read
Read
ordenador personal
dirección 0 register Read
Instruction [20-16] 1
METRO data 1
tu Read
register 2 Zero
Instrucción X
[31–0] 1 ALUALU DirecciónRead 1
EscribirRead 0 resultado datos METRO
InstrucciónInstruction [4-0] registrodata 2 METRO tu
memoria tu X
Escribir X
datosRegisters 1 0
Datos
Escribir
datosmemoria
Instruction [31–0] 32 Sign- 64
ampliar ALU
controlar

Instruction [31–21]

FIGURE 4.20 The datapath in operation for a load instruction. The control lines, datapath units, and connections that are active
are highlighted. A store instruction would operate very similarly. The main difference would be that the memory control would indicate a write
rather than a read, the second register value read would be used for the data to store, and the operation of writing the data memory value to
the register file would not occur.

Página 25

280 Chapter 4 The Processor

Finally, we can show the operation of the compare-and-branch-on-zero


instruction, such as CBZ X1, offset , in the same fashion. It operates much like
an R-format instruction, but the ALU output is used to determine whether the PC
is written with PC + 4 or the branch target address. Figure 4.21 shows the four
steps in execution:
1. An instruction is fetched from the instruction memory, and the PC is
incremented.
2. The register, X1 is read from the register file using bits 4:0 of the instruction (Rt).
3. The ALU passes the data value read from the register file. The value of PC is
added to the sign-extended, 19 bits of the instruction ( offset ) are shifted
left by two; the result is the branch target address.
4. The Zero status information from the ALU is used to decide which adder
result to store in the PC.

0
Add METRO
tu
X
4 ALU
Addresultado 1
Shift
Reg2Loc left 2
Branch
MemRead
Instruction [31–21] MemtoReg
Controlar
ALUOp
MemWrite
ALUSrc
RegWrite
Instruction [9-5] Read
Read
ordenador personal
dirección 0 register Read
Instruction [20-16] 1
METRO data 1
tu Read Zero
Instrucción X register 2
[31–0] 1 ALUALU DirecciónRead 1
EscribirRead 0 resultado datos METRO
InstrucciónInstruction [4-0] registrodata 2 METRO tu
memoria tu X
Escribir X 0
datosRegisters 1 Datos
Escribir
memoria
datos
Instruction [31–0] 32 Sign- 64
ampliar ALU
controlar

Instruction [31–21]
FIGURE 4.21 The datapath in operation for a compare-and-branch-on-zero instruction. The control lines, datapath units, and
connections that are active are highlighted. After using the register file and ALU to perform the compare, the Zero output is used to select the
next program counter from between the two candidates.

Página 26

4.4 A Simple Implementation Scheme 281

Finalizing Control
Now that we have seen how the instructions operate in steps, let's continue with
the control implementation. The control function can be precisely defined using
the contents of Figure 4.18 . The outputs are the control lines, and the input is the
opcode field. Thus, we can create a truth table for each of the outputs based on the
binary encoding of the opcodes.
Figure 4.22 defines the logic in the control unit as one large truth table that single-cycle
combines all the outputs and that uses the opcode bits as inputs. It completely implementation Also
specifies the control function, and we can implement it directly in gates in an called single clock cycle
automated fashion. We show this final step in Section C.2 in Appendix C . implementation . Un
Now that we have a single-cycle implementation of most of the LEGv8 core implementation in which
an instruction is executed
instruction set, let's add the unconditional branch instruction to show how the in one clock cycle. Mientras
basic datapath and control can be extended to handle other instructions in the easy to understand, it is
instruction set. too slow to be practical.

Input or output Signal name R-format LDUR STUR CBZ


Inputs I[31] 1 1 1 1
I[30] X 1 1 0
I[29] X 1 1 1
I[28] 0 1 1 1
I[27] 1 1 1 0
I[26] 0 0 0 1
I[25] 1 0 0 0
I[24] X 0 0 0
I[23] 0 0 0 X
I[22] 0 1 0 X
I[21] 0 0 0 X
Outputs Reg2Loc 0 X 1 1
ALUSrc 0 1 1 0
MemtoReg 0 1 X X
RegWrite 1 1 0 0
MemRead 0 1 0 0
MemWrite 0 0 1 0
Branch 0 0 0 1
ALUOp1 1 0 0 0
ALUOp0 0 0 0 1

FIGURE 4.22 The control function for the simple single-cycle implementation is
completely specified by this truth table. The top half of the table gives the combinations of input
signals that correspond to the four instruction classes, one per column, that determine the control output
ajustes The bottom portion of the table gives the outputs for each of the four opcodes. Thus, the output
RegWrite is asserted for two different combinations of the inputs. We simplified the truth table by using don't
cares in the input portion to combine the four R-format instructions together in one column; we could have
instead replaced that single column with four columns for the instructions ADD, SUB, AND, and ORR. los
outputs would have been the same for all four of these R-format instructions.

Página 27

282 Chapter 4 The Processor

Implementing Unconditional Branches


EXAMPLE
Figure 4.17 shows the implementation of many of the instructions we looked
at in Chapter 2 . One instruction that is missing is the unconditional branch
instrucción. Extend the datapath and control of Figure 4.17 to include the
unconditional branch instruction. Describe how to set any new control lines.

The unconditional branch instruction looks like a branch instruction with a


ANSWER longer offset but it is not conditional. Like a branch, the low-order 2 bits of a
branch address are always 00 two . The next 26 bits of this 64-bit address come
from the 26-bit immediate field in the instruction and then are sign extended.
Thus, we can implement a branch by storing into the PC sum of the PC and the
sign extended and shifted 26-bit offset. Figure 4.23 shows the addition of the
control for branch added to Figure 4.17 . An additional OR-gate is used with a
control signal to isselect
UncondBranch, the branch
asserted target
only when thePC always. This
instruction is ancontrol signal, called
unconditional branch.

0
Add METRO
tu
X
4 AddALU 1
resultado
Reg2Loc Shift
Uncondbranchleft 2
Branch
MemRead
Instruction [31–21] MemtoReg
Controlar
ALUOp
MemWrite
ALUSrc
RegWrite
Instruction [9-5]Read
Read
ordenador personal
dirección 0 registerRead
Instruction [20-16] 1
METRO
Read data 1
tu
X register 2 Zero
Instrucción 1 ALU
[31–0] EscribirRead 0 ALU DirecciónRead 1
Instrucción data
registro 2 METRO resultado datos METRO
memoria Instruction [4-0] tu tu
Escribir X X
datosRegisters 1 0
Datos
Escribir
memoria
datos
Instruction [31-0]32 Sign- 64
ampliar ALU
controlar
Instruction [31–21]

FIGURE 4.23 The simple control and datapath are extended to handle the unconditional branch instruction. Un
additional OR-gate (at the upper right) is used to control the multiplexor that chooses between the branch target and the sequential instruction
following this one. One input to the OR-gate is the Uncondbranch control signal. Although not shown, the Sign-extend logic would recognize
the unconditional branch opcode and sign-extend the lower 26 bits of the branch instruction to form a 64-bit address to be added to the PC.

Página 28

4.5 An Overview of Pipelining 283

Elaboration: We also need to modify the sign-extend unit to include the 26-bit address
of this instruction. We solve the problem by expanding the 2:1 multiplexor that was
controlled by opcode bit 26 mentioned in an earlier elaboration to include this address
and then control it with the two opcode bits 31 and 26. The value 01 means select the
address for B , 10 means address for LDUR or STUR , and 11 for CBZ .

Why a Single-Cycle Implementation is not Used Today


Although the single-cycle design will work correctly, it is too inefficient to be used
in modern designs. To see why this is so, notice that the clock cycle must have the
same length for every instruction in this single-cycle design. Of course, the longest
possible path in the processor determines the clock cycle. This path is most likely a
load instruction, which uses five functional units in series: the instruction memory,
the register file, the ALU, the data memory, and the register file. Although the CPI
is 1 (see Chapter 1 ), the overall performance of a single-cycle implementation is
likely to be poor, since the clock cycle is too long.
The penalty for using the single-cycle design with a fixed clock cycle is significant,
but might be considered acceptable for this small instruction set. Historically, early
computers with very simple instruction sets did use this implementation technique.
However, if we tried to implement the floating-point unit or an instruction set with
more complex instructions, this single-cycle design wouldn't work well at all.
Because we must assume that the clock cycle is equal to the worst-case delay
for all instructions, it's useless to try implementation techniques that reduce the
delay of the common case but do not improve the worst-case cycle time. A single-
cycle implementation thus violates the great idea from Chapter 1 of making the
common case fast .
In next section, we'll look at another implementation technique, called
pipelining, that uses a datapath very similar to the single-cycle datapath but is
much more efficient by having a much higher throughput. Pipelining improves
efficiency by executing multiple instructions simultaneously.
Look at the control signals in Figure 4.22 . Can you combine any together? Poder Comprobar
any control signal output in the figure be replaced by the inverse of another? Yourself
(Hint: take into account the don't cares.) If so, can you use one signal for the other
without adding an inverter?

4.5 An Overview of Pipelining

Pipelining is an implementation technique in which multiple instructions are Never waste time.
overlapped in execution. Today, pipelining is nearly universal. American proverb
This section relies heavily on one analogy to give an overview of the pipelining
terms and issues. If you are interested in just the big picture, you should concentratepipelining An
on this section and then skip to Sections 4.10 and 4.11 to see an introduction to implementation technique
in which multiple
the advanced pipelining techniques used in recent processors such as the Intel instructions are overlapped
Core i7 and ARM Cortex-A53. If you are curious about exploring the anatomy of ain execution, much like an
pipelined computer, this section is a good introduction to Sections 4.6 through 4.9. assembly line.

Das könnte Ihnen auch gefallen