Arquitectura de Computadores El Procesador © Victor Grimblatt H. 1 Introducción En el capítulo anterior vimos que el rendimiento de una máquina está determinado por tres factores Cantidad de instrucciones Tiempo de ciclo reloj Ciclos de reloj por instrucción (CPI) El compilador y el ISA (instruction set architecture) determinan la cantidad de instrucciones El tiempo de ciclo reloj y el CPI dependen de la implementación del procesador © Victor Grimblatt H. 2 Implementación Básica del MIPS Trabajaremos sobre una implementación básica del MIPS que considera las siguientes instrucciones Instrucciones de memoria: lw y sw Instrucciones aritméticas y lógicas: add, sub, and, or y slt Instrucciones de control de flujo: beq y jump No se incluye el resto de las instrucciones para mantener la simplicidad del diseño La implementación de las otras instrucciones es similar Los conceptos que veremos son los utilizados para construir todo tipo de procesadores © Victor Grimblatt H. 3 Visión Global de la Implementación Para cada instrucción se realiza los siguiente primeros pasos Enviar el contador programa (PC) a la memoria que contiene el código y buscar (fetch) la instrucción de la memoria Leer uno o dos registros (solo uno en lw) seleccionados a partir de los campos de la instrucción Los pasos siguientes dependen de la clase de instrucción © Victor Grimblatt H. 4 Visión Global de la Implementación Hay similitudes entre las clases consideradas, como por ejemplo casi todas ellas (excepto el jump) utilizan una ALU Una vez utilizada la ALU, las acciones requeridas para terminar las instrucciones difieren Algunas de ellas escriben en memoria mientras que otras lo hacen en registros © Victor Grimblatt H. 5 Visión General del MIPS Dos tipos de unidades funcionales © Victor Grimblatt H. Elementos que operan sobre los datos (combinatorio) Elementos que contienen el estado (secuenciales) 6 Observaciones La figura recién presentada es una visión general Posee unidades que tienen dos fuentes de datos lo que no es correcto Es necesario el uso de multiplexores para seleccionar los datos El circuito presenta solo las unidades de operación, obviando la unidad de control, la que controla el flujo de acuerdo a la ínstrucción © Victor Grimblatt H. 7 © Victor Grimblatt H. 8 Unidad de Control Las instrucciones son la entrada de esta unidad Es utilizada para determinar las lineas de control de las unidades funcionales y de los multiplexores © Victor Grimblatt H. 9 Construyendo una ALU Básica Dispositivo que permite realizar operaciones aritméticas tales como la adición y substracción Dispositivo que permite realizar operaciones lógicas tales como AND u OR El MIPS tienen 32 bits por lo que se requiere de una ALU de 32 bits © Victor Grimblatt H. 10 ALU 1 Bit Las operaciones lógicas son fáciles ya que se implementan directamente con compuertas lógicas Este circuito permite realizar las operaciones de AND o OR la que es seleccionada en el multiplexor Re sult Operationab Operationa b © Victor Grimblatt H. 11 Inputs ALU 1 Bit Carry in a sum b Carry out Outputs Comentarios a b C in C out sum 0 0 0 0 0 0 + 0 + 0 = 00 0 0 1 0 1 0 + 0 + 1 = 01 0 1 0 0 1 0 + 1 + 0 = 01 0 1 1 1 0 0 + 1 + 1 = 10 1 0 0 0 1 1 + 0 + 0 = 01 1 0 1 1 0 1 + 0 + 1 = 10 1 1 0 1 0 1 + 1 + 0 = 10 1 1 1 1 1 1 + 1 + 1 = 11 Cout bCin aCin ab sum abCin abCin abCin abCin © Victor Grimblatt H. 12 ALU 1 Bit © Victor Grimblatt H. 13 ALU 32 Bits © Victor Grimblatt H. 14 Substracción Substraer es sumar la versión negativa del operando Para obtener el complemento a 2 de un número se invierte el número bit a bit y se suma 1 Para lograr la inversión se agrega un multiplexor que elige b o !b © Victor Grimblatt H. 15 Substracción 1 Bit ¿Cómo sumamos 1 a !b Poniendo el carry in en 1 © Victor Grimblatt H. 16 Substracción 32 Bits Se conectan 32 ALUs como ya hicimos Seteando el carry del lsb a 1 se obtiene Sum = a + b + 1 Si utilizamos !b tenemos sum = a + !b + 1 = a + (!b +1) = a + (-b) = a - b © Victor Grimblatt H. 17 Más Funcionalidad La ALU del MIPS require igualmente de un NOR Se tiene que !(a + b) = !a * !b © Victor Grimblatt H. 18 Agregando la Instrucción slt Produce un 1 si rs < rt, y 0 en los otros casos slt seteara todos los bits a cero salvo el último que depende de la comparación La salida para slt es llamada less y se agrega una entrada al multiplexor de salida less vale cero para los 31 bits superiores de la ALU ¿Cómo hacemos la comparación entonces? © Victor Grimblatt H. 19 Agregando la Instrucción slt a < b implica que a – b < 0 El lsb de la operación slt debe ser un 1 si a < b, lo que es lo mismo que decir que a – b es negativo Por lo que ponemos un 1 si a – b es negativo y un cero si es positivo Bastaría conectar el bit de signo de la salida del sumador al lsb para obtener less © Victor Grimblatt H. 20 Agregando la Instrucción slt Desgraciadamente el Result del bit más significativo de la ALU para esta operación no es la salida del sumador Necesitamos una ALU diferente para el bit msb con una salida extra que corresponde a la salida del sumador Como necesitamos un diseño especial para el último bit agregamos las detección de overflow © Victor Grimblatt H. 21 ALU para los otros bits ALU para el bit más significativo © Victor Grimblatt H. 22 ALU 32 Bits © Victor Grimblatt H. 23 Instrucciones de Bifurcación Condicional Estas instrucciones bifurcan si dos registros son iguales o desiguales a = b es lo mismo que a – b = 0 Bastaría con hardware para comprobar que un resultado es igual a cero para verificar la igualdad Con un OR entre las salidas se puede comprobar la igualdad a cero © Victor Grimblatt H. 24 © Victor Grimblatt H. 25 ALU Final Líneas de control Función 0000 AND 0001 OR 0010 add 0110 substract 0111 set on less than 1100 NOR © Victor Grimblatt H. 26 ALU en Verilog – Descripción Comportamental module MIPSALU (ALUCtl, A, B, ALUOut, Zero); input [3:0] ALUCtl; input [31:0] A,B; output reg [31:0] AlUOut; output Zero; assign Zero = (AlUOut == 0); //Zero es verdadero si ALUOut es igual a cero always@(ALUCtl, A, B) begin //evalua los cambios case (ALUCtl) 0: ALUOut <= A & B; 1: ALUOut <= A | B; 2: ALUOut <= A + B; 6: ALUOut <= A - B; 7: ALUOut <= A < B ? 1:0; 12: ALUOut <= ~(A + B); //NOR default: ALUOut <= 0; endcase end endmodule © Victor Grimblatt H. 27 ALU en Verilog – Unidad de Control module ALUControl (ALUOp, FuncCode, ALUCtl); input [3:0] ALUOp; input [5:0] FuncCode; output reg [3:0] AlUCtl; always case FuncCode 32: ALUOp <= 2; //add 34: ALUOp <= 6; //substract 36: ALUOp <= 0; //and 37: ALUOp <= 1; //or 39: ALUOp <= 12; //nor 42: ALUOp <= 7; //slt default: ALUOp <= 15; //should not happen endcase endmodule © Victor Grimblatt H. 28 Convenciones de Diseño Lógico Las unidades funcionales en el MIPS consisten en dos tipos de elementos lógicos que operan sobre datos – combinatorios Elementos que contienen el estado – secuenciales o elementos de estado Elementos Las memorias de datos e instrucciones así como los registros son elementos de estado Un elemento de estado tiene al menos dos entradas y una salida © Victor Grimblatt H. 29 Convenciones de Diseño Lógico Las entradas de un elemento de son el dato y el reloj La salida de un elemento de estado provee el valor que fue escrito en el ciclo anterior Un elemento de estado básico es el FF D El MIPS utiliza otros elementos de estado tales como memorias y registros Se utiliza el término asserted para indicar que una señal está en nivel alto y assert para indicar que debe ser llevado a nivel alto De forma complementaria se usa deasserted y deassert © Victor Grimblatt H. 30 Metodología de Temporización Una metodología de temporización (clocking methodology) define cuando las señales pueden ser leídas y escritas Esto es importante ya que si una señal es leída al mismo tiempo que es escrita, podríamos leer el valor anterior A modo de simplificar utilizaremos una metodología de temporización por canto (edge-triggered clocking methodology) Esta metodología indica que los valores son guardados en un canto del reloj © Victor Grimblatt H. 31 Metodologías de Temporización Solo los elementos de estado pueden guardar valores Las entradas a los bloques combinatorios provienen de elementos de estado y sus salidas van a elementos de estado Las entradas son valores escritos en el ciclo anterior y las salidas pueden ser usadas en el próximo ciclo © Victor Grimblatt H. 32 Metodologías de Temporización Las señales se propagan del elemento de estado 1, a través de la lógica combinatoria, al elemento de estado 2 en un ciclo de reloj El tiempo necesario para llegar al elemento de estado 2 define el largo del ciclo reloj Esta metodología permite la retroalimentación, se lee el valor de un registro, se pasa a través de lógica combinatoria y se escribe el mismo registro en el mismo ciclo reloj © Victor Grimblatt H. 33 Metodologías de Temporización Asumiremos que todas los relojes llegan al mimo tiempo a modo de simplificación De esta forma garantizamos que el sistema funciona correctamente sin carreras (races) siempre y cuando el largo del reloj sea suficiente Ocurre una carrera cuando el contenido de un elemento de estado depende de la velocidad relativa de los elementos lógicos En un diseño por canto, el reloj debe ser lo suficientemente largo para acomodar el camino entre 1 FF, a través de la lógica combinatoria, y otro FF cumpliendo los requisitos de set up © Victor Grimblatt H. 34 Metodologías de Temporización El ciclo reloj tiene que ser al menos de tprop + tcombinational + tsetup en los valores worst case tprop: tiempo de propagación de una señal a través de un FF, llamado igualmente clock-to-Q tcombinational: mayor retardo a través de la lógica combinatoria tsetup: tiempo antes del canto del FF en que la señal debe estar válida © Victor Grimblatt H. 35 Metodología de Temporización Hemos asumido que el thold (tiempo que debe permanecer válida la señal para ser considerada) se cumple siempre lo que es cierto en la mayoría de los casos en circuitos modernos Otro concepto a considerar es el clock skew (diferencia en tiempo absoluto entre el momento en que dos elementos de estado ven el canto del reloj) Esto ocurre ya que la señal de reloj usa en general dos caminos diferentes, con retardos diferentes, para alcanzar dos elementos de estado © Victor Grimblatt H. 36 Metodologías de Temporización Debido a la diferencia en tiempo en que los dos FF ven el canto del reloj, la señal del primer FF puede atravesar la lógica combinatoria antes de que el segundo FF vea el reloj Por esta razón el período del reloj debe ser al menos tprop + tcombinational + tsetup + tskew © Victor Grimblatt H. 37 Tarea Investigue la metodología de temporización por nivel (level-sensitive timing) © Victor Grimblatt H. 38 Construyendo un Datapath (Camino de los Datos) Una forma razonable de diseñar un datapath es examinando los principales componentes requeridos para ejecutar cada clase de instrucciones Miremos que elementos de datapath son requeridos por cada instrucción En primer lugar requerimos de una memoria para almacenar las instrucciones del programa y para entregar estas instrucciones a partir de una dirección Requerimos igualmente de un registro llamado Contador de programa (PC) que es usado para mantener la dirección de la instrucción en curso Necesitamos también un sumador para incrementar el PC a la dirección de la próxima instrucción © Victor Grimblatt H. 39 Construyendo un Datapath El sumador puede ser construido a partir de la ALU que ya diseñamos cableandola de forma adecuada A esta ALU especial la llamaremos Add para indicar que solo realiza funciones de suma © Victor Grimblatt H. 40 Construyendo un Datapath Para ejecutar cualquier instrucción debemos en primer lugar buscar la instrucción de la memoria Se debe igualmente incrementar el PC de 4 para posicionarse en la próxima instrucción © Victor Grimblatt H. 41 Construyendo un Datapath Consideremos una instrucción de formato R Estas instrucciones leen dos registros, realizan una operación en la ALU y escriben el resultado Estas instrucciones son llamadas de tipo R o de tipo aritmético lógico Estas instrucciones incluyen add, sub, and, or y slt Los 32 registros de propósito general del procesador se encuentran en una estructura llamada register file © Victor Grimblatt H. 42 Construyendo un Datapath Un register file es una colección de registros Cada registro puede ser escrito o leído especificando el número del registro El register file el registro de estado de la máquina Como el formato R tiene tres operandos registros debemos leer dos datos del register file y escribir un dato en el register file © Victor Grimblatt H. 43 Construyendo un Datapath Consideremos las instrucciones lw y sw El formato general es lw $t1,offset_value($t2) o sw $t1,offset_value($t2) Se requiere calcular una dirección memoria sumando el registro base ($t2) al valor contenido en el offset (16 bits con signo) Si la instrucción es un store, el valor a guardar debe ser leído de un registro Si la instrucción es un load, el valor leído debe ser guardado en un registro Se requiere tanto la ALU como el register file © Victor Grimblatt H. 44 Construyendo un Datapath Requerimos además una unidad que permita extender el signo en 16 bits © Victor Grimblatt H. 45 Construyendo un Datapath La instrucción beq tiene tres operandos Dos registros que se comparan buscando la igualdad y un offset de 16 bits usado para calcular la dirección de bifurcación Su forma es beq $t1,$t2,offset Para implementar la instrucción se debe calcular la dirección de bifurcación sumando el offset extendido en signo al PC © Victor Grimblatt H. 46 Construyendo un Datapath Hay dos detalles que deben tenerse en cuenta en la instrucción beq ISA especifica que la base de cálculo para la dirección de bifurcación es la instrucción que sigue a la bifurcación. Este valor ya se tienen ya que se calcula PC + 4 al obtener la instrucción ISA establece que el offset es desplazado a la izquierda de 2 bits Además de calcular la dirección de bifurcación, se debe determinar si la próxima instrucción es la que sigue secuencialmente o es la de bifurcación © Victor Grimblatt H. 47 Construyendo un Datapath Cuando la condición es verdadera, el PC toma la dirección de bifurcación y se dice que se toma la bifurcación Si los operandos no son iguales, el PC incrementado reemplaza al PC y se dice que no se toma la bifuracción El datapath debe realizar dos operaciones para las bifurcaciones, calcular la dirección de bifurcación y comparar los registros El datapath incluye un módulo de extensión de signoy un sumador para calcular la dirección Para la comparación se requiere del register file y la ALU © Victor Grimblatt H. 48 Construyendo un Datapath Como la ALU provee una salida que indica si el resultado es cero, basta enviar los dos registros a la ALU y hacer una substracción Si la salida zero es asserted, los dos registros son iguales © Victor Grimblatt H. 49 Construyendo un Datapath Hemos examinado los componentes necesarios para cada una de las instrucciones consideradas por separado El datapath debe tratar de ejecutar las instrucciones en un ciclo reloj Esto implica que los recursos no pueden ser usados más de una vez por instrucción, por lo que cada elemento que se requiere más de una vez debe ser duplicado Requerimos de una memoria de instrucciones separada de la de datos Para permitir compartir los componentes del datapath es necesario poner multiplexores en las entradas © Victor Grimblatt H. 50 Ejemplo Los operaciones tipo R (aritméticas y lógicas) y las de memoria son similares Las principales diferencias son Las instrucciones aritméticas y lógicas usan la ALU con dos registros como entrada. Las instrucciones de memoria pueden usar la ALU para calcular la dirección con el offset extendido en signo como segunda entrada El valor guardado en el registro de destino viene de la ALU (instrucción tipo R) o de la memoria (load) Construya un datapath usando un register file y una ALU para este tipo de instrucciones Agregue los multiplexores necesarios © Victor Grimblatt H. 51 Ejemplo Un solo register file y una sola ALU implica dos fuentes diferentes para la segunda entrada de la ALU Implica igualmente dos fuentes para el dato guardado en el register file Por lo requerimos de un multiplexor en la entrada de la ALU y otro en la entrada del register file © Victor Grimblatt H. 52 Ejemplo Datapath para las instrucciones tipo R y memoria © Victor Grimblatt H. 53 Ejemplo El datapath completo contiene lo siguiente Fetch de instrucciones Instrucciones tipo R y memoria Bifurcaciones © Victor Grimblatt H. 54 Ejemplo © Victor Grimblatt H. 55 Ejemplo A esto se le debe agregar la unidad de control Esta unidad debe ser capaz de recibir entradas y generar una señal de escritura para cada elemento de estado, la selección de cada multiplexor y el control de la ALU © Victor Grimblatt H. 56 Control de la ALU La ALU tiene 4 entradas de control Los bits de control no están codificados Solo usaremos 6 de las 16 combinaciones posibles Líneas control ALU Función 0000 AND 0001 OR 0010 add 0110 sub 0111 slt 1100 NOR © Victor Grimblatt H. 57 Control de la ALU La función NOR es necesaria para otras funciones del MIPS La ALU es usada para calcular la dirección para las instrucciones lw y sw Para las instrucciones de tipo R, la ALU realiza una de las cinco acciones (AND, OR, sub, add, slt) dependiendo del valor del campo function (6 bits) Para beq, la ALU realiza una substracción © Victor Grimblatt H. 58 Control de la ALU Podemos generar una unidad de control de 4 bits de la ALU teniendo en entrada el campo function y dos bits llamados ALUOp ALUOp indica si la operación es una suma (00) para lw y sw, substracción (01) para beq o lo indicado en function (01) © Victor Grimblatt H. 59 Control de la ALU Opcode ALUOp Instrucción Campo Function Acción Control ALU LW 00 Load word XXXXXX suma 0010 SW 00 Store word XXXXXX suma 0010 Branch-equal 01 Branch equal XXXXXX substracción 0110 R-type 10 Add 100000 suma 0010 R-type 10 Substract 100010 substracción 0110 R-type 10 AND 100100 and 0000 R-type 10 OR 100101 or 0001 R-type 10 Set on less than 101010 set less on than 0111 © Victor Grimblatt H. 60 Control de la ALU Hay diferentes formas de implementar este control Es conveniente crear una tabla de verdad que considere las combinaciones de entrada relevantes Esta tabla de verdad muestra los 4 bits de control de la ALU en función de los 8 bits de entrada (6 de function y 2 de ALUOp) 8 entradas producen 256 combinaciones posibles, como solo nos interesamos en algunas de estas combinaciones y sus salidas, siendo las otras don’t care, no se muestran en la tabla Representamos con una x las entradas don’t care A partir de la tabla se construye el circuito correspondiente pasando por una etapa de optimización en primer lugar © Victor Grimblatt H. 61 Control de la ALU ALUOp Campo Función Operación ALUOp1 ALUOp0 F5 F4 F3 F2 F1 F0 0 0 x x x x x x 0010 x 1 x x x x x x 0110 1 x x x 0 0 0 0 0010 1 x x x 0 0 1 0 0110 1 x x x 0 1 0 0 0000 1 x x x 0 1 0 1 0001 1 x x x 1 0 1 0 0111 © Victor Grimblatt H. 62 Control de la ALU © Victor Grimblatt H. 63