La Optimización de Rutado en FPGAs con Algoritmos Genéticos Dr. Falcón-Urquiaga W 1, Dr. Altuna-Iraola J 2 1 Universidad de Pinar del Río, Pinar del Río, Cuba, [email protected] http://www.upr.edu.cu 2 Mondragón Unibertsitatea, Mondragón, España, [email protected] http://www.eps.muni.es Resumen. Dentro de la evolución de las tecnologías de diseño de circuitos integrados, los FPGAs juegan el papel fundamental para ser usados en los sistemas reconfigurables. La ubicación de los módulos de un diseño en la estructura de un FPGA garantizando una buena distribución de las rutas, es una de las etapas del flujo de diseño de aplicaciones sobre esta tecnología, con gran influencia sobre los retardos, y como la velocidad de transferencia de información es uno de los parámetros más importantes a tener en cuenta en el desarrollo de sistemas electrónicos, la optimización de esta etapa es de suma importancia. Algunos aspectos relacionados con la influencia de la ubicación y rutado en las demoras de procesamiento en los FPGAs, y con la optimización de dicha ubicación y rutado mediante el uso de Algoritmos Genéticos, son presentados en este tutorial. 1 Introducción En los últimos años, la tecnología de FPGAs (Field Programmable Gate Array) ha permitido disponer de dispositivos totalmente fabricados y verificados que se pueden personalizar desde el exterior mediante diversas técnicas de programación. Por una parte, los FPGAs posibilitan el diseño de aplicaciones con la misma flexibilidad en cuanto a programación que los microprocesadores y con mayor flexibilidad en cuanto a la implementación de diseños en forma paralela se refiere. Por otra parte, en comparación con los ASICs Full Custom o Semicustom, donde cualquier cambio en los requerimientos de la aplicación significa cambio de tecnología, los dispositivos reconfigurables del tipo FPGA y las modernas metodologías de diseño basadas en HDL (Hardware Description Language), permiten los cambios con gran flexibilidad y sin necesidad de sustitución del hardware. Los FPGAs son el hardware ideal para aquellas aplicaciones en las que continuamente puede haber un cambio en el diseño [1], [2], [3]. El uso de los FPGAs también tiene ventajas económicas en comparación con los ASICs, cuando se trata de productos a pequeña escala como es el caso de los prototipos. En primer lugar, el grado de integración que han logrado alcanzar los FPGAs gracias al desarrollo de la microelectrónica (tecnologías de fabricación, en el año 1998, en el orden de los 0.22 µm y 1 millón de puertas de sistema por chip y ya hoy se cuenta con tecnologías en el orden de los 0.09 µm y hasta 10 millones de puertas de sistema [4]). En segundo lugar, por las ventajas propias de generar diseños muy complejos para estas tecnologías a través de un lenguaje de descripción de hardware, independientemente del fabricante, con posibilidad de reutilización de los códigos, eliminando el coste de fabricación y disminuyendo los tiempos de diseño [5], [6], [7]. Y por último, y en tercer lugar, por las posibilidades de reprogramación de estos dispositivos y de admitir diseños con paralelismo incluido [8], [9], [10], es que los FPGAs se han convertido en el manjar más codiciado para los diseñadores y fabricantes de aplicaciones electrónicas. El diseño de aplicaciones sobre FPGAs se divide por etapas, como se representa en la Fig. 1 y en su conjunto son llamadas flujo de diseño. Dentro de las etapas del flujo de diseño sobre FPGAs, la ubicación y rutado tiene como objetivo lograr una adecuada disposición de los módulos en la estructura del FPGA, garantizando la mejor distribución de rutas, para lograr disminuir las demoras y el consumo. La mayor parte de las demoras y del consumo de un circuito implementado sobre un FPGA, son debidas al rutado [11], [12], [13], [14], por tal motivo la optimización de la etapa de ubicación y rutado adquiere gran importancia. El problema fundamental que se trata en este tutorial, precisamente es la optimización de la etapa de ubicación y rutado dentro del flujo de diseño de aplicaciones sobre FPGAs. Debido a que el problema de la ubicación y rutado está dentro del grupo de problemas NP completos (Non-deterministic Polynomial-time), afirmación que ha sido argumentada en [15] y que se repite en [16], [17], [18] y [19], se a centrado la atención en los algoritmos heurísticos de tiempo polinomial, que "resuelven" un problema, en un sentido razonable, para el que no se conoce ningún algoritmo determinístico en tiempo polinomial que pueda darle solución. D is e ñ o d e E n tr a d a S ín te s is Im p le m e n ta c ió n T ra d u c c ió n M apeo P la c e & R o u te F ic h e ro d e C o n fig u ra c ió n P ro g r a m a c ió n d e l F P G A Fig. 1. Flujo de diseño para aplicaciones sobre FPGAs Dentro del grupo de los algoritmos heurísticos, con posibilidades de tratar el problema de la ubicación y rutado, se han elegido a los Algoritmos Genéticos (GAs-Genetics Algorithms) y se han diseñados dos de estos algoritmos para optimizar la ubicación de los módulos resultantes del mapeo en los diseños de aplicaciones sobre FPGAs. Uno de ellos actúa sobre la asignación de los pines de entrada-salida, y el otro actúa sobre la ubicación de los módulos resultantes del mapeo en la estructura del FPGA, influyendo ambos en las demoras máximas del diseño y en el promedio de todas las demoras. Los dos GAs permiten aumentar las velocidades de transferencia de datos para diseños sobre FPGAs, en comparación con los resultados de las herramientas de desarrollo actuales. 2 Flujo de Diseño para FPGAs En cada una de las etapas del flujo de diseño sobre un FPGA se influye en mayor o menor medida en la velocidad de respuesta, en el área que ocupa el diseño y en el consumo. A continuación se describirá el flujo de diseño para aplicaciones sobre FPGAs (Fig. 1), resaltando los objetivos de cada fase. Para el trabajo se ha tomando como base las tecnologías de diseño de Xilinx y la herramienta de desarrollo de este fabricante, ISE versión 5.1.03i. La estructura básica de un FPGA de Xilinx está compuesta esencialmente por bloques lógicos configurables (CLBs-Configurable Logic Block), por matrices de interconexión programables (PSMs-Programmable Switch Matrix) y por bloques de entrada-salida programables (IOBs-Input-Output Block). Los CLBs posibilitan la implementación de las funciones lógicas que define el usuario, las PSMs soportan conexiones flexibles entre los propios CLBs así como entre IOBs y CLBs, y los IOBs proporcionan conexiones flexibles con otros circuitos dentro del sistema en que se encuentre el FPGA [10], [15], [20]. En el año 1985, el fabricante Xilinx, introduce el primer FPGA en el mercado, y actualmente su tecnología es de las más establecidas. Sus arquitecturas están basadas en tablas de búsquedas (LUTs-Look Up Tables) de k entradas, implementadas en bloques de memoria SRAM (Static Random Access Memory) de 2k bits. 2.1 Diseño de Entrada La primera tarea dentro del flujo de diseño electrónico sobre FPGAs, después de concebir la idea, es realizar una descripción de lo que se pretende hacer, ya sea mediante esquemáticos o mediante el uso de lenguajes de descripción de hardware. La captura de esquemas, fue la metodología de diseño utilizada cuando las densidades de integración de los FPGAs estaban en el orden de los cientos de puertas. Resulta un desafío para el pensamiento humano, hacer diseños que permitan utilizar toda el área de un FPGA actual mediante esta metodología. Es por este motivo que las metodologías de diseño actual tienden al uso de los lenguajes de descripción de hardware (VHDL, VERILOG, ABEL, ORCAD PLD, PALASM, CUPL, AMAZE, entre otros), que permiten aumentar la productividad de los diseños al hacer las descripciones desde niveles de abstracción superiores al usado en los esquemáticos. Para cualquier tecnología de FPGA que se use, e independientemente de las herramientas de desarrollo que se utilicen para el proceso de diseño e implementación, una misma descripción del problema será válida como diseño de entrada, siempre que la capacidad del hardware lo permita. 2.2 Síntesis Durante el proceso de síntesis, se hace una traducción del diseño de entrada a nivel de puertas lógicas (formato netlist) [8], [15]. Actualmente existen cuatro herramientas de síntesis que se pueden integrar en el flujo del diseño: XST (Xilinx Synthesis Technology) de la compañía Xilinx, Inc. y que se adquiere de forma gratuita unido a la herramienta de diseño lógico ISE Foundation, la herramienta FPGA Express de Synopsis, Inc., Leonardo Spectrum de Exemplar Logic, Inc. y el Synplify de Synplicity, Inc. [4]. Una vez hecha la síntesis se puede hacer una simulación funcional del sistema, para verificar el diseño. Los resultados de esta simulación no tienen en cuenta, las demoras que se generan en la ubicación y en el rutado del circuito lógico sobre el FPGA. 2.3 Implementación La implementación es una fase del flujo de diseño que está constituida por varias etapas. Dentro de sus principales objetivos se encuentran, lograr una adecuada partición del circuito para minimizar el número de LUTs a utilizar, y hacer una adecuada ubicación de los bloques resultantes del proceso de partición en la estructura del FPGA, garantizando un buen rutado entre ellos. De los resultados del proceso de implementación fundamentalmente, dependerán el área que ocupe el diseño en la estructura del FPGA, el consumo de potencia, y la velocidad máxima de trabajo. La primera etapa de la implementación es la traducción. En esta etapa se combinan los ficheros resultantes de la síntesis, y unido con las restricciones que se le pueden hacer al diseño, se produce un fichero que describe el circuito a implementar en términos de las primitivas de diseño de Xilinx [10]. La segunda etapa es el mapeo, donde se recibe como entrada al fichero resultante de la traducción. En esta etapa, se agrupan convenientemente los elementos básicos en bloques lógicos, que se corresponden con la estructura del FPGA que se tenga. El objetivo de las herramientas de mapeo es encontrar la mejor asignación lógica de los CLBs, entiéndase por ello, reducción del número de LUTs utilizadas debido a una adecuada partición del circuito, lo cual contribuye a minimizar el área utilizada en el chip, a mejorar la rutabilidad del diseño, y otros factores como pueden ser las demoras y el consumo [21]. El proceso de mapeo consiste en dividir un circuito en partes pequeñas, de forma tal que cada una de ellas se ajuste al componente básico de un FPGA [15]. Las herramientas actuales de implementación no garantizan que se haya hecho el mejor mapeo debido a la naturaleza NP de éste problema [23]. Por tal motivo se han dedicado muchos esfuerzos en aras de obtener resultados superiores en esta etapa del flujo de diseño, encontrando trabajos, por sólo mencionar algunos, como los presentados en [24], [25], [26], [27]. La tercera etapa dentro del proceso de implementación es la fase de ubicación y rutado, que se encarga de ubicar los componentes o módulos que se obtienen del mapeo en los CLBs físicos, así como de decidir los IOBs que se utilizarán, y se encarga también de hacer el rutado entre los CLBs seleccionados y entre los IOBs y CLBs [15]. Una vez hecha la ubicación y el rutado, se puede hacer una simulación temporal del sistema, y en este caso, sí se proporciona información de las demoras que se generan en la ubicación y en el rutado del circuito lógico sobre el FPGA. 2.4 Configuración La última etapa del flujo de diseño se denomina configuración. En ella se recibe como entrada el fichero que proporciona la etapa de ubicación y rutado, y se genera el fichero de configuración con el que será programada el FPGA. El fichero generado, también llamado de programación, puede ser codificado en diferentes formatos, y contiene toda la información sobre la configuración del FPGA para que se genere en ella el hardware correspondiente que responde a la aplicación implementada. 3 Ubicación y Rutado en FPGAs La mayor parte de las demoras y del consumo de un circuito implementado sobre un FPGA, son debidas al rutado y no a las demoras que se generan en los CLBs e IOBs [11], [12], [13], [14]. Muchos investigadores han planteado y demostrado, que una fracción significativa de los retardos de un circuito, provocados por las rutas de interconexión, se relaciona con el número de puntos de interconexión programables (PIP-Programmable Interconnect Points) a través de los cuales pasa una señal [28], [29], [30], [14]. La estructura lógica de los FPGAs de Xilinx proporciona varias conexiones de rutado local [22], como son: trayectorias dedicadas para la conexión directa entre las LUTs de un mismo CLB que generan un mínimo de demora de rutado; rayectorias de interconexión entre LUTs, registros y las PSMs; y trayectorias directas, que proporcionan conexiones de alta velocidad entre CLBs adyacentes, eliminando los retardos de las PSMs. Estas conexiones de rutado local, son recursos de interconexión dedicados que generan demoras mínimas. Otro recurso dedicado que genera demoras mínimas, aunque no se considera un recurso de rutado local, lo constituyen las líneas de distribución de relojes dedicadas, que garantizan el sincronismo de la señal de reloj entre todos los puntos del FPGA. Por otra parte, se encuentran las rutas de interconexión general que dominan todo el chip de forma horizontal y vertical, y que se unen a través de las PSMs; así como, los recursos de rutado que permiten la unión entre los CLBs y los IOBs, también utilizando conexiones a través de PSMs. Las PSMs no son más que una colección de transistores NMOS (Negative channel Metal Oxide Semiconductor), o de buffer tercer estado, que conectados adecuadamente se encargan de habilitar la unión entre dos líneas de conexión. Estas PSMs están constituidas por PIPs, que son grupos de seis transistores que posibilitan la conexión entre dos líneas [31], [32]. La distribución de los seis transistores en un PIP, se representa en la Fig. 2. La conexión o no, de una línea con otra, se hace mediante la habilitación o no, de los transistores, y el control sobre ellos se produce mediante la programación de memorias SRAM que actú- an sobre su base, que es el terminal libre que se observa en la figura. Los PIPs, además de encontrarse en las PSMs, se pueden encontrar en la unión entre las trayectorias locales y globales del FPGA. Las trayectorias que usan las PSMs, son las que generan mayores demoras, y como consecuencia, limitan la velocidad del diseño [22]. FPGA IOB CLB PSM PIP PSM Fig. 2. Matrices de interconexión en la estructura de un FPGA de Xilinx Al hacer la ubicación de los módulos resultantes del mapeo, en la estructura del FPGA, se generan rutas de interconexión, que pueden ser mayores o menores, en dependencia de la ubicación que se les de a los módulos. El principal objetivo de los algoritmos de ubicación es disminuir esos tamaños de las rutas de interconexión, para disminuir el número de PIPs y con ello los retardos. La ubicación y rutado es una etapa dentro del proceso de implementación que no se considera óptima porque las herramientas actuales no lo garantizan, dada la naturaleza de éste problema. Por este motivo y por la influencia de esta etapa en los retardos y el consumo, es que los trabajos que se hagan para mejorarla siempre serán importantes. En la rapidez de respuesta de un FPGA, influye de forma general: el área ocupada por la aplicación (número de CLBs, IOBs, rutas y los PIPs utilizados), la ubicación que se le dé a los módulos de la aplicación dentro del FPGA y las interconexiones entre módulos. Una de las etapas del flujo de diseño, que posibilita la disminución de los retardos, es la etapa de mapeo, aunque su influencia fundamental está dirigida a la reducción de área. Otra etapa del flujo de diseño, que influye considerablemente sobre los retardos es la etapa de ubicación y rutado. Como el principal objetivo de esta etapa es garantizar la mejor distribución de las rutas de interconexión reduciendo sus distancias, se puede plantear que la velocidad sería el parámetro más favorecido para una adecuada ubicación y rutado. Dentro de los algoritmos de ubicación y rutado para FPGAs que mejores resultados han presentado en cuanto a densidad de rutado y a demoras de interconexión se encuentran: VPR [33], SEGA [34], TRACER-FPGA-PR [35] y el algoritmo de rutado de Eum et al. [36]. Aunque se han desarrollado trabajos en este sentido, la creación de métodos de optimización para esta fase del flujo de diseño es muy importante, máxime, si se trata de aplicaciones que necesitan de altas velocidades de procesamiento para garantizar sus requerimientos. 4 Algoritmos de Optimización para el problema de la Ubicación en FPGAs La solución a los problemas de alto nivel de complejidad computacional, como es el caso de los problemas NP completos, ha sido un desafío constante a los investigadores de diversas áreas. El problema que se trata en este tutorial es la optimización de la etapa de ubicación, dentro del flujo de diseño de un FPGA, y como se comentó en los apartados anteriores, este problema es NP completo. Es por ello que se centrará nuestra atención en los algoritmos probabilísticos de tiempo polinomial. Durante los últimos años han aparecido una serie de métodos, generalmente usados para abordar problemas NP completos, denominados heurísticos, cuya finalidad es la de encontrar buenas soluciones a problemas de optimización complejos, aunque no garantizan que la solución sea óptima. Entre ellos se encuentran: el enfriamiento simulado (SA-Simulated Annealing), la búsqueda tabú (TS-Tabu Search), las redes neuronales artificiales (RNAArtificial Neural Networks) y los algoritmos evolutivos (EA-Evolutionary Algorithms). Dentro de los EAs se encuentran básicamente tres técnicas: la programación evolutiva (EPEvolutionay Programming), las estrategias evolutivas (ES-Evolution Strategies), y los algoritmos genéticos (GAs-Genetic Algorithms) [37], [38]. Existen más técnicas comprendidas dentro de los EAs, pero casi todas las demás se derivan de las mencionadas anteriormente. Cualquier problema de optimización que pueda tratarse como un problema de búsqueda del resultado óptimo dentro de un conjunto acotado de soluciones, aunque el tamaño sea considerablemente grande, para el cual se pueda obtener una función que en la búsqueda penalice a las malas soluciones y premie a las buenas, podrá ser tratado favorablemente con los EAs. Una ventaja importante que presentan las heurísticas frente a las técnicas que buscan soluciones exactas es que, por lo general, permiten una mayor flexibilidad para el manejo de las características del problema. No suele ser complejo utilizar algoritmos heurísticos que en lugar de funciones lineales utilicen no linealidades. Habitualmente las heurísticas proponen un conjunto de soluciones, ampliando de esta forma las posibilidades de elección del que decide, especialmente cuando existen factores no cuantificables que no han podido ser reflejados en el modelo pero deben ser tenidos en cuenta. En resumen, podría decirse que el uso de estas técnicas supone la posibilidad de resolver, de forma práctica, problemas de gran complejidad que resultan intratables mediante técnicas exactas. Las diferencias entre las tres técnicas fundamentales de la computación evolutiva se centran en los operadores que se usan en cada caso, y por lo general, en la forma de implementar estos operadores (selección, cruce y mutación). En este trabajo se ha decidido el uso de los GAs para mejorar la ubicación en el diseño sobre FPGAs. 4.1 Algoritmos Genéticos La computación evolutiva de modo general, y especialmente los GAs, se han convertido en los últimos veinte años, en uno de los focos de mayor interés para investigadores de diversas ramas de la computación y la ingeniería. Los GAs, desarrollados por Holland, se fundamentan en la integración e implementación eficiente de dos ideas fundamentales: las representaciones como cadenas binarias de las soluciones del problema y la realización de transformaciones simples para modificar y mejorar estas representaciones. Durante el procesamiento del algoritmo se mantiene una población que representa un conjunto de posibles soluciones, la cual es sometida a ciertas transformaciones aleatorias (mutación y entrecruzamiento) con las que se trata de obtener nuevos candidatos, y en un proceso de selección pueden ser favorecidos los mejores. Los GAs propuestos y extendidos por Holland en sus trabajos de 1962 a 1975, fueron retomados por Goldberg [39] en 1989 y popularizados con el nombre de Algoritmos Genéticos Simples (SGA: Simple Genetic Algorithm). Los SGA se basan en un principio básico de la evolución natural: los mejores individuos tienen mayor probabilidad de reproducirse y sobrevivir que otros individuos menos adaptados al entorno [39], [40]. La estructura del GA que implementa este principio se ha representado en la Fig. 3 en forma de pseudo código. t:=0; //Primera generación Generar Población Inicial P(t); //Crear de forma aleatoria población inicial Evaluar P(t); //Evaluar con la función de coste a cada individuo de la población while no se cumpla la condición de terminación do // Criterio de terminación Seleccionar Progenitores de P(t); //Seleccionar progenitores de la población Entrecruzamiento de los Progenitores; //Entrecruzar genes de los progenitores Mutar a los Descendientes; //Perturbaciones estocásticas de los descendientes Evaluar Descendientes; //Evaluar los descendientes y obtener sus pesos P(t+1):=Sobrevivientes; //Insertar en la población los descendientes t:=t+1; end; Fig. 3. Pseudo código de un algoritmo genético 4.2 Razones para el uso de los Algoritmos Genéticos y sus Ventajas La naturaleza (NP completo) del problema de la ubicación y rutado en FPGAs, es la primera razón para incluir a los GAs dentro del grupo de los métodos de optimización con posibilidades de utilización en la solución a este problema. De modo general, los algoritmos heurísticos son los más recomendados en la búsqueda de soluciones a problemas en los que, de entrada, se declina la posibilidad de encontrar la solución óptima debido a la cantidad ingente de candidatos [37], [38]. Cuando el espacio de búsqueda es muy grande, para encontrar una buena solución al problema en un tiempo aceptable, es recomendable explorar varias posibilidades de solución de forma simultánea (proceso con paralelismo). Existen dos formas de lograr este paralelismo, y una es con el uso de varios procesadores que hagan cómputo a la vez, mientras que la otra sería con una adecuada técnica de búsqueda. Los GAs, intentan modelar el proceso de la evolución natural, y para ello hacen la búsqueda en paralelo de un “buen” individuo (una buena ubicación en la estructura del FPGA) dentro de una población (conjunto de posibili- dades de ubicación) cambiante. Los GAs, operan de forma simultánea con varias soluciones, en lugar de trabajar de forma secuencial como las técnicas tradicionales. Los GAs, desde su surgimiento, fueron desarrollados para resolver problemas de optimización combinatoria, pero de tipo discretos, o sea que el espacio de búsqueda en estos problemas debe de estar delimitado dentro de un cierto rango conocido. El problema de la ubicación en FPGAs, se produce fundamentalmente porque el espacio de búsqueda es muy grande, pero precisamente es discreto, porque el número total de posibilidades de solución es conocido (ver ecuación (3)). El problema de la ubicación en un FPGA puede ser codificado fácilmente, y la codificación podría generalizarse en una matriz. Por otra parte, como el aspecto más interesante en la ubicación, es disminuir las distancias de interconexión y con ello los PIPs, la función de coste para este problema podría ser una función que calculase la distancia entre dos puntos en una matriz, y de modo general las operaciones que habría que hacer serían sólo sumas y restas, con almacenamiento de valores. Tanto el trabajo con matrices, y las operaciones que se han mencionado, son muy fáciles de tratar en ordenadores, y como los GAs se prestan para dar solución a problemas donde las soluciones se puedan codificar fácilmente de forma que resulte fácil la implementación en un ordenador, y donde se pueda definir una función de aptitud que indique la bondad de una respuesta [41], se mantiene la idea de que los GAs pueden dar buenos resultados en la solución al problema en cuestión. Los algoritmos genéticos son el paradigma con mayor base teórica dentro de la computación evolutiva. Además, dicha base teórica es sencilla en su desarrollo y con grandes posibilidades de ampliación [39], [40], [42], [43], [44]. Es importante señalar además, que el número de aplicaciones en las que se han usado los algoritmos genéticos en los últimos años, dando resultados satisfactorios, es bastante amplio lo que brinda confianza en su uso [39], [45], [46] y [47]. Los algoritmos evolutivos, no son un juego de técnicas que están listas para ser aplicadas a cualquier problema de optimización, sino que son un juego de técnicas que tienen que ser modificadas y entalladas a mano para cada problema de optimización en cuestión [38], de aquí el hecho del diseño del GA para el problema planteado en este tutorial. 4.2.1 Formulación del Problema Con el uso de los GAs se quiere mejorar la ubicación para diseños de aplicaciones sobre FGPAs, con el objetivo de disminuir retardos de propagación. Con una adecuada ubicación del diseño en un FPGA, se pueden disminuir las distancias de las rutas de interconexión y esto repercute de forma directa en los retardos y el consumo. El problema de la ubicación se puede reducir a colocar a elementos en b posiciones posibles. Los a elementos representan el número total de módulos resultantes del mapeo de una aplicación para un FPGA determinada, y será la suma del número de LUTs (al), del número de registros (ar) y del número de módulos suma (as) (ecuación (1)), que se usarán por la aplicación, del total b de la estructura del FPGA. Consideraremos que se usará como FPGA una Virtex de Xilinx [4], que dispone por cada CLB de cuatro LUTs, cuatro registros tipo D, y de cuatro elementos de multiplexado que serán dedicados para la propagación de acarreos y a los que informalmente les llamaremos módulos suma. Definiendo al número de CLBs totales de un FPGA como NCLB, entonces el valor de b para la Virtex de Xilinx se calcularía a través de la ecuación (2). (1) (2) a = al + ar + as . b = 12 * NCLB . Para un problema como éste, el número de posibilidades de ubicación diferentes en el FPGA es igual a Cb,a y se calcula con la expresión que representa el número total de variaciones sin repetición (3). (3) Cb,a = b!/(b-a)! . En un ejemplo donde a = 3 y se use un FPGA con NCLB = 1536 (b = 18432), el total de posibilidades de ubicación que habrá, en base a la ecuación (3) será de 6.26x1012. Mientras más módulos se estén usando del FPGA mayor número de posibilidades hay, y este problema puede llegar a ser tan complejo como tener todo el FPGA ocupada que sería lo mismo que buscar una posibilidad de solución de ubicación de entre 18432!, para este ejemplo. Un FPGA se puede representar como una matriz con m filas y n columnas, donde la intersección entre filas y columnas pueden representar un módulo (LUT, registro o módulo suma). Los a elementos están entrelazados entre si, y si se conoce la ubicación de estos elementos en la matriz (estructura del FPGA) y las rutas de conexión entre ellos, se podría calcular las distancias de las rutas de interconexión. Teniendo en cuenta esta explicación, se podría formular una función de coste que evalué la bondad de una ubicación para una aplicación en un FPGA, en base a la suma total de las distancias de rutas. Para mejorar la ubicación habría que minimizar la función que calcule las distancias entre las rutas de los a módulos. Esta función se expresa a través de la ecuación (4), donde Dcr representa la suma total de las distancias de las k rutas del diseño, FLUTa es la fila del módulo origen y FLUTb la del módulo destino, y CLUTa es la columna del módulo origen y CLUTb la del módulo destino. k Dcr = ∑(F LUTa − FLUTb + C LUTa − C LUTb ). (4) i =1 La búsqueda de ubicaciones óptimas a diseños sobre FPGAs es el problema que se ha planteado optimizar mediante el uso de algoritmos genéticos. Para ello se ha partido del conocimiento del flujo de diseño estándar, y con apoyo en los resultados de las herramientas de desarrollo de Xilinx, se ha mejorado la etapa de ubicación. Los SGAs parten del criterio de que la población se genera de forma aleatoria, pero en este caso se ha hecho una pequeña modificación y es que el primer individuo de la población en los dos GAs diseñados, no se crea de forma aleatoria, sino que se extrae de los resultados de la implementación que se ha hecho siguiendo las etapas del flujo de diseño estándar de Xilinx. El resto de la población si se genera de forma aleatoria. Una vez finalizada la fase de ubicación y rutado, se genera el fichero NCD (Native Circuit Description), que contiene toda la información de rutado y de utilización de los recursos en el FPGA. Se propone hacer uso de este fichero NCD resultante de la ubicación y rutado, y mediante el uso de GAs mejorar la ubicación del diseño. En la Fig. 4 se muestra el nuevo flujo de diseño que se propone. Haciendo uso de la herramienta Floorplanner de Xilinx, se convierte el fichero NCD que está en formato binario a formato texto, y se obtiene el fichero FNF (Floorplanner Netlist File). A partir de aquí, y haciendo uso de un algoritmo programado en Perl, se genera un nuevo fichero texto (cromosoma.txt) que tendrá codificada la utilización de los recursos del FPGA, información que será utilizada por el GA para producir nuevos resultados de ubicación que minimicen las distancias de las líneas de interconexión. Con estos resultados se modifica el fichero original FNF, que sería interpretado por las herramientas de implementación de Xilinx como una edición manual de la ubicación y rutado haciendo uso del FloorPlanner, y se genera nuevamente el fichero NCD haciendo uso de las herramientas de ubicación y rutado de Xilinx, dándole continuación a su flujo de diseño estándar. Los análisis que se hacen a continuación y los resultados que se presentan son en base al FPGA XCV300pq240 de Xilinx (aunque el trabajo es extensible a cualquier FPGA). Este dispositivo cuenta con 166 pines de entrada-salida (de los 240 que dispone), y el número de CLB totales que tiene es de 6144. Los resultados que se muestran por las herramientas de Xilinx han sido obtenidos con un máximo de esfuerzo en el proceso de ubicación y rutado y con el parámetro de máxima velocidad (-6). D is eñ o d e E n tra d a S ín te sis Im ple m en tación T radu cción M ap eo P la ce & R oute F lo o rP lan n e r (N C D a F N F ) F N F a C ro m o s o m a.txt O p tim iza C o lo ca ció n N ue va E ta pa G e n era N u e vo F N F P lace & R o u te F ich ero de C o nfigu ra ció n Prog ra m ación del F P G A Fig. 4. Variación del flujo de diseño de Xilinx 4.2.2 SGA para la mejora de la ubicación de pines en diseños sobre FPGAs Se ha implementado un algoritmo genético simple para optimizar la distribución y asignación de pines para una aplicación sobre un FPGA, que disminuye las demoras de conexión en el diseño y contribuye al aumento de la velocidad de transferencia de datos. El problema de la ubicación de pines se reduce a buscar la mejor asignación y distribución de los pines de entrada salida que use una aplicación (Np), del total disponible del FPGA (Npt). Para el XCV300pq240 Npt = 166, y el número total de soluciones se puede buscar aplicando la ecuación (3) siendo b = Npt y a = Np, por lo tanto, el peor caso pudiera significar un total de 166! soluciones diferentes de ubicación de los pines (un poco más de 9x10297), que sería si cada pin de entrada salida está siendo usado en la aplicación. A continuación se describirán los operadores del SGA diseñado (selección, cruce y mutación), así como la codificación escogida. Finalmente se mostrarán los resultados de la aplicación del algoritmo en la optimización de aplicaciones. 4.2.2.1 Algoritmo Genético Diseñado En el diseño de este algoritmo genético se decidió una codificación binaria donde cada cromosoma es un array de tres dimensiones (Fig. 5). Cada elemento del array representa una posibilidad de conexión de un pin a un CLB. Dos dimensiones del array son usadas para definir cada CLB (CLBx,y), y la otra dimensión sería un vector de 166 elementos (E = (e1,e2, ..., e166)), donde cada elemento ei representa a uno de los posibles pines de entrada salida. Se ha tomado como consenso que si ei = 1 entonces se estará usando por el CLBx,y el pin i y si ei = 0 entonces el pin i no se estará usando. Para el FPGA del ejemplo se tienen 32x48 CLBs pero la codificación se hace con una matriz de 34x50 porque se incluyen dos filas y dos columnas para designar como un punto en el espacio a los pines también. La tercera dimensión para los elementos de la matriz de 34x50 que representan pines, siempre será un vector con todos sus elementos en cero (de un pin no hay conexión a otro pin). Pines FPGA XCV300 PQ240 CLB 2 32x48x 1 0 0 1 31 . . . 1 32 2 47 48 0 1 0 1 1 2 3 4 163 164 165 166 Fig. 5. Representación de la estructura de cada cromosoma Como se comentó anteriormente, el primer individuo de la población no se crea de forma aleatoria. Este individuo será la solución que han generado las diferentes etapas del flujo de diseño estándar de Xilinx. Para codificar esta solución al formato de un cromosoma, es necesario tener como entradas un fichero con la información de la posición física de los pines de entrada salida (pines.txt) y otro con la información de todas las conexiones entre pines y CLBs para el diseño. Este segundo fichero se obtiene por el procedimiento descrito en el apartado 4.2.1 y se llamó cromosoma.txt. Una vez se tenga esta información se codifica a la estructura en forma de array binario de tres dimensiones explicada anteriormente. La generación del resto de los individuos de la población se hace de forma aleatoria, pero respetando que cada uno de ellos sea solución de la aplicación que se haya diseñado. De forma empírica se ha escogido el tamaño de la población en 100, tratando de llegar a un compromiso entre el riesgo de no cubrir adecuadamente el espacio de búsqueda con una población pequeña, y el del excesivo coste computacional debido a una población grande. Una vez generada la población se computa la función de coste de cada individuo. Para minimizar las demoras del rutado, lo que se trata es de lograr que las distancias de los pines a los CLB sean mínimas. Como que en este diseño sólo se tienen en cuenta las rutas que unen a pines con CLBs, el término k de la ecuación (4) será el número totales de pines de entrada salida, quedando la función de coste para este SGA como la ecuación (5). En este caso FCLBi y CCLBi son la fila y columna del CLBi conectado con el pin pi cuya posición en el plano es (Fpi, Cpi). Dcr = i =166 ∑ (| F CLBi − F Pi | + | C CLBi − C Pi |) . (5) i =1 El proceso de selección de un individuo (selección proporcional a la función objetivo), se hace en base a una función de distribución de probabilidad que depende del valor de la función objetivo de cada individuo, por lo que con este criterio de selección se favorecerán a los individuos más aptos. En éste sentido, si se tiene al individuo xit y asumiendo que el tamaño de la población es T y que se quiere maximizar la función O, entonces la probabilidad de selección de este individuo, ps(xit), se representa mediante la ecuación (6). Se seleccionan dos individuos de forma aleatoria usando el método de la ruleta. Este método es muy sencillo y aparece explicado en numerosas referencias bibliográficas, por ejemplo [39]. p s ( xit ) = O ( xit ) T ∑ . (6) O ( x kt ) k =1 El cruce se hizo intercambiando la información entre los progenitores, de un CLB escogido de forma aleatoria, y respetando que los descendientes sean soluciones de la aplicación en cuestión. El cruce está presente en cada generación. El tipo de cruce que se hizo realmente no es el habitual de los SGA, porque no es cruce de un punto [15] sino el cruce de dos puntos (Fig. 6) que según la teoría debe ofrecer mejores resultados. La mutación también está presente en este algoritmo y siempre ocurre. Se llevó a cabo escogiendo un CLB y un bit específico (pin) de forma aleatoria, y el proceso de mutar consistió en usar un nuevo pin (un bit que estaba en ‘0’ ponerlo a ‘1’) y por supuesto desactivar uno de los que se estaban usando (un bit que estaba en ‘1’ ponerlo a ‘0’), como se representa en la Fig. 7, esto para cada descendiente y también respetando que se mantengan como soluciones del circuito que se implementa. Puntos de Cruce Puntos de Cruce Padre: 1 0 1 1 0 1 0 0 0 0 0 1 Madre: 0 0 1 0 1 1 0 1 1 1 0 1 Hijo 2: 1 0 1 1 0 1 0 1 0 0 0 1 Hijo1: 0 0 1 0 1 1 0 0 1 1 0 1 Fig. 6. Entrecruzamiento de dos puntos Descendiente ‘0’ ‘1’ CLB 1,1 ‘1’ Descendiente Mutado CLB 1,1 ‘0’ Fig. 7. Proceso de mutación Por último se hace la inserción en la población de los descendientes. En los dos GAs diseñados en el contexto de esta tesis, se ha utilizado el criterio de reemplazo del peor. Los nuevos individuos creados, sustituyen a los peores individuos de la población actual. 4.2.2.2 Resultados Experimentales Como resultados experimentales se muestra la evolución del GA y las mejoras de tiempos para dos aplicaciones. La primera aplicación es el diseño de un reloj digital y la segunda es el diseño del decodificador para los códigos de corrección de errores LDPC (20,3,4), implementados sobre la tarjeta de desarrollo XSV300 suministrada por XESS Corporation. En la primera aplicación las demoras promedios de conexión de todo el diseño se mejoraron en 0.043 ns (el GA logró reducir las demoras de 1.179 ns a 1.136 ns) y la evolución del GA se muestra en la Fig. 8. En la Tabla1 se muestran los resultados de las demoras de conexión para la segunda aplicación, después de hacer la implementación siguiendo el flujo de diseño estándar de Xilinx, y optimizando mediante el uso del GA. Se observa una ligera mejora, que aunque parezca insignificante, al traducirlo a velocidad de transferencia de datos si puede ser significativo. Mediante el uso del GA diseñado, se influye fundamentalmente en el promedio de las demoras de todo el diseño. Fig. 8. Evolución del GA en la mejora de ubicación de pines Parámetro Herramientas Xilinx GA (ns) (ns) Promedio de las demoras de co1.725 1.713 nexión para este diseño. Máxima demora de un pin. 6.475 6.459 Promedio de las demoras de co5.910 5.895 nexión para las 10 peores rutas. Mejora del GA vs Xilinx (%) 0.69 0.24 0.25 Tabla 1. Comparación de retardos haciendo ubicación de pines automática y con el GA 4.2.3 GA para mejorar la ubicación interna del diseño sobre FPGAs Se ha implementado un segundo algoritmo genético para optimizar la ubicación de módulos resultantes del mapeo, para un diseño sobre un FPGA. A continuación se describirán los principales operadores de este GA diseñado y se mostrarán los resultados de su uso. 4.2.3.1 Algoritmo Genético Diseñado Para este problema, una solución será, un cromosoma que represente todas las rutas de interconexión del diseño. Cada ruta será un gen y se representará mediante dos puntos en el espacio (módulo origen y módulo destino), donde cada uno de ellos se corresponde con la ubicación de un módulo resultante del mapeo, en la estructura en forma de matriz del FPGA. En este GA también se ha representando al FPGA como una matriz, y para la estructura que usamos de ejemplo el array de dos dimensiones es de [66x98]. Estas son las dimensiones porque se ha querido detallar hasta el nivel de módulo (LUT, registro o módulo suma) y para ello se ha dividido cada CLB en cuatro sub-módulos. La codificación en este problema se ha ideado de forma tal que cada gen será un número complejo representado por dos números enteros, donde su parte real (x) representa al elemento origen de la conexión (ruta) y la parte imaginaria (yi) al elemento destino (x + yi). El valor entero de x y de y se calcula mediante las ecuaciones (7) y (8) respectivamente, teniendo en cuenta que en una matriz, cada elemento (fila,columna) puede representarse con estas expresiones mediante un valor entero en el sistema decimal. Ct es el número total de columnas de la matriz, 98 en este caso. Cada cromosoma estará constituido por un vector complejo de tamaño igual al número total de rutas de interconexión. (7) (8) x = (F1 - 1) * Ct + C1 . y = (F2 - 1) * Ct + C2 . Se ha usado el convenio de representar los dos valores de los puntos origen y destino de cada ruta de conexión, mediante un único elemento en forma de número complejo, porque de esta forma el procesamiento es más sencillo y rápido, siendo cada cromosoma un vector de V elementos (rutas), en lugar de una matriz de [Vx2]. Para obtener el cromosoma número uno de la población también hay que hacer uso del fichero pines.txt, porque un pin de entrada salida puede ser un extremo de una ruta de interconexión. El otro fichero que se utiliza (cromosoma.txt) es también generado con el mismo procedimiento que en el diseño anterior, lo que ahora la información que contendrá por cada línea son los dos puntos (origen y destino) de una ruta de interconexión y tendrá tantas líneas como rutas tenga el diseño. La generación del resto de los individuos de la población se hace de forma aleatoria, respetando que cada uno de ellos sea solución de la aplicación. Para este algoritmo se han hecho pruebas escogiendo desde tamaños de población en 50 hasta 500, y se sigue manteniendo el criterio de que con una población de 100 individuos, para el problema que se analiza, se obtienen resultados satisfactorios. El cómputo de la función de coste para cada individuo se hace mediante la ecuación (3) que ha sido reformulada convenientemente en la ecuación (9), siendo k el número de rutas de interconexión, y calculando los valores de F y C mediante las ecuaciones (10) y (11). Al evaluar un cromosoma lo que se debe hacer es calcular las distancias que representan cada gen o ruta y sumarlas todas, obteniendo un valor que mientras menor sea, mejor solución representará ese individuo. Hay que convertir los valores enteros de x e y (Entero en (10) y (11)) a valores de sus filas y columnas correspondientes a la matriz que representa la estructura del FPGA. ∑ (F k Dcr = origen − Fdestino + C origen − C destino i =1 Entero − 1 +1. F = floor Ct C = mod((Entero − 1), Ct ) + 1 . ). (9) (10) (11) En la ecuación (10) floor representa una función que devuelve el valor entero de la división (el cociente), y en la ecuación (11) mod representa una función que devuelve el resto de una división. Ct es el número de columnas totales de la matriz. En este caso se han implementado los criterios de selección proporcional a la función de coste y proporcional al rango (ecuaciones (6) y (12)). En el primero de los casos se le da mayor probabilidad de selección a los individuos más aptos, y en el segundo se hace una distribución uniforme de las probabilidades de selección de los individuos. Para hacer la selección de los progenitores por el segundo método, se organiza la población en una lista de 1 hasta T en función de los valores de la función objetivo, siendo el primer elemento de la lista el que menos adaptado está, y el último aquel que mejor adaptado está. A continuación se calculan las probabilidades de selección de cada individuo, para lo cual existen diversas vías pero la más extendida es la del cálculo de la probabilidad lineal al rango. La probabilidad de selección de cada individuo ps(xit), para cada generación t y población de tamaño T, puede calcularse mediante la ecuación (12), donde p s ( xit ) ≥ 0 ∀i ∈ {1,2, , T } . De esta forma todos los individuos tienen la misma probabilidad de ser seleccionados. Al igual que en el diseño del GA anterior, se ha hecho uso del método de la ruleta para seleccionar dos individuos de la población. p s ( xit ) = Rango(O ( xit )) . T (T + 1) / 2 (12) Se han hecho pruebas con los dos criterios de cruce por separado, y también se han hecho pruebas utilizando los dos criterios de cruce durante una misma evolución. Las diferencias de los resultados no han sido significativas. El cruce se hizo seleccionando de forma aleatoria una ruta de interconexión e intercambiando la información de este gen entre los progenitores (tanto el módulo origen como el destino). En todas las generaciones se ha tenido en cuenta que los nuevos individuos que se generen sean soluciones del problema. A cada generación se aplica el criterio de mutación. En este caso la mutación ha consistido en elegir de forma aleatoria uno de los genes (una ruta) del individuo, y generar de forma aleatoria un nuevo extremo a esa ruta (origen o destino). Se es conciente de lo que implica ese cambio de ruta, y el algoritmo es capaz de reestablecer de forma adecuada todas las demás rutas que se ven implicadas en ese cambio. La generación aleatoria del nuevo extremo se fuerza a que sea un módulo libre del diseño sobre el FPGA. De aquí que también se extrae, con un procedimiento similar al de cromosoma.txt, de los resultados de las herramientas de desarrollo, la información de los módulos libres y se crea el fichero libres.txt. Finalmente, los nuevos individuos creados sustituyen a los peores individuos de la población actual, usando como criterio de inserción el “reemplazo del peor”. 4.2.3.2 Resultados Experimentales Para este segundo GA diseñado se mostrarán resultados en la optimización de las demoras de la implementación del decodificador LDPC (20,3,4). Se tendrán en cuenta modificaciones de los parámetros del GA, y en base a ello se ofrecerán diferentes resultados. Los resultados de la aplicación de este GA, mostrados en la Tabla 2, son comparados siempre con los obtenidas por el uso de la herramienta de diseño de Xilinx, mostrados en la Tabla1. Parámetro Simulación 1 Simulación 2 Simulación 3 Simulación 4 Número de Iteraciones 750 40000 10000 15000 Tiempo de Simulación 893 19390 5943 8167 Tamaño de Población 50 50 100 100 Criterio de Selección Coste Rango Coste+Rango Coste+Rango (1) Promedio de todas 1.658 ns 1.662 ns 1.651 ns 1.649 ns las demoras +3.88 % +3.65 % +4.28 % +4.4 % % de mejora vs Xilinx (1) 1.725 (2) Demora máxima 5.648 ns 5.531 ns 6.267 ns 5.250 ns +12.77 % +14.57 % +3.21 % +18.91 % % de mejora vs Xilinx (2) 6.475 Tabla 2. Demoras en la ubicación en el FPGA usando el GA, para el LDPC (20,3,4) Como se puede apreciar, con el uso del algoritmo genético, tanto las demoras promedios de todo el diseño, como las demoras máximas, son mejoradas con relación a los resultados de las herramientas de desarrollo de Xilinx. Una mejora de 1.225 ns en la demora máxima del diseño del decodificador LPDC, obtenida en la Simulación 4 es significativa si se tiene en cuenta que la frecuencia de trabajo de la aplicación es de 100 MHz. 5 Conclusiones Mejorando la etapa de ubicación y rutado para aplicaciones sobre FPGAs, de forma tal que se minimice el número de puntos de interconexión de las rutas del diseño, se mejora la velocidad de procesamiento de información. Todos los aportes que se hagan en aras de alcanzar mayores velocidades de procesamiento de información, son considerados de suma importancia. Alcanzar los 2 Gbit/seg como velocidad de transferencia de información es la meta actual en los sistemas de comunicaciones inalámbricas, pero no será la meta futura ni el tope. A pesar de los trabajos que se han desarrollado en aras de optimizar la etapa de ubicación y rutado del diseño de aplicaciones sobre FPGAs, se ha mostrado que los resultados de las herramientas actuales de desarrollo pueden ser mejorados. Se ha implementado un SGA para optimizar la distribución y asignación de pines para una aplicación sobre un FPGA, que disminuye las demoras de conexión en el diseño y debido a ello contribuye en el aumento de la velocidad de transferencia de datos. También se ha implementado un GA para optimizar la ubicación de módulos resultantes del mapeo para diseños sobre FPGAs, contribuyendo de igual forma al aumento de la velocidad de transferencia de datos. Para ambos diseños, se ha partido de la generación de un cromosoma a partir de los resultados entregados al final de la fase de ubicación y rutado, siguiendo la secuencia del flujo de diseño de Xilinx. Los resultados de los dos GAs son favorables, y se muestran mejoras en las demoras de conexión para los diseños donde se usen. Se ha propuesto una ampliación del flujo de diseño de Xilinx, como metodología para hacer uso de los GAs diseñados en la optimización de demoras para un diseño sobre un FPGA. En estos momentos el problema de la ubicación en FPGAs es un problema sin resolver, por tal motivo las aportaciones en éste campo siguen siendo de importancia. Independientemente a las mejoras que proporcionan los GAs diseñados, no se obtienen soluciones óptimas, claramente justificado por la naturaleza NP del problema y por el uso de algoritmos heurísticos. Se debe resaltar que los resultados de la optimización con GAs, en el problema de la ubicación para el proceso de diseño sobre FPGAs, es aplicable a todo el entorno de diseño de aplicaciones sobre estas tecnologías, y no a una aplicación únicamente. Referencias 1. Jamin, A., Mähönen, P. and Shelby, Z.: Software radio implementability of Wireless LANs. In the 12th Thurrhenian International Workshop on Digital Communications (2000). 2. Reichhart, S., Youmans, B. and Dygert, R.: The Software Radio Development System. IEEE Personal Communications, Vol. 6, No. 4 (1999). 3. Mitola, J.: The software radio architecture. IEEE Communication Magazine, Vol. 33, No. 5 (1995). 4. Xilinx: The home page for Programmable Logic, http://www.xilinx.com (2004). 5. Ashenden, P. J.: The Designer's Guide to VHDL. Morgan Kaufmann Publishers, Inc. (1996). 6. Pardo, F. y Boluda, J. A.: VHDL Lenguaje para Síntesis y Modelado de Circuitos. RA-MA (1999). 7. Skahill, K.: VHDL for Programmable Logic. Addison Wesley (1996). 8. Smith, D. J.: HDL Chip Design: A Practical Guide for Designing, Synthesizing and Simulating ASICs and FPGAs using VHDL or Verilog. Doone Publications (2001). 9. Altera, Inc.: Cyclone: The Lowest-Cost FPGA Ever, http://www.altera.com. 10. Xilinx: The Programmable Gate Array Data Book. Xilinx Inc. (1992). 11. Chung, K.: Size, Speed and Power Analysis for Application-specific Integrated Circuits Using Synthesis. M. S. Thesis, University of Tennessee (2003). 12. Singh, A. and Marek-Sadowska, M.: Efficient circuit clustering for area and power reduction in FPGAs. In Proceedings of the ACM/SIGDA Tenth International Symposium on FPGAs (2002). 13. Shang, L., Kaviani A. and Bathala, K.: Dynamic Power Consumption in Virtex-II FPGA Family. In International Symposium on Field Programmable Gate Arrays (2002) 157-164. 14. Kumthekar, B. and Somenzi, F.: Power and Delay Reduction via Simultaneous Logic and Placement Optimization in FPGAs. In Proceedings of the DATE’2000 (2000) 202-207. 15. Falcón-Urquiaga, W.: Optimización de Diseños sobre FPGAs e Implementación Paralela de Decodificador para LDPC. Tesis de Doctorado, Universidad de Mondragón (2004). 16. Cohoon, J. P., Karro, J., Lienig, J.: Evolutionary Algorithms for the Physical Design of VLSI Circuits. Advances in Evolutionary Computing: Theory and Applications (2003) 683-712. 17. Baruch, Z., Creţ, O. and Pusztai, K.: An Efficient Sequence to Apply Slicing Lines in FPGA Placement. In Proceedings of the Q&A-R 2000 International Conference on Quality, Automation and Robotics, Tome I (2000) 267-272. 18. Drechsler, R.: Evolutionary Algorithms for VLSI CAD. Kluwer Academic Publishers (1998). 19. Sait, S. M. and Youssef, H.: VLSI Physical Design Automation. McGraw-Hill, (1995). 20. Cong, J., Ding, Y., Gao, T. and Chen, K. C.: LUT-Based FPGA Technology Mapping under Arbitrary Net-Delay Models. Computers and Graphics, Vol. 18 (1994) 507-516. 21. Mazumder, P. and Rudnick, E. M.: Genetic Algorithms for VLSI Design, Layout & Test Automation. Prentice Hall PTR (1999). 22. Xilinx: Virtex Data Sheet, http://www.xilinx.com/partinfo/ds003.htm. 23. Pérez, J. I. H.: Técnicas de Partición y Ubicación para Sistemas Multi-FPGA basadas en Algoritmos Genéticos. Tesis de Doctorado, Universidad Complutense de Madrid (2001). 24. Francis, R., Rose, J. and Vranesic, Z.: Chortle-crf: Fast Technology Mapping for Lookup TableBased FPGAs. In Proceedings of the 28th Design Automation Conference (1991) 227-233. 25. Murgai, R., Shenoy, N., Brayton, R. K. and Sangiovanni-Vincentelli, A.: Improved Logic Synthesis Algorithms for Table Look Up Architectures. In Proceedings of the IEEE International Conference on Computer-Aided Design (1991) 564-567. 26. Karplus, K.: Xmap: A Technology Mapper for Table-Lookup Field- Programmable Gate Arrays. In Proceedings of the 28th Design Automation Conference (1991) 240-243. 27. Kao, C. C. and Lai, Y. T.: A Routability Driven Technology Mapping Algorithm for LUT Based FPGA Designs. IEICE Transactions on Fundamentals of Electronics, Communications and Computer Sciences, Vol. E84-A, No.11 (2001), 2690-2696. 28. Betz, V. and Rose, J.: FPGA Routing Architecture: Segmentation and Buffering to Optimize Speed and Density. ACM/SIGDA International Symposium on FPGAs (1999) 59-68. 29. Brown, S., Francis, R., Rose, J. and Vranesic, Z.: Field-Programmable Gate Arrays. Kluwer Academic Publishers (1992). 30. Duan, H., Lockwood, J. W. and Kang, S. M.: FPGA Prototype Queuing Module For High Performance ATM Switching. In Proceedings of the Seventh Annual IEEE International ASIC Conference (1994) 429-432. 31. Xilinx: The Programmable Logic Data Book. Xilinx, Inc. (2002). 32. Tahoori, M. B.: Improving Detectability of Resistive Open Defects in FPGA. In 5th MAPLD International Conference (2002). 33. Betz, V. and Rose, J.: VPR: A New Packing, Placement and Routing Tool for FPGA Research. Seventh International Workshop on Field-Programmable Logic and Applications (1997) 213-222. 34. Lemieux, G. G., and Brown, S. D.: A Detailed Routing Algorithm for Allocating Wire Segments in Field-Programmable Gate Arrays. In Proc. ACM/SIGDA Physical Design Workshop (1993). 35. Lee, Y.S. and Wu, A. C. H.: A performance and routability-driven router for FPGA's considering path delays. IEEE TCAD (1997). 36. Eum, N. W., Kim, T. and Kyung, C. M.: A Router for Symmetrical FPGAs Based on Exact Routing Density Evaluation. In Proceedings of the ACM/IEEE International Conference on ComputerAided Design (2001) 137-143. 37. Tomassini, M.: Evolutionary Algorithms. In Proceedings of the International Workshop Towards Evolvable Hardware, Lecture Notes in Computer Science, Vol. 1062 (1996) 19-47. 38. Larrañaga P. and Lozano J. A.: Estimation of Distribution Algorithms: A New Tool for Evolutionary Computation. Kluwer Academic Publishers, (2001). 39. Goldberg, D. E.: Genetic Algorithms in Search, Optimization and Machine Learning. Addison Wesley (1989). 40. Michalewicz, Z.: Genetic Algorithms + Data Structures = Evolution Programs. Springer-Verlag, Berlin Heidelberg New York, 3rd edn. (1999). 41. Coello, C. A.: Introducción a los Algoritmos Genéticos, Soluciones Avanzadas. Tecnologías de Información y Estrategias de Negocios, Año 3, No. 17 (1995) 5-11. 42. Vose. M. D.: The Simple Genetic Algorithm: Foundations and Theory. The MIT Press (1999). 43. Mitchell, M.: An Introduction to Genetic Algorithms. MIT Press (1996). 44. Rudolph, G.: Convergence analysis of canonical genetic algorithm. IEEE Transactions on Neural Networks, Vol. 5, No. 1 (1994) 96-101. 45. Lienig, J. and Thulasiraman, K.: A new genetic algorithm for the channel routing problem. In VLSI Design Conference (1994) 133-136. 46. Drechsler, R., Becker, B. and Gockel, N.: A Genetic Algorithm for the Construction of Small and Highly Testable OKFDDs Circuits. In Genetic Programming Conference (1996) 473-478. 47. Falcón-Urquiaga, W., Altuna, J., Flores, J. L. and Vento, J. R., Using Genetic Algorithms for Delay Minimization in the FPGAs Routing. The First International ICSC Congress on NeuroFuzzy NF´2002 (2002).