SUMADOR DE PUNTO FLOTANTE EN VHDL: DISEÑO Y ANÁLISIS DE ALTERNATIVAS DE OPTIMIZACIÓN Ignacio E. Sardi, Bruno L. Uberti, Fernando G. Tinetti, Antonio A. Quijano Centro de Investigación y Desarrollo en Microelectrónica (CIDEM) Instituto Tecnológico de Buenos Aires (ITBA) Buenos Aires Argentina [email protected] sistema para luego detallar cada uno de los bloques que componen el diseño final. Desde el inicio mismo, el énfasis está puesto en la reducción de tiempo de operación para el circuito (sumador). El trabajo que aquí se presenta tiende al diseño de un ASIC, pero no llega hasta la obtención del prototipo físico. Para una primera aproximación de la síntesis y optimización mediante las herramientas de CAD, se ha adoptado provisoriamente una tecnología CMOS (SXLIB [13]) y la librería y kit de diseño incluidos en Alliance. Pero será parte de una etapa futura elegir una tecnología definitiva. Más que proveer un nuevo sumador de punto flotante se muestra un diseño que es fácil y rápido gracias a VHDL y mediante las herramientas de síntesis también es fácil y rápida la optimización. El sumador se toma más como ejemplo que como aplicación final y la idea no es proveer el mejor o más rápido sino algunas alternativas de optimización de tiempo. En el presente artículo no sería tampoco posible agregar más detalles del uso de Alliance debido a las limitaciones de extensión establecidas. En principio, tanto Alliance como otros entornos de CAD tales como Cadence se componen de múltiples herramientas usualmente independientes, cada una de ellas enfocada a realizar una tarea específica dentro del ciclo/proceso de diseño. En la siguiente sección, se describe la arquitectura completa del circuito. En la sección 3 se detallan algunos aspectos relevantes de los bloques que componen el sumador en punto flotante. La sección 4 muestra la síntesis preliminar o sin optimizar del diseño en función de tiempo de operación y área de silicio necesaria. Luego, en la sección 5 se dan los detalles relevantes de la optimización utilizando las herramientas de CAD. La sección 6 comenta las alternativas de optimización de tiempo a nivel de rediseño en VHDL. Finalmente, la sección 7 detalla las conclusiones y las alternativas de trabajo futuro. RESUMEN En este trabajo se presenta el diseño de un sumador de números representados en punto flotante siguiendo la norma IEEE. Además de definir una solución de hardware aplicando los principios de paralelización de operaciones establecidos por los pipelines, se analizan las alternativas de optimización de tiempo de operación utilizando herramientas de síntesis de hardware a partir del lenguaje VHDL. Las alternativas se evalúan en función de la optimización de tiempo de operación y de las variaciones de área de silicio estimadas por las herramientas de síntesis. Finalmente, se presenta una posible evolución hacia el cambio del diseño a nivel de VHDL del circuito y su impacto en la optimización de tiempo. 1. INTRODUCCION La utilización del lenguaje VHDL [1] es aceptada desde hace mucho tiempo para la utilización en el diseño, simulación e implementación de hardware [2]. Sin embargo, sigue siendo un problema a resolver la optimización de distintos aspectos de los circuitos diseñados a la hora de su implementación real. En este contexto las herramientas de CAD (Computer Aided Design) como Alliance [3] [4] [5] [6] [7] y Cadence [8] son de gran utilidad no solamente para el ciclo completo de desarrollo y verificación de hardware sino también para el análisis de alternativas de optimización. En este artículo se presenta un ejemplo completo de la utilización combinada de VHDL y herramientas de CAD para el diseño, verificación y optimización de un circuito en particular. Más específicamente, se propone resolver en hardware la suma de números reales cuya representación sigue los lineamientos de la norma IEEE para números de precisión simple [9] [10] [11] [12]. El proceso de diseño comenzará por la descripción de comportamiento del 1 normalizarla y luego se le suma el eventual acarreo producido en el punto 7. 11. Redondear el número según lo indicado en la norma IEEE 754. 2. DESCRIPCION DE LA ARQUITECTURA Dado que el énfasis está puesto en la velocidad de operación del circuito, se propuso realizar el mismo en una serie de etapas (pipelined architecture) [14] aunque en principio implica la utilización de mayor área de silicio para su fabricación. Esto a su vez incrementa el costo total del circuito a expensas de su mejor rendimiento. Los números de entrada del sumador se consideran representados siguiendo los lineamientos de la norma IEEE 754 de precisión simple. Aunque el sumador opera con el cero, no se consideran, sin embargo, las definiciones de NaN (Not a Number), y el resto de los números con representación no normalizada. Resumiendo, se manejan todos los números normalizados más el cero de la definición de la norma IEEE. Si se consideran las entradas al sumador A y B como A = (-1)X 1.a 2P y B = (-1)Y 1.b 2Q , donde X e Y son los signos (1 bit), a y b son las fracciones (23 bits), y P y Q los exponentes (8 bits), se puede calcular la suma C = A + B = c 2R en los pasos: 1. Agregar el bit implícito de la fracción junto con los bits de guarda a las mantisas a y b, obteniendo las fracciones con las que se operará a’ y b’. 2. Calcular R = máx(P, Q), determinar la diferencia T =⏐P - Q⏐, y determinar el mayor de los números de entrada: Z (=0 si A < B; =1 en caso contrario). 3. Determinar el signo del resultado y la operación binaria a realizar. El signo del resultado está determinado por Z (el signo de la suma de los dos números será el signo del número mayor). Para determinar la operación binaria (suma o resta) bastará con comparar los signos de los respectivos números: X e Y. 4. Detectar los casos especiales en que debe manejarse el cero: ambos números de entrada son cero o son iguales y la operación a realizar es la resta. 5. Seleccionar la fracción (a’ o b’) que corresponde al número menor. 6. Desplazar a la derecha la fracción asociada con el número menor T lugares (bits) para igualar los exponentes antes de sumar las fracciones. 7. Sumar las fracciones para producir la fracción de la suma no normalizada c’. La operación puede dar un bit de acarreo que se traduce en un incremento del exponente del resultado, resultado conocido como desborde de mantisa. 8. Determinar la cantidad u de ceros iniciales en la fracción c’. 9. Desplazar c’ a la izquierda u lugares para producir la fracción normalizada c”. 10. Modificar el exponente resultado restando los u lugares que se desplazó la fracción para Cada uno de estos pasos puede realizarse de distintas maneras y la Figura 1 muestra esquemáticamente los bloques funcionales que resuelven cada una de estas tareas. Además, también se muestra cómo se agrupan los bloques funcionales en un pipeline de cuatro etapas. X Y A = (-1) X 1.a 2 P ; B = (-1) Y 1.b 2 Q Q a' P b' ETAPA 1 PASOS 1 a 6 COM PARADOR DETECTOR DE CERO X Y SELECTOR DE FRACCION Z SIGNO all_zero R Fracción mín(A, B) Otra Fracción AddC DESPLAZADOR A DERECHA T SignOut ETAPA 2 PASO 7 SUMADOR SignOut R all_zero Carry c’ flip-flop CONTADOR DE CEROS ETAPA 3 PASOS 8 y 9 c’ Clear SignOut DESPLAZADOR A IZQUIERDA R c" ETAPA 4 PASOS 10 y 11 RESTADOR SignOut Exponente REDONDEO DE FRACCION Fracción Figura 1: Sumador en Cuatro Etapas 3. DESCRIPCION DE LOS BLOQUES En esta sección se describe el pipeline completo, con todos los bloques funcionales que aparecen en la Figura 1. Esta descripción se lleva a cabo con las partes de código más importante de VDHL y en algunos casos se 2 agregan esquemas gráficos para aclarar la descripción en VHDL. De hecho, se puede notar que hacer la descripción en VHDL provee una manera casi inmediata de implementación, dado que se pueden utilizar sobre este código las herramientas de síntesis que proveen los entornos de CAD para circuitos integrados. (SignOut). En la Figura 3 se puede observar la simplicidad de la descripción de este bloque en VHDL. La salida SignOut se propaga a través de todo el pipeline hasta llegar a la última etapa, estableciendo de esta manera el signo de la operación. La salida AddC se utiliza en la siguiente etapa para saber si se suman o restan las fracciones. 3.1. Etapa 1 3.1.3. Bloque Detector de Cero Este bloque se encarga de detectar si el resultado puede Quizás esta es la etapa que contiene mayor cantidad de bloques funcionales y por lo tanto su descripción será la más extensa de las cuatro propuestas. architecture ARCH_sign_comp of sign_comp is begin 3.1.1. Bloque de Comparación Este bloque es el encargado de ubicar en el rango adecuado los dos operandos, para poder realizar la suma dentro del mismo rango, es decir bajo el mismo exponente. Recibe como entradas a los exponentes y fracciones de los correspondientes números a ser sumados y tiene como salidas a R=máx(P,Q), T=⏐P-Q⏐ y Z. La Figura 2 muestra el comportamiento del bloque en VHDL. SignOut <= x when sel = '1' else y; AddC <= '1' when x = y else '0'; end ARCH_sign_comp; Figura 3: Bloque Signo. dar cero. Para ello verifica que las entradas sean ambas cero o iguales y de signo contrario. Las entradas de este bloque son los dos operandos: A y B. En la Figura 4 se muestra el diagrama esquemático de este bloque. -- ## Celda Comparador ## architecture ARCH_comparador of comparador is a' P signal dif_exp_aux: std_logic_vector(7 downto 0); b' A = ( - 1) X 1.a 2 P; B = ( - 1) Y 1.b 2 Q Q a’ b’ X Y P Q begin ¿= 0? out = 1 si a & P =0 Z <= '0' when p < q else '1' when p > q else '0' when a < b else '1'; ¿= 0? out = 1 si b & Q =0 ¿X ≠Y? out = 1 si X ≠Y ¿a=b? out = 1 si a=b ¿P=Q? ou t = 1 si P=Q dif_exp_aux <= (p – q) when z = '1' else (q - p); R <= p when z = '1' else q; T <= dif_exp_aux when (dif_exp_aux<32) else X"FF"; AND AND end ARCH_comparador; =1 si A=( - B) =1 si A=B=0 Figura 2: Bloque Comparador. La señal R contiene el exponente en el cual se realizará la operación, la señal T indica al bloque de desplazamiento cuánto tiene que mover al dato para poner en el rango adecuado una de las dos fracciones. La señal Z se utiliza en el selector para indicar cuál de los exponentes de los operandos se debe seleccionar, y en caso de igualdad de exponentes selecciona la fracción mayor. Esta última señal se utiliza además en dos bloques externos, el bloque que se encarga de computar el signo y el bloque selector de fracciones. OR all_zero = 0 si A=( - B) o A = B = 0 Figura 4: Esquema del Detector de Cero. En la Figura 5 se muestra la implementación en VHDL, donde se puede notar también la versatilidad del lenguaje en cuanto a la creación y utilización de señales intermedias o auxiliares. Estas señales intermedias son utilizadas en este caso para la generación del valor correcto para la señal de salida de este bloque, que es única: all_zero. 3.1.2. Bloque de Signo Las entradas que posee este bloque son los signos de los operandos X e Y, y la señal Z que indica cuál de los dos números (A o B) es el mayor (Z = 1 si A > B). Tiene como salidas el tipo de operación a realizar con las fracciones (AddC) y el signo de la operación de suma 3.1.4. Bloque Selector de Fracción Este bloque funciona como si fuesen dos multiplexores 3 que se encargan de dirigir el flujo de datos de cada una de las fracciones. Se utiliza la información que está pipeline. Dentro de los circuitos combinacionales se tienen dos tipos distintos de desplazadores, uno lineal [15] y otro logarítmico [16]. El primero es más lento que el logarítmico debido a la cantidad de compuertas en paralelo que tiene conectadas pero su diseño y ruteo en layout es más sencillo. Un posible esquema de implementación del desplazador logarítmico se muestra en la Figura 7, donde cada bloque representa un multiplexor que es manejado por un bit de selección. Architecture ARCH_zero_verif of zero_verification is Signal signal signal signal signal signal a_info : std_logic_vector(30 downto 0); b_info : std_logic_vector(30 downto 0); zero_a : std_logic; zero_b : std_logic; eq_inputs : std_logic; all_inputs_zero : std_logic; begin -- creación de un solo vector para facilitar la comp. a_info a_info b_info b_info (22 (30 (22 (30 downto downto downto downto a 0 0) <= a; 23) <= p; 0) <= b; 23) <= q; Shift zero_a <= '1' when a_info=("000"&X"0000000") else '0'; zero_b <= '1' when b_info=("000"&X"0000000") else '0'; eq_inputs <= '1' when ((x/=y)and(a=b)and(q=p))else '0'; all_inputs_zero <= '1' when (zero_a='1' and zero_b='1') else '0'; all_zero <= '0' when (all_inputs_zero or eq_inputs) else '1'; a a a ... 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 0 Shift end ARCH_zero_verif; 0 Figura 5: Bloque Detector de Cero. Shift contenida en la señal “sel” que, de hecho, es la señal Z producida en el bloque Comparador. Por la salida denominada “mux_out1” saldrá la fracción que corresponda al menor de los dos números. Por la otra salida, “mux_out2” saldrá la fracción que corresponda al número mayor. En la Figura 6 se muestra el código VHDL que describe este bloque, donde además se puede notar una vez más el poder de descripción de este lenguaje. Figura 7: Esquema del Desplazador. La Figura 8 muestra de manera reducida (no están las líneas de código que son similares a las -- ## Celda Multiplexor ## architecture ARCH_sft_der of sft_der is architecture ARCH_multiplexor of multiplexor is signal signal ... signal signal begin mux_out1 <= a when sel = '0' else b; mux_out2 <= b when sel = '0' else a; stg1_a : std_logic_vector (30 downto 0); stg1_b : std_logic_vector (30 downto 0); stg5_a : std_logic_vector (30 downto 0); stg5_b : std_logic_vector (30 downto 0); begin end ARCH_multiplexor; -- etapa 1 del desplazador logarítmico stg1_a <= fraction; stg1_b(30) <= '0'; stg1_b(29 downto 0) <= fraction(30 downto 1); stg2_a <= stg1_a when shft(0) = '0' else stg1_b; Figura 6: Bloque Selector de Fracción. 3.1.5. Bloque Desplazador a Derecha Este bloque debe ser rápido para no retrasar al pipeline, es por ello que se optó por realizarlo en forma combinacional y no con registros. Al utilizar registros se necesitarían, en el peor de los casos, 31 pulsos de reloj para poder desplazar a la fracción e igualar los exponentes (debido a los bits de guarda junto con los restantes bits de la fracción). Se tendría, por consiguiente, una demora sustancial en esta etapa del -- etapa2 2 a 4 del desplazador logarítmico -- son similares ... -- etapa 5 del desplazador logarítmico stg5_b(30 downto 15) <= X"0000"; stg5_b(14 downto 0) <= stg5_a(30 downto 16); fr_out <= stg5_a when shft(4) = '0' else stg5_b; end ARCH_sft_der; Figura 8: Bloque Desplazador a Derecha. 4 incluidas) la descripción en VHDL del bloque de desplazamiento. Nuevamente se dio prioridad al aumento en la velocidad de operación (reducción de tiempo), por lo que el desplazador implementado fue el logarítmico. Este circuito combinacional consta de una serie de etapas (5 en total) para poder desplazar a la entrada en 32 veces (25 ya que es logarítmico en base 2). La primera etapa desplaza en 1, las segunda en 2, la tercera en 4, la cuarta en 8 y la quinta en 16. Tomando combinaciones de éstas se puede desplazar al dato de 0 a 31. El gráfico de la Figura 10 muestra de manera esquemática la operación de este bloque e indica cómo es tenido en cuenta el caso de desborde de mantisa, operando con una señal interna de carry para indicar el desborde y poniendo el resultado de la operación en el rango correcto. En el caso de ocurrir desborde, una señal es enviada al restador de exponentes, ubicada en la última etapa del pipeline, para indicarle que tiene que ajustar el exponente por el desborde producido en la operación parcial. AddC Bit extra de carry 0 Bit extra de carry 0 F_1 F_2 3.2. Etapa 2: Bloque de Suma o Resta de Fracciones Frac_1 En esta etapa se resuelve efectivamente la operación binaria a realizar. De hecho, además de la operación binaria (que puede ser de suma o resta) se debe calcular/generar la señal de carry o borrow de la operación. Este bloque es de vital importancia ya que es uno de los que más puede demorar al pipeline dado que la propagación del carry es notoria para la suma o resta de dos números de 31 bits. Por este motivo se eligió un sumador (o restador) con carry look-ahead para acelerar el cálculo del carry. Como contrapartida, lo que se pierde es área de silicio ya que este tipo de sumador ocupa más espacio. En el código de VHDL que se observa en la Figura 9 no se puede determinar la manera en que está implementado. SUMA RESTA Frac_1 + Frac_2 Frac_1 - Frac_2 SELECTOR Frac_1+Frac_2 si AddC=1 Frac_1-Frac_2 si AddC=0 A1 A2 architecture ARCH_frac_adder of frac_adder is signal adder1 signal adder2 signal res_add Frac_2 : std_logic_vector (31 downto 0); : std_logic_vector (31 downto 0); : std_logic_vector (31 downto 0); SELECTOR carry c' = A2 si carry = 0 c’ = A1 si carry = 1 begin adder1(31) <= '0'; adder1(30 downto 0) <= a; adder2(31) <= '0'; adder2(30 downto 0) <= b; res_add <= (adder1 + adder2) when AddC = '1' else (adder1 - adder2); carry <= res_add(31); c’ <= res_add(30 downto 0) when carry = '0' else res_add(31 downto 1); Figura 10: Esquema del Sumador. 3.3. Etapa 3 Dentro de esta etapa, se tienen dos alternativas en cuanto al resultado de la operación: se debe producir un cero a la salida o se debe trabajar sobre el resultado binario de la operación para producir el formato de punto flotante tal como lo establece la norma. Producir un cero es sencillo, pero para dar formato a la salida distinta de cero se deben realizar varias operaciones que se describen en los bloques a continuación. end ARCH_frac_adder; Figura 9: Bloque Sumador. El entorno de diseño Alliance provee la facilidad de especificar esto como una opción de una de las herramientas de compilación/síntesis de código. En el caso de trabajar con otro entorno de diseño, se podría especificar directamente en VHDL el circuito combinacional que corresponde. Este bloque opera con una señal externa que se calcula en la unidad que computa el signo de la operación, AddC, que le indica si debe realizar una operación de suma o resta. 3.3.1. Bloque Contador de Ceros Se basa en un circuito combinacional que determina la cantidad u de ceros que hay al principio de la fracción. Esta salida (u) es utilizada luego para desplazar la fracción a izquierda. Su implementación es similar a la 5 de un priority encoder [17], o sea que este bloque recibe como entrada un conjunto de 31 bits dentro de los cuales se encuentra la fracción junto con los bits de guarda y se fija en donde aparece el primer 1 lógico desde el bit más significativo hasta el menos significativo codificando dicha posición en forma binaria y dando este valor como resultado del bloque. La Figura 11 muestra de manera reducida (para no repetir líneas de código similares) la descripción en VHDL del bloque que cuenta los ceros al principio de la fracción de entrada. velocidad produce un gasto mayor en área de silicio. architecture ARCH_exp_sub of exp_sub is signal carry_vector : std_logic_vector (7 downto 0) := X"00"; begin carry_vector(0) <= carry; exponente <= r - u + carry_vector; end ARCH_exp_sub; Figura 12: Bloque de Recálculo de Exponente. 3.3.2. Bloque Desplazador a Izquierda Este bloque fue implementado igual que el desplazador a derecha (en cuanto a la cantidad logarítmica de pasos de desplazamiento). La única diferencia reside en que este desplazamiento del dato de entrada a izquierda agrega, además, ceros a la derecha. 3.4.2. Bloque de Redondeo de Fracción Este bloque lleva a cabo la operación de redondeo según indica la norma IEEE 754 [18]. Básicamente trabaja sobre los los bits adicionales llamados bits de guarda. Para realizar el redondeo se debe tomar la decisión de sumar un bit al bit menos significativo de la mantisa del resultado en caso que corresponda. La Figura 13 muestra el código VHDL que describe este bloque. architecture Arch_ZeroCounter of ZeroCounter is signal zerovector : bit_vector(30 downto 0) := "000" & X"0000000"; begin -- round_block u <= X"1F" when (Mantisa(30 downto 0) = zerovector(30 downto 0)) else X"1E" when (Mantisa(30 downto 1) = zerovector(30 downto 1)) else … X"02" when (Mantisa(30 downto 29) = zerovector(30 downto 29)) else X"01" when Mantisa(30) = zerovector(30) else X"00"; end Arch_ZeroCounter; architecture Arch_round_block of round_block is begin fraccion <= (c’’ + X"00000080") when (c’’(6 downto 0) > "1000000") else c’’ when (c’’(6 downto 0) < "1000000") else c’’ when (fraction_N(7) = '0') else c’’ + X"00000080"; end Arch_round_block; Figura 11: Bloque Contador de Ceros. 3.4. Etapa 4 Figura 13: Bloque de Redondeo de Fracción. En esta etapa se realizan los últimos ajustes para producir la salida correcta de la operación realizada en el formato correcto. Dado que ya se han producido los datos necesarios en los pasos anteriores, se opera por separado sobre el exponente y sobre la mantisa del resultado. También en este bloque se puede apreciar la potencia de expresión del lenguaje VHDL, en particular con la posibilidad de dar distintas alternativas para la asignación de los valores posibles de una señal. 4. SÍNTESIS DEL CIRCUITO 3.4.1. Bloque de Recálculo de Exponente Este bloque realiza el ajuste del exponente una vez que la fracción ya está normalizada. Recibe las señales R, U y carry, y entrega como salida el exponente normalizado del resultado. La señal R proviene del comparador de la etapa 1, y la señal u del bloque que se encarga de contar los ceros al principio del resultado de la suma, las dos señales se restan para dar el exponente correcto. Además, si ocurrió desborde de mantisa, la señal carry indica que se debe ajustar nuevamente el exponente. La Figura 12 muestra el código VHDL correspondiente. Este bloque puede ser implementado con carry look-ahead si se quiere ganar en velocidad, pero esto va a depender de cómo sean las velocidades de las otras etapas del pipeline, ya que usualmente más Una vez finalizada la descripción del sumador, se verifica su correcto funcionamiento vía simulación lógica; luego, se sintetiza cada uno de los bloques que lo componen para su posterior optimización. Aquí normalmente surgen dos posturas bien definidas que definen la relación costo – beneficio: el consumo de “área” de silicio y tiempo de propagación (ejecución) de cada bloque. Para la etapa de síntesis se utilizan las herramientas de CAD, en este caso las provistas por Alliance. Para la optimización, este entorno utiliza un algoritmo que construye una red lógica equivalente, minimizando las expresiones (ecuaciones) en cada nodo de la red. El resultado arrojado da una menor 6 profundidad de la red lógica. Luego para la función lógica de cada nodo de la red, trata de encontrar en la biblioteca que contiene la tecnología utilizada, un conjunto de celdas que produce la misma ecuación lógica de dicho nodo. Este proceso habitualmente es llamado “standard cell mapping”. Por último, realiza el cálculo del camino crítico, el reconexionado de las compuertas para disminuir el “delay” y la capacidad, agregando buffers entre ellas si fuere necesario. También realiza el cálculo del área. Dentro de los diferentes etapas para minimizar el tiempo de propagación o el área de silicio, el algoritmo permite ajustar en forma porcentual cuál de estos dos parámetros se requiere optimizar en mayor medida. En la Tabla 1 se muestra un resumen de los tiempos de propagación de cada bloque con el área de silicio ocupada. Etapa Bloque Tipo Tiempo (ps) bloques que pertenecen al camino crítico de propagación de las señales. Sin embargo, la asociación de los bloques de hardware a cada etapa de un pipeline no necesariamente puede ser hecha por las herramientas de síntesis, dado que en este caso, debería ser posible especificar que se trata de un pipeline (algo que no es posible, por ejemplo, en VHDL de manera explícita). De alguna manera, la información de más “alto nivel” que proporcionan las herramientas de síntesis es la identificación de los bloques de hardware que pertenecen al camino crítico de propagación de las señales. Esta información de camino crítico se utiliza en la Tabla 1 para calcular el tiempo total de operación de cada etapa. Específicamente, el tiempo de cada etapa estará dado por la suma de los tiempos de propagación de los bloques del camino crítico dentro de la etapa. Esto se diferencia del área necesaria para implementar cada etapa, que será la suma de las áreas de todos los bloques que pertenecen a la etapa. Una vez que se tiene la información de síntesis agrupada por etapas y con los tiempos de cada etapa dados por los bloques del camino crítico, se puede calcular el tiempo de operación del pipeline. En el caso de la información de la Tabla 1, el tiempo está determinado por la Etapa 2, que es la de mayor tiempo de propagación: 11681 ps. En vez de sintetizar y optimizar todo el circuito, que es modo default de operación, también es posible realizar síntesis y optimización local, manteniendo la estructura de la descripción inicial (se mantienen la mayoría de las señales intermedias). Esta forma de optimización local es ideal para circuitos grandes como pueden ser los sumadores y comparadores en este caso. En la tabla anterior los resultados mostrados no tuvieron en cuenta esta opción ya que el default del CAD es la optimización global en la que se remueven la mayoría de las señales intermedias de manera que las salidas se expresan en términos de las entradas o de registros internos. Area (λ2) Etapa 1 Signo 506 4500 Comparador* CLA1 5982 576500 2 Comparador RCA 16947 303500 Detector de Cero 1923 136500 Selector de Frac.* 643 157750 Desplazador a Der.* 2366 306250 Registros* 882 565750 Total E1 CLA 9873 1747250 Etapa 2 Sumador* CLA 10799 837000 Sumador RCA 18228 471000 Registros* 882 325500 Total E2 CLA 11681 1162500 Etapa 3 Contador de Ceros* 2404 155750 Desplazador a Izq.* 2655 337750 Flip Flop Neg. 882 7750 Registros* 882 379750 Total E3 5941 881000 Etapa 4 Restador* CLA 4855 383250 Restador RCA 5047 543000 Redondeo de Frac. RCA 2698 217250 Registros* 882 310000 Total E4 CLA 5737 910500 ps: picosegundo (10-12 seg). * Camino Crítico 1 2 CLA: Carry LookAhead. RCA: Ripple Carry Adder. 5. OPTIMIZACION DE SÍNTESIS En una implementación del estilo pipeline es necesario, en lo posible, que los tiempos de cada una de las etapas sean similares. Analizando los datos de la Tabla 1, sería necesario mejorar las Etapas 1 y 2 para acercarlas a los tiempos de las Etapas 3 y 4. Para esto se puede hacer uso de las herramientas de optimización y síntesis que se mencionaron anteriormente, con la utilización de los parámetros del algoritmo en forma “local” a estas etapas (1 y 2), variando el costo de optimización entre área y delay (en forma porcentual). En el caso de la Etapa 1, se tienen varios bloques a optimizar. Para evitar una cantidad muy grande de posibilidades de optimización y de tiempo de ejecución de las herramientas, se decidió optimizar el Tabla 1: Tiempo y Area sin Optimizaciones de Síntesis. La optimización realizada en este caso fue un 50% en área y un 50% en delay de todo el cirtuito. Esto significa que las herramientas de optimización intentan el mejor balance entre el área ocupada y el tiempo de propagación de las señales en todo el pipeline. Este es el modo de operación estándar (o default) a menos que se indique explícitamente lo contrario. Se debe notar que las herramientas de síntesis de los entornos de CAD para circuitos integrados proporcionan toda la información que aparece en la Tabla 1 en cuanto a los bloques: el tiempo de propagación de cada bloque, área de silicio estimada y 7 bloque dentro de esta etapa que tiene más de la mitad del tiempo de operación total: el comparador. En el caso de la Etapa 2 no hay posibilidades de elección, se debe mejorar el sumador. Se analizará primero el sumador de la Etapa 2 por ser el bloque de mayor tiempo absoluto de todo el pipeline. La Figura 14 muestra gráficamente los resultados de varias alternativas de optimización para el bloque Sumador. Estas alternativas son paramétricas para las herramientas de Alliance utilizadas para la síntesis. Sobre el eje x se muestra el tiempo de operación de cada alternativa, comenzando por el tiempo inicial de la Tabla 1, es decir 10799 ps. Además, para cada una de las alternativas de optimización se da una estimación de la variación (aumento) del área de silicio ocupada en forma porcentual respecto del total sobre el eje y. En el caso del tiempo inicial no se tiene ninguna variación, pero el mejor tiempo de operación del circuito obtenido por optimización, 5801 ps, implica un aumento aproximado de 16% del total del área del pipeline. tiempos. En particular, optimizando solamente al bloque sumador, la Etapa 1 pasaría a ser la de mayor tiempo de todo el pipeline. Dado que se ha obtenido una mejora más que significativa para la Etapa 2 se aplicarán las opciones de optimización al bloque Comparador de la Etapa 1 para mejorar su tiempo de operación. La Figura 15 muestra gráficamente los resultados de varias alternativas de optimización para el bloque Comparador. A diferencia de lo que sucede en el bloque Sumador, las opciones de optimización sobre el bloque Comparador no son muy consistentes en cuanto a la relación tiempo-área. Sin embargo, de notarse que las variaciones de área son muy pequeñas: en el rango de -0.2% a +0.3%. Esto significa que se puede optimizar el tiempo de propagación casi con la misma área de silicio (se debe recordar una vez más el carácter heurístico de los algoritmos utilizados para la síntesis). Comparador 3.0 Aumento de Area Total (%) Sumador 20 Aumento de Area Total (%) 18 16 14 12 10 8 6 2.5 2.0 1.5 1.0 0.5 0.0 -0.5 5982 4 2 0 10799 9625 9270 9040 6329 T iempo (ps) 6064 5948 5473 5410 5408 T iempo (ps) 5106 4964 Figura 15: Optimización en Síntesis: Comparador. 5801 Otra de las características del bloque Comparador que es esencialmente distinta del bloque Sumador es que la optimización de tiempo es mucho menor: poco más de 1000 ps, que representa una ganancia de aproximadamente 17%. Sin embargo, desde el punto de vista del área ocupada, esta ganancia del 17% se obtiene casi al mismo costo que el pipeline original, dado que solamente se necesita poco más de 0.1% más de área total. En resumen, aplicando las optimizaciones a los dos bloques, Sumador y Comparador, se estaría en la situación que describe la Tabla 2 en cuanto a tiempos de operación de cada etapa. La mejora de los tiempos de propagación de las etapas más lentas lleva a mejorar significativamente el tiempo de operación del pipeline. Una vez aplicadas las optimizaciones que se han detallado y con los tiempos de las etapas que se muestran en la Tabla 2, el tiempo de operación de todo el pipeline está determinado por la Etapa 1: 8855 ps. En Figura 14: Optimización en Síntesis: Sumador. En general, se puede observar que a mayor optimización de tiempo se tiene mayor área ocupada. La excepción está dada en los dos últimos valores de optimización: aunque el tiempo de operación se reduce de 6064 ps a 5801 ps el área ocupada también se reduce. Esto da una idea de las características heurísticas de los algoritmos de optimización y su combinación con los algoritmos (también heurísticos) de ubicación de celdas y ruteo de señales. Por otro lado, aunque el área total del circuito aumenta, la ganancia en tiempo total de operación del pipeline puede ser de casi 5000 ps (10799-5801 = 4988 ps). Evidentemente en este bloque en particular la ganancia de tiempo es cercana al 50% (utilizando solamente 16% más de área), pero no se conoce aún la ganancia exacta de todo el pipeline porque se deben tener en cuenta todas las etapas y su relación de 8 términos de mejora porcentual, la ganancia ha sido significativa: de 11681 ps a 8855 ps, es decir un poco más del 24% de mejora. Y esto utilizando poco más de 16% de área para todo el circuito. Etapa Etapa Etapa Etapa Etapa Tiempo (ps) 1 2 3 4 8855 6683 5941 5737 50% del tiempo de propagación no puede ser optimizado más de manera significativa. Sin embargo, es de esperar que haya alguna forma de mejorar los tiempos de operación del pipeline dado que la Etapa 1 tiene un tiempo bastante mayor de operación que el resto de las etapas. Una posible solución, que es bastante inmediata en el contexto de los pipelines: subdividir la etapa mayor para obtener dos etapas nuevas, ambas de menor tiempo. En este caso, la información de la Tabla 1 respecto de los bloques que pertenecen al camino crítico puede ser de gran ayuda: el bloque de comparación se incluye en la nueva Etapa 1 y el resto de los bloques se consideran parte de la nueva Etapa 2. Las demás etapas solamente se renumeran. El rediseño del pipeline, aunque elegante, tiene costos asociados. Como mínimo en términos de área, se deben agregar los registros intermedios entre las nuevas Etapas 1 y 2. Sin embargo, la ganancia en tiempo por el rediseño es importante: la nueva Etapa 1 tendría tiempo de operación de 4964 ps (Comparador con su correspondiente optimización en síntesis) más 882 ps de los nuevos flip flops. En total: 5886 ps, valor muy similar al de las últimas dos etapas. La nueva Etapa 2 no tendría un impacto significativo en los tiempos de propagación, ya que sumaría: 643 ps (Selector de Fracción) más 2366 ps (Desplazador a Derecha) más 882 ps (Registros) lo cual implica, en total, 3891 ps. Ahora el tiempo de operación del pipeline estaría determinado por la nueva Etapa 3 (que contiene el Sumador) y sería de 6683 ps (Tabla 2). Se debe notar que la mayoría del trabajo realizado en la optimización de síntesis sigue siendo útil: los tiempos que se obtuvieron antes (los detallados en la sección anterior, en este caso) se reutilizan y no es necesario recalcular nuevos. Es de esperar que esto se mantenga siempre y cuando el rediseño mantenga la mayoría de los bloques funcionales como en este caso. Otro de los costos asociados al rediseño (subdividiendo una etapa en dos nuevas) que no es tan inmediato: ahora el tiempo de llenado y de vaciado del pipeline no es el mismo, dado que se tiene una etapa más. Por lo tanto sería mayor, por ejemplo, el costo de que el pipeline entre “en régimen” y se obtengan los primeros resultados. Es importante que a nivel de rediseño en VHDL, el costo es mínimo por la potencia misma del lenguaje de descripción. Area (λ2) 1161250 3512250 881000 910500 Tabla 2: Tiempo y Área Con Optimizaciones de Síntesis. Otro resultado de interés que está relacionado con el área de silicio utilizada es la cantidad de transistores que posee el core. El CAD de diseño posee herramientas para extraer el mapa de transistores del circuito total y de cada bloque por separado. La cantidad utilizada fue alrededor de 24000 y en la Figura 16 se muestra el ASIC del sumador de punto flotante. Figura 16: ASIC del Sumador. 6. OPTIMIZACION POR REDISEÑO Aunque la mejora obtenida en cuanto a optimización desde los resultados de síntesis de la Tabla 1 ha sido significativa, aún quedan posibilidades de optimización. Lo inmediato sería seguir aplicando alternativas de optimización disponibles en las herramientas de síntesis como se ha mostrado en la sección anterior. Sin embargo, es de esperar que estas optimizaciones no aporten muchas mejoras significativas porque: • La Etapa 1 es la que ahora (Tabla 2) determina el tiempo de operación del pipeline. • La Etapa 1 ya ha sido parcialmente optimizada. En particular, el bloque de la Etapa 1 que tiene más del 7. CONCLUSIONES Y TRABAJO FUTURO Se ha presentado un sumador de números representados en punto flotante siguiendo la norma definida por IEEE. La potencia de VHDL permite una rápida especificación y simulación del circuito, con lo cual se puede pensar más rápidamente en la optimización del mismo. Las optimizaciones hechas a nivel de las herramientas de 9 [4] Kai-shing Lam, Frederic Ak, “Alliance Tutorial, Part 2 Logic Synthesis”, Pierre & Marie Curie University, France, pp. 14-18, 2004. Included in the Alliance distribution available at: http://www-asim.lip6.fr/pub/alliance/distribution/latest/ síntesis pueden ser muy útiles. En el caso de este artículo se obtiene una mejora de más de 24% de tiempo de operación con poco más de 16% más de área de silicio necesaria para la implementación. Aunque son útiles y necesarias, las herramientas de síntesis y optimización tienen un límite. En el caso presentado, si se necesita optimizar mucho más del 24% de tiempo de operación se debe recurrir necesariamente al rediseño del circuito o de partes del mismo. Nuevamente la potencia de VHDL simplifica en gran medida esta tarea. Por otro lado, las herramientas incluidas en los CAD para circuitos integrados no necesariamente proveen los resultados en la forma necesaria para una correcta evaluación. En el caso del sumador, el entorno de CAD no identifica más que bloques de hardware y por lo tanto debe reorganizarse la salida de las herramientas para identificar claramente las etapas del pipeline en cuanto a bloques que contienen y cuáles bloques dentro de cada etapa son importantes en cuanto a su pertenencia al camino crítico de propagación de las señales. En términos de la continuidad de las tareas de diseño, el paso inmediato sería la definición de un sumador que cumple la norma IEEE de punto flotante de simple y doble precisión. Esto implica, por ejemplo, incluir el manejo de NaN y números no normalizados. En cuanto a la implementación se debería elegir una tecnología definitiva, y esto puede significar un posible cambio a otra herramienta de CAD como Cadence. Desde el punto de vista de las alternativas de mejorar los tiempos de diseño, es importante considerar la paralelización de la simulación de código VHDL. Esto permitiría definir un conjunto de casos de pruebas mayor y por lo tanto aumentaría también la confiabilidad del diseño en VHDL. Otra de las tareas que ha demostrado que consume mucho tiempo es la de optimización vía las herramientas de síntesis. En particular, las heurísticas consumen mucho tiempo de ejecución, principalmente sobre los bloques de hardware más complejos. Sin embargo, en este caso se estarían modificando las herramientas mismas del CAD. [5] Kai-shing Lam, Frederic Ak, “Alliance Tutorial, Part 3 Place and Route”, Pierre & Marie Curie University, France, pp. 2-7, 2004. Included in the Alliance distribution available at: http://www-asim.lip6.fr/pub/alliance/distribution/latest/ [6] Greiner A., F. Pêcheux, “ALLIANCE . A Complete Set of CAD Tools for Teaching VLSI Design”, Proceedings of the Third Eurochip Workshop on VLSI Design Training, pp. 23037, Grenoble, France, Sept. 1992. [7] Équipe Architecture des Systèmes et Micro-Électronique, Alliance: A Complete CAD System for VLSI Design, LIP 6, Université Pierre et Marie Courie, France. http://www-asim.lip6.fr/pub/alliance/distribution/latest/ [8] Virginia Polytechnic Institute and State University, “Cadence tutorial for VLSI Design”, January 25, 2003. http://www.ee.vt.edu/~ha/cadtools/cadence/cadence.html [9] ANSI/IEEE Std 754-1985, “IEEE Standard for Binary Floating-Point Arithmetic”, The Institute of Electrical and Electrionics Engineers, pp. 3-13, 1985. [10] Seidel P-M., Even G., “On the Design of Fast IEEE Floating Point Adders”, 15th IEEE Symposium on Computer Arithmetic, p. 184, June 11 - 13, 2001, Vail, Colorado. [11] Koren I., Computer Arithmetic Algorithms, 2nd. Edition, A. K. Peters, Natik, MA, 2002, ISBN 1-56881-160-8. [12] Jain S. A., Low Power Single-Precision IEEE Floating Point Unit, Master of Engineering, MIT, May 2003. [13] SXLIB Standard Cell Library Description. http://www.vlsitechnology.org/html/sx_description.html [14] Kai Hwang, Advanced Computer Architecture: Parallelism, Scalability, Programmability. McGraw-Hill Science/Engineering/Math, Dec. 1992, ISBN: 0070316228 [15] Neil Weste, Kamran Eshraghian, Principles of CMOS VLSI Design, Addison-Wesley Publishing Company, USA, 1985. 8. REFERENCIAS [1] IEEE Standard VHDL Language Reference Manual, Std. 1076-1993, IEEE, NY, 1993. [16] Jan M. Rabaey, Anantha Chandrakasan, and Borivoje Nikolic, Digital Integrated Circuits - A Design Perspective, Second Edition, Prentice Hall, ©2003, ISBN 0-13-090996-3. [2] J. Bhasker, A VHDL Primer, Prentice Hall PTR, Upper Saddle River NJ 07458, 1995. [17] John F. Wakerly, Diseño Digital Principios y Practicas, Prentice Hall Hispanoamericana, 53500 Naucalpan de Juárez – México, 1992. [3] Kai-shing Lam, Frederic Ak, “Alliance Tutorial, Part 1 VHDL Modeling and Simulation”, Pierre & Marie Curie University, France, pp. 2-16, 2004. Alliance distribution: http://www-asim.lip6.fr/pub/alliance/distribution/latest [18] William Stallings, Organización y Arquitectura de Computadores, Prentice Hall, Madrid, 1997. 10