Descarga la aplicación para disfrutar aún más
Vista previa del material en texto
ESCUELA SUPERIOR DEINGENIEROS DEPARTAMENTO DE INGENIERÍA ELECTRÓNICA UNIVERSIDAD DE SEVILLA Investigación sobre herramientas de Codiseño Hardware-Software Proyecto Fin de Carrera Hipólito Guzmán Miranda Ingeniero de Telecomunicación Tutor: Jon Tombs Sevilla, Mayo 2006 A mis padres Índice general 1. Introducción 6 1.1. Motivación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 1.2. Objetivo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 1.3. Alcance . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 2. Flujo de diseño en codiseño 8 2.1. Generalidades . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 2.2. Tipos de problemas de codiseño . . . . . . . . . . . . . . . . . . 8 2.2.1. System on Board . . . . . . . . . . . . . . . . . . . . . . 8 2.2.2. System on Chip . . . . . . . . . . . . . . . . . . . . . . . 9 2.2.3. Codiseño con Softcore . . . . . . . . . . . . . . . . . . . 9 2.3. Flujo de diseño tradicional . . . . . . . . . . . . . . . . . . . . . 9 2.4. Flujo de diseño con herramientas de codiseño . . . . . . . . . . . 11 2.4.1. Especificación del Sistema . . . . . . . . . . . . . . . . . 12 2.4.2. Simulación Funcional . . . . . . . . . . . . . . . . . . . 13 2.4.3. Exploración del Espacio de Diseño . . . . . . . . . . . . 13 2.4.4. Co-Simulación TLM . . . . . . . . . . . . . . . . . . . . 13 2.4.5. Co-Verificación HW/SW . . . . . . . . . . . . . . . . . . 13 2.4.6. Co-Simulación RTL . . . . . . . . . . . . . . . . . . . . 14 2.4.7. Prototipado . . . . . . . . . . . . . . . . . . . . . . . . . 14 2.4.8. Síntesis del Sistema . . . . . . . . . . . . . . . . . . . . 15 3. Trabajo sobre Unshades-2 16 3.1. Descripción de la plataforma Unshades-2 . . . . . . . . . . . . . 16 3.2. Herramientas Evaluadas . . . . . . . . . . . . . . . . . . . . . . 19 3.3. Problemas Encontrados . . . . . . . . . . . . . . . . . . . . . . . 21 3.4. Conclusiones . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 3.4.1. Cambio de plataforma . . . . . . . . . . . . . . . . . . . 23 3.4.2. Línea de trabajo sobre Unshades-2 . . . . . . . . . . . . . 24 3.4.3. Consideraciones para una posible Unshades-2.1 . . . . . . 24 3 4. Solución propuesta 26 4.1. Descripción de la solución propuesta . . . . . . . . . . . . . . . . 26 5. Procesador Leon 2 29 5.1. Descripción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 5.1.1. Diagrama de bloques . . . . . . . . . . . . . . . . . . . . 30 5.1.2. Bus Amba . . . . . . . . . . . . . . . . . . . . . . . . . 31 5.2. Alternativas al procesador Leon 2 . . . . . . . . . . . . . . . . . 32 5.3. Configuración del modelo . . . . . . . . . . . . . . . . . . . . . . 35 5.4. Añadiendo la parte HW de tu diseño a Leon 2 . . . . . . . . . . . 37 6. Placa de desarrollo XSV-800 39 6.1. Descripción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39 6.2. Configuración . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 6.2.1. Configuración de jumpers . . . . . . . . . . . . . . . . . 41 6.2.2. Frecuencia de reloj . . . . . . . . . . . . . . . . . . . . . 41 6.2.3. Reprogramación de la CPLD . . . . . . . . . . . . . . . . 41 6.3. Xstools . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42 7. Snapgear Linux 44 7.1. Necesidad de un sistema operativo . . . . . . . . . . . . . . . . . 44 7.2. Descripción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44 7.2.1. Kernels para sistemas con y sin MMU . . . . . . . . . . . 45 7.3. Configuración . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46 7.4. Añadiendo la parte SW de tu diseño a snapgear . . . . . . . . . . 47 8. Entorno de codiseño PeaCE 52 8.1. Descripción y características . . . . . . . . . . . . . . . . . . . . 52 8.2. Ventajas con respecto a otras soluciones . . . . . . . . . . . . . . 54 8.3. Flujo de diseño en PeaCE . . . . . . . . . . . . . . . . . . . . . . 55 9. Aplicación de demostración 59 9.1. Visión general . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59 9.2. Parte hardware . . . . . . . . . . . . . . . . . . . . . . . . . . . 60 9.3. Parte software . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65 10. Conclusiones 69 10.1. Futuras líneas de trabajo . . . . . . . . . . . . . . . . . . . . . . 70 10.1.1. Adaptación de PeaCE a una plataforma propia . . . . . . 71 10.1.2. Desarrollo de una plataforma HW opensource . . . . . . . 71 Bibliografía 73 4 Índice de figuras 2.1. Flujo de diseño tradicional . . . . . . . . . . . . . . . . . . . . . 10 2.2. Flujo de diseño utilizando herramientas de codiseño . . . . . . . . 12 3.1. Unshades 2. Fotografía . . . . . . . . . . . . . . . . . . . . . . . 17 3.2. Diagrama de bloques del sistema Unshades-2 . . . . . . . . . . . 18 4.1. Diagrama de bloques de la solución propuesta . . . . . . . . . . . 28 5.1. Diagrama de bloques del procesador Leon 2 . . . . . . . . . . . . 30 5.2. Mapa de memoria AHB del procesador Leon 2 . . . . . . . . . . 31 5.3. Herramienta de configuración del procesador Leon 2 . . . . . . . 36 5.4. Esquema del cable serie en Y . . . . . . . . . . . . . . . . . . . . 37 6.1. Xess XSV-800. Fotografía . . . . . . . . . . . . . . . . . . . . . 40 6.2. Configuración de jumpers empleada . . . . . . . . . . . . . . . . 41 6.3. Diagrama de bloques de la plataforma Xess XSV-800 . . . . . . . 42 7.1. Herramienta de configuración de Snapgear . . . . . . . . . . . . . 48 7.2. Captura de pantalla del programa minicom . . . . . . . . . . . . . 49 7.3. Herramienta de configuración de Snapgear, modificada . . . . . . 51 8.1. Especificación del sistema en PeaCE . . . . . . . . . . . . . . . . 55 8.2. Especificación de algoritmos en PeaCE . . . . . . . . . . . . . . 56 8.3. Especificación de arquitectura en PeaCE . . . . . . . . . . . . . . 57 9.1. Esquema de entradas y salidas del módulo HW . . . . . . . . . . 60 9.2. Carga de Snapgear en la RAM de la XSV-800 utilizando grmon . 67 9.3. Aplicación de demostración en funcionamiento . . . . . . . . . . 67 9.4. Prototipo en funcionamiento. Fotografía . . . . . . . . . . . . . . 68 5 Capítulo 1 Introducción “A good beginning makes a good ending" – English Proverb 1.1. Motivación Desde los principios de la tecnología de semiconductores, los sistemas elec- trónicos han venido experimentando un constante crecimiento en complejidad, debido a que las prestaciones que tiene que ofrecer una aplicación concreta son cada vez mayores y de naturalezas más diversas. Esto ha dado lugar a que se ten- gan a la vez, para un mismo sistema, restricciones aparentemente incompatibles, como pueden ser de trabajo en tiempo real, de tolerancia a fallos o de procesado de grandes flujos de datos. Este incremento de complejidad y diversidad en las restricciones que ha de cumplir un sistema dado ha motivado la aparición de siste- mas híbridos en los que interactúan elementos hardware y software, ya que dichos elementos pueden complementarse para resolver problemas de distinta naturaleza. Actualmente se está tendiendo, cada vez más, en el diseño de dichos siste- mas electrónicos, a estas soluciones en las que se mezclan elementos hardware y software, debido a las duras restricciones que deben cumplir estos sistemas, como son las condiciones de tiempo real y el procesamiento rápido de grandes flujos de datos. Estos sistemas híbridos se han venido diseñando prácticamente ‘a mano’, en el sentido en que, si bien existen desde hace años herramientas para realizar la compilación del software y la síntesis del hardware, las decisiones más im- portantes que han de tener en cuenta la interacción entre ambas partes (como el particionado HW/SW) se han ido tomando basándose en experiencias previas de diseño, por lo que se tiene una necesidad de poder aplicar una forma más global de ingeniería automatizada al problema del codiseño. Al encarar un problema de codiseño, el diseñador ha de explotar las ventajas 6 Introducción 1.2 Objetivo de la heterogeneidad del sistema objetivo, aprovechando los puntos fuertesdel software (mayor flexibilidad, facilidad para ejecutar órdenes secuencialmente) y del hardware (mayor velocidad, posibilidad de realizar procesamiento concurren- te), pero también debe procurar que los tiempos de desarrollo y depuración no sean excesivamente elevados. Esto crea la necesidad y conveniencia de trabajar en entornos integrados de desarrollo en el que se encare toda la problemática de este tipo de diseños de una forma global, y en el que se puedan automatizar la mayor parte de tareas a realizar durante el flujo de diseño1. 1.2. Objetivo El objetivo de este proyecto es realizar una investigación sobre el estado del arte de las distintas herramientas de codiseño disponibles en el mercado, así como las distintas plataformas y procesadores (tanto ASIC como softcore) sobre los que se puedan implementar soluciones de codiseño, orientando el trabajo a poder realizar codiseño sobre alguna de las plataformas hardware de las que dispone el departamento. Se pretende también conocer y familiarizarse con el flujo de diseño de un sistema híbrido HW/SW, al igual que entender el resto de opciones y compromisos que puedan surgir, de forma que nos introduzcamos poco a poco en la problemática del codiseño. 1.3. Alcance El alcance del proyecto consiste en llegar a poder proponer, como resultado de las investigaciones realizadas, una solución viable para poder realizar codiseño en el departamento. Es requisito que esta solución pueda funcionar en alguna de las plataformas hardware de las que dispone el departamento. Como culminación del proyecto sería deseable llegar a realizar una aplicación sencilla que demuestre la viabilidad de dicha solución y del flujo de diseño propuesto. Esto puede acarrear ciertos problemas ya que las aplicaciones y plataformas que se suelen utilizar para resolver problemas de codiseño disponen normalmente de dispositivos muy potentes y cantidades más que suficientes de recursos como memoria RAM o espacio disponible en FPGA, y en este proyecto se ha trabajado con un hardware muy limitado. 1Por ejemplo, sería deseable poder realizar la partición HW/SW de forma automatizada y transparente al programador, dada una descripción a alto nivel del sistema. 7 Capítulo 2 Flujo de diseño en codiseño “Creativity is inventing, experimenting, growing, taking risks, breaking rules, making mistakes, and having fun" – Mary Lou Cook 2.1. Generalidades Aunque el utilizar soluciones de codiseño para resolver un problema concreto reduce la complejidad individual (y por ello, el coste) de los elementos del siste- ma1, como contrapartida, el proceso de diseño puede complicarse enormemente. El flujo de diseño de un sistema híbrido debe contemplar el desarrollo de for- ma conjunta de hardware y software e incluye, entre sus pasos, descripción a nivel de sistema, simulación funcional, particionado hardware-software, generación de interfaces, estimación de costes (de área y retrasos para el hardware y de tamaño de código y tiempo de ejecución para el software), co-simulación, síntesis e im- plementación de HW, SW e interfaces. Esta actividad interdisciplinar es lo que se conoce como codiseño. 2.2. Tipos de problemas de codiseño 2.2.1. System on Board Si los elementos hardware y software se encuentran en distintos chips den- tro de una misma placa, la interfaz que transmitirá información entre las partes hardware y software tendrá ciertas limitaciones, puesto que dicha interfaz ha de 1Ya que en estos casos no es necesario que toda la funcionalidad se concentre en un único módulo hardware o software. 8 Flujo de diseño en codiseño 2.3 Flujo de diseño tradicional implementarse necesariamente a través de líneas de conexionado sobre la men- cionada placa: tenemos lo que se conoce como un “System on Board”. Como veremos en el próximo capítulo, este es el caso del sistema UNSHADES-2. 2.2.2. System on Chip Cuando los elementos hardware y software forman parte del mismo circuito integrado, la interfaz que los separa puede tener una capacidad mucho mayor para transferir información, dado que esta interfaz está dentro de un circuito integrado: estaríamos, en este caso, ante un “System on Chip”. Ejemplos de estos sistemas son el A7S de Triscend, Excalibur de Altera, Virtex II Pro y Virtex 4 de Xilinx y FIPSOC [FAM+97]. 2.2.3. Codiseño con Softcore La última opción para atacar la problemática del codiseño es utilizar un único circuito programable sobre el que se programarán tanto el procesador que ejecuta- rá la parte software como el circuito que implementará la parte hardware. Nótese que, ya que tanto la parte software como la parte hardware del diseño estarán im- plementadas en un circuito programable, estamos nuevamente ante un System on Chip. Pero existen grandes diferencias: por ejemplo en este caso, la interfaz no está limitada a priori: podemos conectar los módulos del procesador al hardware como queramos. Incluso podemos implementar más de un procesador en la misma FPGA. También podemos añadir o eliminar funcionalidades del microprocesador en función de las necesidades de nuestra aplicación. La única limitación la esta- blece la capacidad del circuito programable que utilicemos. Un par de ejemplos de softcores son MicroBlaze de Xilinx y Nios II de Altera. 2.3. Flujo de diseño tradicional En los sistemas híbridos de los que hablamos en la introducción, el diseño se ha venido haciendo prácticamente ‘a mano’ en el sentido en que, si bien exis- ten desde hace años herramientas para realizar la compilación del software y la síntesis del hardware, las decisiones más importantes que han de tener en cuen- ta la interacción entre ambas partes (como el particionado HW/SW) se han ido tomando basándose en experiencias previas de diseño. En general, el flujo de diseño que se puede realizar sin ayuda de ninguna he- rramienta de automatización es el que aparece en la figura 2.1, en la página 10. 9 Flujo de diseño en codiseño 2.3 Flujo de diseño tradicional Figura 2.1: Flujo de diseño tradicional Posiblemente el subproblema más significativo de todo el problema del codi- seño sea la partición hardware-software (reparto de las tareas que debe realizar el sistema entre los módulos hardware y software). Esta partición puede realizar- se atendiendo a distintos factores, como pueden ser el tamaño (de área y código fuente), la velocidad de proceso o el consumo de potencia. En la práctica es de- seable establecer un equilibrio entre todos los factores, aunque se otorguen pesos 10 Flujo de diseño en codiseño 2.4 Flujo de diseño con herramientas de codiseño relativos a cada uno de ellos. El particionado suele hacerse manualmente, pro- bando distintas posibilidades y considerando que a priori hay ciertas tareas que deben implementarse en un dispositivo concreto. Para automatizar este paso, se han propuesto varios algoritmos [BGJ+02, NB01, KHM04]. 2.4. Flujo de diseño con herramientas de codiseño Debido a que se han realizado múltiples investigaciones respecto al tema del codiseño Hardware/Software, existen hoy día múltiples entornos de desarrollo que atacan directamente a la mayor parte de los problemas asociados a la temática del codiseño. Existen tanto proyectos de investigación como POLIS [BGJ+97], orien- tado al diseño de sistemas híbridos para control, y COOL [Nie], orientado a siste- mas que procesan flujos de datos, como soluciones comerciales, como pueden ser CoWare Codeveloper, Celoxica DK Codesign Suite, Xilinx Embedded Develop- ment Kit o Altera Nios II Integrated Development Environment. Estas soluciones comerciales han ido reemplazando a los esfuerzos investigadores anteriormente mencionados, cada uno en su nicho de aplicación (por ejemplo, dispositivos de fabricantes concretos). De una forma general, utilizando herramientas software específicas para rea- lizar codiseño HW/SW, podemos esperar un diagrama de flujo de diseño como el de la figura 2.2 (página 12). Normalmente cada uno de los pasos se realiza con una herramienta diferente, por lo que la integración de las distintasherramientas en un único flujo de diseño no es una tarea trivial. 11 Flujo de diseño en codiseño 2.4 Flujo de diseño con herramientas de codiseño Figura 2.2: Flujo de diseño utilizando herramientas de codiseño 2.4.1. Especificación del Sistema El primer paso para atacar la problemática de diseñar un sistema híbrido Hard- ware/Software es el realizar una descripción del sistema que se pretende imple- mentar en un lenguage de abstracción que esté por encima de los lenguages con- cretos en los que se describirán el software (por ejemplo, C) o el hardware (por ejemplo VHDL o Verilog). Esto es importante de cara a poder estudiar indivi- dualmente los bloques funcionales que compongan el diseño y su interacción abs- trayéndose de si la implementación de estos bloques se hará en hardware o en software. En definitiva, si el diseñador no es capaz de realizar esta descripción a alto nivel, es porque está dando por supuesto que ciertos bloques funcionales de la aplicación se implementarán de cierta forma concreta. Algunos lenguajes que nos permiten realizar esta descripción a alto nivel del sistema son Matlab, Simulink, SystemC y los grafos de flujos de datos [SOIH97] de PeaCE. Es deseable que, en la medida de lo posible, estas descripciones de alto nivel sean directamente traducibles a descripciones software o hardware, de forma que, una vez decidido el particionado HW/SW, la síntesis de cada una de las partes sea automática. 12 Flujo de diseño en codiseño 2.4 Flujo de diseño con herramientas de codiseño 2.4.2. Simulación Funcional El siguiente paso consiste en realizar una simulación funcional del sistema descrito, para comprobar si realmente la aplicación descrita coincide con las es- pecificaciones deseadas. Los lenguajes con los que se suelen realizar las descrip- ciones a alto nivel del sistema se distribuyen normalmente con simuladores que permiten realizar simulaciones funcionales de los sistemas descritos, por lo que la disponibilidad de un simulador raramente es un problema. Sólo cuando nuestra descripción a alto nivel es completamente funcional tiene sentido seguir adelante con el flujo de diseño para buscar una arquitectura óptima. 2.4.3. Exploración del Espacio de Diseño La exploración del espacio de diseño, se hace manualmente utilizando una herramienta de simulación TLM. El objetivo es evaluar las distintas alternativas de particionado y catalogarlas según rendimiento, para tomar una decisión respecto al particionado HW/SW que cumpla con los requerimientos del sistema. 2.4.4. Co-Simulación TLM Se trata de una simulación a nivel transaccional2. En un modelo transaccional, los detalles de la comunicación entre bloques computacionales están separados de las descripciones de dichos bloques. Los bloques computacionales y de comu- nicación se conectan a través de tipos abstractos de datos. La comunicación se modela a través de canales, de forma que las peticiones de transacción se realizan a través de funciones de interfaz correspondientes a los modelos de los canales de comunicación. Detalles innecesarios de la comunicación y la computación se ocultan en TLM pero pueden ser añadidos más adelante. TLM acelera la simu- lación y permite explorar y validar diferentes alternativas de diseño en un nivel superior de abstracción [CG03]. Algunas herramientas de simulación TLM disponibles en el mercado son Sy- nopsys CoCentric Studio, CoWare ConvergenSC y Axys MaxSim (para ARM). 2.4.5. Co-Verificación HW/SW El objetivo de este paso es comprobar que, tras el particionado, nuestro sis- tema tiene las mismas funcionalidades que en la descripción funcional y cumple con los requisitos adicionales que le hayamos impuesto3. Esta co-verificación es 2TLM son las siglas de Transactional Level Modelling 3Por ejemplo, ciertos requisitos de timing. 13 Flujo de diseño en codiseño 2.4 Flujo de diseño con herramientas de codiseño importante ya que si bien la simulación TLM realizada anteriormente es muy efi- ciente en tiempo, existen aspectos prácticos de los bloques computacionales del diseño que no se han considerado aún. 2.4.6. Co-Simulación RTL La coverificación HW/SW se hace normalmente a través de una cosimulación a nivel RTL4. Esto es un problema complejo en sí mismo ya que para realizar esta cosimulación se necesita: Un programa que simule adecuadamente y de forma precisa el HW, por ejemplo un simulador de VHDL o Verilog. Un programa que simule adecuadamente y de forma precisa el comporta- miento del SW, es decir, un ISS5 del procesador utilizado. Integración fluida entre ambos programas. Esto se puede conseguir de dis- tintas maneras, por ejemplo modificando los simuladores para añadirles in- terfaces a medida6, consiguiendo una sincronización en tiempo de los si- muladores, o aprovechando la capacidad que tienen algunos simuladores de generar ficheros de traza con los accesos a memoria para utilizar una técnica de sincronización virtual basada en la traza de memoria [KYH05], técnica que ofrece un mejor rendimiento en la simulación. La herramienta comercial más popular en la actualidad para realizar coverifi- cación HW/SW es Mentor Seamless CVE, pero existen alternativas como Aldec HES (Hardware Embedded Simulation)7. 2.4.7. Prototipado Una vez que se tienen las descripciones de las partes hardware, software, e in- terfaces, se pueden utilizar herramientas que existen desde hace años para realizar la síntesis del hardware (herramientas de síntesis, y ‘placement and routing’ si el hardware se va a sintetizar sobre un circuito programable, como es nuestro caso) y del código objeto para el microprocesador (compiladores). En este momento 4Register Transfer Level. 5Instruction Set Simulator. 6Lo cual no es posible normalmente, ya que difícilmente se tiene acceso al código fuente de los simuladores. 7Pero a la hora de escoger las herramientas a utilizar, el aspecto más importante que hay que evaluar es si el procesador que se va a utilizar está soportado. Como se verá en el siguiente capítulo, en la plataforma inicialmente escogida para este proyecto se utiliza un procesador de señal (DSP) de Texas Instruments que carece totalmente de soporte en las herramientas comerciales 14 Flujo de diseño en codiseño 2.4 Flujo de diseño con herramientas de codiseño es cuando se fabrica un prototipo, sobre el que se demostrará de forma práctica el sistema híbrido funcionando. De esta experiencia se extraen conclusiones muy útiles de cara a la síntesis del sistema final. 2.4.8. Síntesis del Sistema Tras comprobar que el prototipo funciona correctamente y es apropiado para la aplicación que se quiere resolver, se procede a realizar la síntesis del sistema final. 15 Capítulo 3 Trabajo sobre Unshades-2 “We used to dream about this stuff. Now, we get to build it. It’s pretty neat" – Steve Jobs 3.1. Descripción de la plataforma Unshades-2 Unshades-2 es una plataforma híbrida FPGA-DSP para codiseño y co- depura- ción diseñada en el Departamento de Ingeniería Electrónica de la Universidad de Sevilla [ATBT03]. Unshades-2 es la segunda plataforma de la familia Unshades1, una familia de tarjetas de desarrollo, basadas en FPGAs de Xilinx, especialmente diseñadas para realizar depuración hardware en tiempo de ejecución de diseños reales. El propósito de la plataforma Unshades-2 es, por un lado, proporcionar in- formación comprensible sobre el estado interno de sus elementos, tanto software como hardware, mientras están funcionando (es decir, el sistema está diseñado para ser observable) y, por el otro, permitir al diseñador realizar cambios sobre dichos estados (es decir, el sistema es controlable). Esta observación y control se realizan a través de unos puertos de entrada/salida que se conectan a un PC, que debe disponer de las herramientas adecuadas para realizar la comunicación con la placa, y presentar la información al usuario de forma comprensible (véase la figura 3.1, en la página 17). De esta forma, el sistema se puede utilizar para depurar los módulos HW y SW de un sistema híbrido.Otro aspecto atractivo de Unshades-2 es que, al facilitarnos tanta información para la depuración, es conce- bible un sistema de desarrollo en el que más que realizar simulaciones de distintas soluciones de particionado y síntesis, podríamos probarlas directamente sobre la placa y medir sus rendimientos (tiempos de procesado, consumo de potencia). 1UNiversity of Seville HArdware DEbugging System. 16 Trabajo sobre Unshades-2 3.1 Descripción de la plataforma Unshades-2 Figura 3.1: Unshades 2. Fotografía Unshades-2, al ser un sistema diseñado para la depuración simultánea de ele- mentos hardware y software, se planteó en un principio como una plataforma interesante sobre la que investigar distintas soluciones a este problema, por la fa- cilidad para extraer información útil que brinda. El trabajar sobre esta plataforma tiene en principio un cierto valor añadido, ya que aporta algo más que los elemen- tos hardware y software: gracias a la controlabilidad y observabilidad que presen- ta al diseñador, es especialmente útil para proyectos de investigación y desarrollo, puesto que podemos comprobar fácilmente si las decisiones que se van toman- do afectan positivamente o no al rendimiento de los módulos sintetizados. En la figura 3.2, en la página 18, podemos ver una fotografía del sistema de desarrollo. La plataforma Unshades-2 está construida alrededor de cuatro dispositivos: S-FPGA2 FPGA Virtex 100E / 1000E, de Xilinx [Xil02], compatible con el encapsulado PQ240, con 32400 y 331776 puertas lógicas equivalentes respectivamente. 2System FPGA, es la FPGA en la que se programan los diseños hardware. 17 Trabajo sobre Unshades-2 3.1 Descripción de la plataforma Unshades-2 Figura 3.2: Diagrama de bloques del sistema Unshades-2 18 Trabajo sobre Unshades-2 3.2 Herramientas Evaluadas C-FPGA3 de la familia Spartan II, compatible con el encapsulado QFP 144. DSP TMS320VC33, de Texas Instruments, de 16 bits y coma flotante. Este procesador pertenece a la familia C3x [Tex04] y el encapsulado con el que aparece en Unshades-2 es el PGE150. Memoria flash de 256 kwords (512 kbytes), modelo Am29LV400B B-70R de AMD. La conexión entre estos elementos se puede apreciar en la figura 3.2. Además, Unshades-2 dispone de otros elementos, como los puertos de expansión, entra- da/salida y enlace con PC. 3.2. Herramientas Evaluadas Durante el tiempo que se estuvo trabajando con Unshades-2, se estuvieron evaluando distintas herramientas de codiseño HW/SW. Desafortunadamente, las herramientas comerciales soportan sólo un pequeño subconjunto de los micropro- cesadores disponibles en el mercado, por lo que el primer escollo con el que nos encontramos al realizar el presente proyecto fue la falta de soporte para los proce- sadores de la familia C3x. Esto significa que, si queremos hacer codiseño con un procesador de esta familia, necesitaremos añadir nosotros mismos el soporte para este tipo de procesador, lo que nos hace descartar inmediatamente los programas que sean de código cerrado. Pero la mayoría de proyectos de codiseño que son de código abierto son proyectos de investigación que dejaron de actualizarse hace años4. Entre los entornos de codiseño y herramientas que se evaluaron se encuentran: POLIS. Este trabajo académico ha sido realmente importante, y ha dado co- mo fruto muchas publicaciones que han servido de punto de partida para el presente proyecto [BGJ+97]. Incluso se planteó en principio como opción para el presente proyecto el realizar una adaptación de POLIS para añadirle la capacidad de realizar cosíntesis para la plataforma Unshades-2. El pro- blema principal que se ha encontrado con POLIS es que como proyecto dejó de ser activo y de tener base de usuarios hace varios años. La última versión 3Control FPGA, es una FPGA dedicada a realizar funciones de control como la programa- ción de la S-FPGA, control de las señales de reloj, control del DSP a través del puerto JTAG y readback/writeback del estado interno de la S-FPGA a través de las líneas Selectmap. 4Por ejemplo, la página web del proyecto Chinook (Department of Computer Science and En- gineering, University of Washington) no ha sido actualizada desde 1999, y COSYMA (COSYnthe- sis for eMbedded Achitectures, de la Technical University of Braunschweig) dejó de desarrollarse alrededor de 1998. 19 Trabajo sobre Unshades-2 3.2 Herramientas Evaluadas de POLIS (0.4), es del año 2000, y los recursos adicionales como la lista de correo para los usuarios5 ya no están disponibles. Celoxica DK Design Suite. Este entorno de desarrollo de Celoxica está orientado a descripciones en alto nivel de sistemas híbridos en lenguajes de descripción no gráficos, como son HandelC y otras extensiones de C y C++. La herramienta da soporte para poder trabajar con los PowerPC 405 que se pueden encontrar en las FPGA Virtex II Pro y con el softcore Microbla- ze de Xilinx. El principal impedimento para poder utilizar esta herramienta comercial es que, como tantas otras, carece de soporte para DSPs de Texas Instruments. Impulse Codeveloper. Impulse CoDeveloper, al igual que Celoxica DK De- sigh Suite, es una herramienta de codiseño hardware/software que permite describir un sistema híbrido utilizando una variante del ANSI C, en este ca- so Impulse C. Impulse C no es, técnicamente hablando, un subconjunto de ANSI C, ya que es posible hacer uso de todas las funcionalidades de C a la hora de programar un test bench o de describir los procesos SW que se ejecutarán en un microprocesador. Sin embargo, para los procesos que se traducirán directamente en diseños hardware, se imponen ciertas restriccio- nes al código Impulse C6. La herramienta soporta únicamente los micropro- cesadores Altera Nios, Xilinx Microblaze y los PowerPC de Xilinx Virtex II Pro. Las herramientas de Xilinx, como Xilinx EDK (Embedded Design Kit), que tuvieron que ser descartadas para el trabajo con Unshades-2 ya que úni- camente soportan los procesadores que utilizan los dispositivos de Xilinx, como Microblaze o PowerPC. Únicamente utilizaremos las herramientas de Xilinx para hacer la síntesis de la parte HW de los diseños, ya que estamos trabajando con FPGAs de este fabricante. PeaCE7 codesign environment. Más adelante, en el capítulo 8, se hará una descripción más detallada, pero por ahora comentaremos que de todas las aplicaciones evaluadas, es la única de la que realizar una adaptación a nues- tra plataforma es factible: es software libre (licencia tipo BSD), por lo que es posible modificarlo para añadir soporte para Unshades-2, es uno de los 5polis-users@ic.eecs.berkeley.edu 6Básicamente: soporte limitado para punteros, carencia de soporte para funciones recursivas, y ciertas restricciones sobre las instrucciones de control de flujo. Esto tiene mucho sentido, ya que si se tradujera directamente un programa C sin restricciones en su código a hardware el resultado distaría mucho de ser eficiente. 7Ptolemy extension as Codesign Environment. 20 Trabajo sobre Unshades-2 3.3 Problemas Encontrados pocos proyectos de investigación sobre codiseño que sigue activo y, co- mo añadido, los desarrolladores del proyecto han demostrado interés en dar soporte a los usuarios del software que deseen utilizarlo con nuevas plata- formas. En PeaCE, tanto los algoritmos como la arquitectura del sistema híbrido se especifican a través de un interfaz gráfico desarrollado en Java. Por todo ello, una vez estudiadas las distintas herramientas de codiseño, se decidió optar en principio por añadir soporte para la plataforma Unshades-2 al entorno de codiseño PeaCE. 3.3. Problemas Encontrados Ya hemos visto en el apartado anterior que los DSP de Texas Instruments, en particular los de la familia C3x, carecen de soporte en las herramientas de codiseño disponibles. La experiencia con Unshades-2 nos ha descubierto ciertas dificultades que la plataforma plantea para su uso como sistema híbrido: Falta de soporte para el procesador C33 por parte de las herramientas de codiseño HW/SW (como se ha visto anteriormente).Falta de toolchain GNU para el procesador. En realidad existe una adap- tación del compilador gcc8 para las familias de DSP C3x y C4x, llamado c4x-gcc, pero se necesita una versión concreta de una biblioteca runtime propietaria de Texas Intruments, de la que no disponíamos, para poderlo compilar. Sin esta biblioteca, el compilador únicamente puede generar fi- cheros objeto (.o), y no ejecutables. Al no poder utilizar el compilador de GNU, la única opción posible era utilizar un compilador propietario de Te- xas Instruments, que originaba otros problemas, entre ellos imposibilidad de utilizar el simulador libre del que disponíamos para el DSP (c4x-gdb9). Carencia de ISS para el procesador. Esto ha sido sorprendente ya que se han evaluado tres simuladores distintos para el C33. La problemática aquí estriba en que para que un simulador del juego de instrucciones de un proce- sador pueda ser utilizado para hacer cosimulación HW/SW, debe de poderse interconectar a un simulador de VHDL o Verilog que simule la parte HW del diseño. Es decir, que para que un ISS pueda ser utilizado debe de tener 8GCC son las siglas de Gnu Compiler Collection. 9Realmente gdb es un depurador (Gnu Debugger), y c4x-gdb está diseñado para ser conectado a placas autónomas basadas en procesadores c3x/c4x a través de conexión por puerto serie o por socket TCP/IP. Pero aparte de esto, c4x-gdb incluye un modo de funcionamiento en el que se conecta a un simulador de estas familias de DSP desarrolado por Herman Ten Brugge. 21 Trabajo sobre Unshades-2 3.3 Problemas Encontrados un modelo de memoria flexible que se pueda adaptar para conectarlo al si- mulador de la parte HW, o bien ser de código abierto para poder realizar las modificaciones necesarias, o en última instancia debe ser capaz de gene- rar un fichero con la información de los accesos a memoria (un fichero de traza). El primer simulador que probamos fue Sim3x, un simulador desarrollado por Texas Instruments para ms-dos (que ejecutamos sin problemas bajo Li- nux utilizando Dosbox10), y descubrimos que no se puede integrar con nin- guna otra herramienta ya que el programa no está preparado para interactuar con otros programas, ni permite generar ficheros de traza. Por supuesto, la modificación del programa para añadirle esa funcionalidad era imposible ya que no disponíamos de su código fuente. La segunda alternativa estudiada fue la posibilidad de generar la informa- ción de traza con los accesos a memoria utilizando Code Composer (un programa para Windows que se ejecutaría en Linux a través de Wine), em- pleando un lenguage de scripting de Code Composer llamado GEL11. Esta alternativa era de una complejidad considerable, ya que habría que escribir un programa que, tras la compilación del software, analizara el código ob- jeto presente en el fichero .out, localizara en él los accesos a memoria, y posteriormente generara un script GEL que colocara breakpoints (puntos de ruptura) en cada uno de dichos accesos. Además, habría que definir funcio- nes específicas en GEL para intentar recoger la información de los tiempos y ciclos de acceso. Aunque teóricamente este enfoque podría funcionar, la viabilidad práctica de esta solución depende de las capacidades reales del lenguaje GEL y aún no ha sido demostrada. Por otro lado, el trabajo ne- cesario para implementar esta solución escapa al alcance de este proyecto, por lo que en su momento se prefirió centrar los esfuerzos en resolver los problemas que planteaba el simulador c4x-gdb. El último simulador que fue evaluado fue c4x-gdb, la única de las tres al- ternativas que es de código abierto. Ya hemos comentado que, al no poder utilizar el compilador c4x-gcc, por las razones comentadas anteriormente, era imposible utilizar el simulador c4x-gdb. Escasez de memoria RAM. Hemos visto en la sección 3.1 que la platafor- ma no posee ningún dispositivo de RAM on-board. Es posible instanciar pequeñas memorias RAM dentro de la FPGA, de forma para que el DSP pueda tener un mínimo espacio sobre el que trabajar con datos, pero como 10Ya que PeaCE se ejecuta bajo Red Hat Linux 8.0, todo programa que queramos integrar con PeaCE debe funcionar a su vez en Linux, aunque sea tras una capa de emulación. 11General Extension Language. 22 Trabajo sobre Unshades-2 3.4 Conclusiones máximo disponemos de 393,216 bits (48KBytes) de block RAM en la Vir- tex 1000E [Xil02] (en el caso de Virtex 100E son únicamente 10KBytes). Si bien puede ser suficiente memoria para manejar ciertas cantidades de datos, hay que tener en cuenta que en un sistema híbrido HW/SW las tareas que han sido implementadas en software han de compartir el microprocesador, lo que significa que necesitamos memoria para guardar la información del contexto de los procesos y de la pila. Además, no podríamos tener un siste- ma operativo como Linux ejecutándose en la placa (ya que un sistema Linux necesita un mínimo de 1MB de RAM para ejecutarse, más RAM adicional para las aplicaciones), y es muy posible que eCos12, si bien es un sistema operativo altamente configurable, tenga una huella mínima de uso de RAM superior a los 48KB. Recordemos que estos 48KB han de compartirse con los requerimientos de memoria de la parte SW del diseño. Interfaz FPGA-DSP fija, ya que son pistas en el PCB: es posible que la S-FPGA tenga que enviar ciertas señales al DSP y no pueda hacerlo por- que esas pistas no estén conectadas a ella. Si bien este problema no ha sido estudiado a fondo, si llegara a ocurrir podría eliminar por completo la posi- bilidad de hacer codiseño con Unshades-2. Falta de sistemas operativos de tiempo real para el procesador. Actualmente no existen versiones de Linux o eCos para el procesador C33. Si bien es teóricamente posible realizar un portado de estos sistemas a nuestro DSP, ello escapa al alcance del presente proyecto. La única alternativa para poder conmutar entre las tareas en software es programar un mínimo planificador de tareas. Es por todas estas razones por lo que se decide abandonar el desarrollo sobre Unshades-2. En el siguiente apartado se exponen las conclusiones de la investiga- ción sobre Unshades-2 y en el capítulo 4 se propone una solución alternativa para poder realizar codiseño, con otra plataforma hardware. 3.4. Conclusiones 3.4.1. Cambio de plataforma Teniendo en cuenta los resultados expuestos en los apartados anteriores, rea- lizar codiseño con Unshades-2 sin modificar la plataforma hardware es una tarea que roza lo imposible. Además, los esfuerzos necesarios para hacer codiseño en 12embedded Configurable operating system. 23 Trabajo sobre Unshades-2 3.4 Conclusiones dicha plataforma sobrepasan con creces el alcance de un proyecto de fin de carre- ra. Es por esto por lo que se propone un cambio de plataforma hardware: sabiendo tras la evaluación de las herramientas software (sección 3.2) que el soporte pa- ra ciertos softcores está sobradamente extendido, se plantea el realizar codiseño sobre una plataforma que únicamente disponga de una FPGA de gran capacidad. De esta forma se instanciarán un microprocesador y la parte HW del diseño en el mismo dispositivo. La plataforma propuesta es la placa de desarrollo XSV-800 de Xess. En el capítulo 6 se hará una descripción más detallada de dicha plataforma. 3.4.2. Línea de trabajo sobre Unshades-2 Otra conclusión del trabajo realizado, además del mencionado cambio de pla- taforma, es el trabajo concreto que habría que hacer para conseguir hacer codiseño con Unshades-2 utilizando herramientas de codiseño. Si se quisiera realizar el esfuerzo, habría que: Programar un simulador del procesador C33 o adaptar las c4x GNU tools para que funcionen utilizando Newlib (para esto necesitaríamos primero realizar el portado de Newlib al C33). Portar eCos (ya que no podemos utilizar Linux por falta de RAM) al C33. Nótese que para portar eCos también necesitamos haber portado primero Newlib. Si no queremos portar eCos, es necesario programar un planifica- dor de tareas que se encargue de guardar los contextosde las tareas software y manejar la pila. De todas formas, es poco probable que toda esta funcio- nalidad se pueda conseguir con tan sólo 48KB de RAM. Con esto tendríamos las mínimas herramientas que hacen falta para poder em- pezar a integrar el soporte para Unshades-2 en PeaCE. Aún quedaría por realizar todo el trabajo de integración con el framework de codiseño. 3.4.3. Consideraciones para una posible Unshades-2.1 En mi opinión el trabajo mencionado en el apartado anterior no compensa el esfuerzo que es necesario realizar: sería más sencillo modificar Unshades-2 para permitir una adaptación más sencilla y realizable. Por ello se proponen las siguientes sugerencias y modificaciones, para que sean consideradas para una po- sible versión 2.1 de Unshades: Procesador: el primer cambio que se propone consiste en cambiar el DSP de Texas Instruments por un procesador ampliamente soportado, para el que 24 Trabajo sobre Unshades-2 3.4 Conclusiones estén disponibles las herramientas anteriormente mencionadas, como podría ser un ARM13 o un ASIC Leon. Interfaces FPGA-�P : para evitar que el interfaz fijo FPGA-�P sea una fuen- te de problemas, tenemos dos opciones: la primera es estudiar cuidadosa- mente alguna placa ya existente para codiseño HW/SW que utilice el proce- sador escogido, para que quede perfectamente claro qué pines del�P deben conectarse a la FPGA. La segunda es que todos los pines del procesador pasen por la FPGA antes de llegar a los dispositivos de la placa, opción que añade muchísima flexibilidad a la plataforma y que curiosamente es es lo que ocurre cuando se utiliza un softcore. RAM: Es necesario añadir una cantidad suficiente de RAM on-board pa- ra poder tener un sistema operativo y trabajar de forma cómoda. Con un mínimo de 4 megas ya podemos tener sistemas Linux con aplicaciones es- pecíficas (sin soporte para TCP/IP14) sin que la memoria sea una restricción preocupante. Lo ideal, para aprovechar toda la potencia que ofrece Linux, es utilizar módulos DIMM, que se pueden encontrar en cualquier tienda de in- formática y nos permiten tener una capacidad de RAM del orden de cientos de megabytes. 13Si bien la mayoría de modelos de ARM goza de un buen soporte por parte de las herramientas de software libre típicas (gcc, eCos, newlib), recomendamos con más énfasis aquellos dos modelos de ARM que ya disponen de soporte completo en PeaCE: ARM 926EJS y ARM 720T. 14El soporte para TCP/IP y las aplicaciones que lo utilizan consumen una gran cantidad de memoria. 25 Capítulo 4 Solución propuesta “A real decision is measured by the fact that you’ve taken a new action. If there’s no action, you haven’t truly decided." – Anthony Robbins Tras encarar los problemas encontrados en Unshades-2, se propuso una solu- ción para hacer codiseño utilizando una plataforma hardware distinta, basada en una FPGA suficientemente potente como para albergar el softcore y la parte HW de un diseño híbrido. En principio teníamos dos placas disponibles, FT-Unshades1 y Xess XSV-800. Escogimos la segunda por varias razones: por tener ésta una disponibilidad mayor (ya que las placas FT-Unshades de las que dispone el de- partamento están normalmente ocupadas en proyectos de investigación), porque las herramientas para programar los dispositivos on-board están disponibles pa- ra Linux2, y porque la distribución del softcore Leon 2 soporta oficialmente la placa XSV-800, lo que en principio facilita una de las tareas a realizar, que es la implementación correcta del softcore en la placa de desarrollo. 4.1. Descripción de la solución propuesta La solución que aquí se propone consiste básicamente en una solución soft- core en la que todos los elementos del sistema híbrido están implementados en la FPGA. Esto permite extender el trabajo realizado a otras placas con un poco de esfuerzo adicional. 1Fault-Tolerant Unshades, la plataforma más moderna (a fecha de 2006) de la familia Unsha- des, desarrollada por el Área de Ingeniería Electrónica en un proyecto para la Agencia Espacial Europea, y especialmente preparada para realizar pruebas de tolerancia a fallos sobre circuitos para aplicaciones espaciales. 2Cuando se comenzó el presente proyecto, las herramientas de FT-Unshades únicamente esta- ban disponibles para Windows. Actualmente las herramientas de FT-Unshades funcionan perfec- tamente bajo Linux, ya que fueron portadas en Marzo de 2006. 26 Solución propuesta 4.1 Descripción de la solución propuesta La plataforma sobre la que implementaremos el sistema es la placa de desa- rrollo XSV-800, de la X Engineering Software Systems Corporation (Xess). Esta placa posee suficiente RAM (2MBytes) y demás recursos on board y será descrita en más profundidad en el capítulo 6. De dicha placa bastará comentar por aho- ra que dispone de una FPGA Virtex XCV-800 [X E01b, Xil00], que dispone de aproximadamente 800000 puertas equivalentes (contando RAMs internas), lo cual es suficiente para implementar un softcore con varios periféricos y algún módulo hardware específico. En la FPGA Virtex XCV-800 implementaremos un procesador Leon 2, un modelo VHDL sintetizable de un procesador de 32 bits que cumple con el estándar Sparc V8. Las fuentes de este softcore están disponibles libremente bajo licencia GNU LGPL. Este procesador, junto con las razones por las que se ha escogido en lugar de alternativas como Microblaze, serán descrito en el capítulo 5 y, entre sus características, podemos destacar el hecho de que incluye una implementación del bus AMBA (versión 2.0), lo que permite añadir periféricos y otros módulos hardware de manera sencilla. Dado que necesitamos un sistema operativo sobre el que se ejecuten las tareas software, la parte SW del diseño correrá sobre Snapgear Linux, una distribución de Linux para sistemas integrados con soporte para el procesador Leon. Snapgear Linux es una variante de�Clinux y en el capítulo 7 la describiremos y comenta- remos las ventajas que nos ofrece. El entorno de codiseño propuesto para realizar codiseño es PeaCE, debido a las ventajas que ofrece, que se han comentado en el capítulo anterior y se verán en más profundidad en el capítulo 8. Además, otra razón para utilizar este entorno es que al no existir herramientas comerciales de codiseño HW/SW que tengan soporte para la familia de procesadores Leon, hemos de escoger una herramienta de código abierto a la que se pueda añadir soporte para estos procesadores. 27 Solución propuesta 4.1 Descripción de la solución propuesta Figura 4.1: Diagrama de bloques de la solución propuesta 28 Capítulo 5 Procesador Leon 2 “You should probably read the manual" – Jiri Gaisler, almost daily, on the leon-sparc mailing list Tras considerar las alternativas como Microblaze o softcores basados en ARM, se llegó a la conclusión de que el softcore más apropiado para ser utilizado en un proyecto basado en Linux es el procesador Leon 2, ya que es de código abierto y viene acompañado de las herramientas necesarias, que también son de código abierto: compiladores C, versión de Newlib, y versiones de eCos y Linux. En la sección 5.2 justificaremos en profundidad esta decisión. 5.1. Descripción El procesador Leon [Gai05] es una implementación en VHDL de un proce- sador de 32 bits compatible con el juego de instrucciones Sparc V8 [SPA92], desarrollado para la Agencia Espacial Europea y mantenido en la actualidad por Gaisler Research. Este procesador no sólo es de código abierto, sino que además no está ligado a ninguna tecnología de FPGA concreta, a diferencia de soluciones dependientes de fabricantes como Microblaze de Xilinx o Nios II de Altera. Entre sus características se pueden destacar: Cachés de instrucción y datos independientes Alu para mutiplicación y división hardware Interfaz para unidades de coma flotante y coprocesadores Bus AMBA 2.0 Controlador de interrupciones 29 Procesador Leon 2 5.1 Descripción Controlador de memoria flexible, capaz de trabajar con SDRAM en modo 32 bits y con SRAM y ROM en modos configurables de 8, 16o 32 bits Puerto de entrada y salida de 16 bits Dos UARTs Dos timers de 24 bits Unidad de Soporte de Depuración (DSU) 5.1.1. Diagrama de bloques Figura 5.1: Diagrama de bloques del procesador Leon 2 El elemento central del procesador Leon 2 es su Integer Unit de 5 etapas pi- pelined. Esta Integer Unit está conectada a las cachés de instrucción y datos, y a la MMU1. Ambas cachés son de tamaño configurable y pueden incluso no ser sintetizadas. La MMU también es opcional, y en este proyecto no se ha utilizado. En la figura 5.1 (página 30) se puede observar también la presencia de una unidad de punto flotante (Floating Point Unit o FPU) y de un co-procesador (CP), aunque en realidad el procesador Leon 2 no se distribuye con ninguno de estos elementos, sino que Gaisler Research dispone una unidad de punto flotante que se licencia de forma separada2, y es el usuario el que puede o no implementar su propio co- procesador: el procesador Leon 2 implementa únicamente los interfaces a los que 1Memory Management Unit. 2Se trata de la GRFPU (Gaisler Research Floating Point Unit), aunque existen otras alternati- vas como la Meiko FPU y la LTH FPU. 30 Procesador Leon 2 5.1 Descripción se conectarían el co-procesador y la FPU. No obstante, una síntesis del procesador Leon 2 sin ninguno de estos elementos es perfectamente funcional, aunque tenga menor rendimiento, y es la implementación que se ha realizado en este proyecto. Otro elemento muy interesante de este procesador es la Unidad de Soporte de Depuración (Debug Support Unit o DSU), que permite conectar un PC al proce- sador a través del puerto serie, ethernet o JTAG, para ayudar a la depuración de software, permitiendo la depuración on-line. Gracias a la DSU se pueden cargar programas directamente desde el PC, pausar y resetear el procesador, establecer puntos de ruptura (breakpoints) e incluso realizar ejecución paso a paso. 5.1.2. Bus Amba El procesador Leon implementa dos buses AMBA: AHB y APB. El bus APB3 se utiliza para acceder a los registros on-chip de los periféricos, mientras que el bus AHB4 se utiliza para transferencia de datos a alta velocidad. El bus AMBA hace muy sencillo extender la funcionalidad del procesador añadiendo módulos hardware. Incluso permite reutilización de código hardware, tanto del propio que desarrolle el diseñador como de módulos IP de otros desarrolladores [ARM99]. El mercado de propiedad intelectual pone al alcance de cualquier diseñador una biblioteca enorme de diferentes periféricos y unidades de proceso de datos [Gai04, Ope]. Debido a la gran aceptación que tiene el bus AMBA en la industria, se pueden encontrar fácilmente módulos hardware ya preparados para su conexión a dicho bus. Rango de direcciones Tamaño Registro Módulo 0x00000000 - 0x1FFFFFFF 512 M Prom Controlador 0x20000000 - 0x3FFFFFFF 512 M Memory bus I/O de memoria 0x40000000 - 0x7FFFFFFF 1G SRAM y/o SDRAM 0x90000000 - 0x9FFFFFFF 256 M DSU DSU 0xB0000000 - 0xB001FFFF 128 K Registros Ethernet ethernet MAC Figura 5.2: Mapa de memoria AHB del procesador Leon 2 El mapa de memoria que aparece en la figura 5.2, en la página 31, es el mapa que se encuentra por defecto en la distribución oficial del procesador Leon 2, pero 3Advanced Peripheral Bus. 4AMBA High-performance Bus. 31 Procesador Leon 2 5.2 Alternativas al procesador Leon 2 si fuera necesario podría modificarse. Además, el mapa de memoria del procesa- dor no acaba aquí: los periféricos del procesador están conectados al bus APB, cuyo mapeo en memoria empieza en la dirección 0x80000000 (Memory configu- ration register 1), y la última dirección ocupada es la 0x800000CC (DSU UART scaler register), por lo que a partir de la dirección 0x800000D05 se pueden añadir periféricos ‘custom’ (teniendo en cuenta que a partir de la 0x90000000 vuelven a estar ocupadas, en este caso por la DSU). La tabla con los registros concretos y las direcciones de memoria en las que están situados es demasiado extensa como para colocarla en el presente documento pero puede ser encontrada en el manual del procesador Leon 2 [Gai05]. 5.2. Alternativas al procesador Leon 2 El procesador Leon 2 no es el único softcore que se puede implementar en una FPGA, por lo que en su momento se realizó un estudio de softcores disponibles, para tomar una decisión informada sobre cuál utilizar: 1. Procesadores basados en ARM: la primera alternativa de softcore que se consideró fue una implementación de un procesador ARM que se realizó como proyecto de fin de carrera en el departamento en 2002 [CTAT02]. No se usó porque, si bien las instrucciones del juego ARM fueron probadas una por una con éxito, para garantizar el cumplimiento total de las especificacio- nes ARM de este procesador habría que utilizar vectores de test propietarios que sólo están disponibles para los desarrolladores que tengan licencia de ARM, por lo que se desconoce si este softcore funcionará adecuadamente al ejecutar programas complejos, como los producidos por un compilador C (en contraposición a los generados manualmente en ensamblador). Además, si bien el código VHDL del proyecto tiene una licencia de libre distribución, es posible que la distribución e implementación del core ARM en sí viole ciertas patentes de ARM. Todas estas dificultades, que surgen a causa de la proliferación de estándares cerrados, impiden el uso de este interesante core VHDL para nuevos proyectos. Esta situación es bastante desafortunada, ya que los procesadores ARM disponen de muchísimas herramientas como si- muladores (Armulator), bibliotecas runtime (glibc y Newlib), compiladores e incluso un port de la distribución Debian GNU/Linux6. 5Realmente es a partir de la 800000E0, ya que estudiando detalladamente el código del proce- sador Leon 2 se ha visto que en la dirección 0x800000D0 hay asignado un registro correspondiente al ‘PCI target mapping’. 6Véase http://www.debian.org/ports/ 32 Procesador Leon 2 5.2 Alternativas al procesador Leon 2 Además, como se ha comentado en el capítulo 3, PeaCE ya trabaja con dos modelos de ARM (ARM 926EJS y ARM 720T). Dichos modelos están perfectamente integrados en el entorno, lo que significa que existe mucho trabajo ya realizado que se podría reutilizar. 2. Microblaze: este procesador, en principio, y ya que nosotros trabajamos con FPGAs de Xilinx, es una alternativa igual de válida que el procesador Leon 2. Pero hagamos unas consideraciones adicionales, pensando en la posibili- dad de reutilizar los esfuerzos del presente proyecto en otros proyectos de investigación, sabiendo que muchos de los que se realizan actualmente en el Departamento de Ingeniería Electrónica comprenden la depuración hard- ware y/o la realización de pruebas de tolerancia a fallos: ¿Cómo se hace depuración de HW/SW sobre Microblaze si es cerrado? ¿Dónde introduces un SEU7 para hacer pruebas de tolerancia a fallos? ¿Cómo sabes bien qué estás leyendo o modificando? Será posible hacer ingeniería inversa, pero, ¿merece la pena el esfuerzo? Además, en general para estos softcores de- pendes de las herramientas (compilador, simulador, c runtime library, S.O. en tiempo real) que te proporcione el fabricante8. Por otro lado, la reutiliza- ción de software se complica si se utilizan sistemas operativos propietarios del fabricante (Nucleus o Xilkernel, en el caso de Microblaze), aunque tam- bién existe una versión de�Clinux para Microblaze. 3. Nios II: para este procesador de Altera son válidas las consideraciones rea- lizadas para Microblaze, pero con el agravante adicional de que difícilmente la implementación podrá realizarse y, en caso de que se pueda, no será nada eficiente en una FPGA de Xilinx. 4. Leon 3: este procesador, que es la evolución natural del procesador Leon 2, está escrito en un VHDL más difícil de entender que Leon 2, no posee compatibilidad binaria con éste, está peor documentado (a fecha de Octubre de 2005), y el único simulador disponible para él es el propietario TSIM. No obstante, ofrece mejores prestaciones9 por lo que en el futuro, a medidaque Leon 3 se vaya imponiendo como estándar de facto y Leon 2 vaya dejando de tener soporte, será inevitable considerar Leon 3 para proyectos de investigación y aplicación. 7Single Event Upset. 8Aunque en muchos de los casos, las herramientas de diseño de los fabricantes ejecutan en segundo plano versiones parcheadas de las herramientas GNU, como por ejemplo el mb-gcc, com- pilador de c para microblaze, lo cual da que pensar. 9A costa de una mayor ocupación en área, por lo que para nuestra tarjeta de desarrollo es mejor idea utilizar Leon 2. 33 Procesador Leon 2 5.2 Alternativas al procesador Leon 2 5. Leon 2: Leon 2 es un procesador con mayor base de usuarios (a fecha de Octubre de 2005, cuando se hicieron estas consideraciones), con todas las herramientas necesarias disponibles, incluso tenemos la opción de simu- lar tanto con TSIM como con el simulador generado por ArchC [RABA04, ARB+05], una herramienta de libre distribución que nos permite generar si- muladores interpretados, simuladores compilados y ensambladores a partir de una descripción de la arquitectura del procesador10. Como se ha comen- tado anteriormente, nos hemos fijado en Leon por ser de código abierto, y por no estar ligado a ninguna tecnología de FPGA concreta. Además de lo que se ha comentado anteriormente sobre Leon 3, una de las razones por las que se ha escogido para este proyecto Leon 2 es porque existe un ‘board support package’ para la placa XSV-800 para Leon 2 que no existe para Leon 311. 6. Distintos cores del proyecto opencores [Ope]: se estuvieron evaluando al- gunos diseños del proyecto opencores, y en su momento se encontró que algunos no están terminados, otros están hechos pero no tienen todas las herramientas que necesitamos (diseñar el procesador es sólo el primer paso, el segundo es portar el toolchain GNU, y partir de ahí se pueden portar las herramientas y bibliotecas necesarias, pero ello requiere un esfuerzo consi- derable), y un problema mayor que plantean es que se desconoce si violan patentes, copyrights u otra clase de propiedad intelectual12. De entre los procesadores evaluados, hay uno muy interesante, OpenRisc, descrito en Verilog, cuyo desarrollo está completo y tiene su propio port del toolchain GNU e incluso un ISS. Este procesador se plantea como una buena alterna- tiva a Leon, pero dado que nosotros vamos a trabajar la parte HW de nuestro diseño en VHDL (ya que PeaCE trabaja con VHDL), e integrar VHDL con Verilog, si bien es factible, es poco conveniente y en algún momento podría causarnos problemas, por lo que finalmente se optó por utilizar el procesa- dor Leon 2. 10Actualmente, los desarrolladores del proyecto ArchC están trabajando en la descripción ArchC del procesador Leon 2 11Más adelante comprobamos que dicho ‘board support package’ no producía los resultados que eran de esperar, resultando en una netlist incorrecta, por lo que se tuvo que realizar la síntesis manualmente utilizando Xilinx ISE. 12De hecho, entre los disclaimers que acompañan a los diseños de opencores, se pueden en- contrar mensajes como: "I have no idea if implementing this core will or will not violate patents, copyrights or cause any other type of lawsuits. I provide this core as is, without any warranties." 34 Procesador Leon 2 5.3 Configuración del modelo 5.3. Configuración del modelo El modelo se configura utilizando una herramienta basada en Tk que se dis- tribuye con el mismo, por lo que hay que asegurarse de tener instaladas dichas herramientas. En Red Hat 8.0 se puede indicar durante el proceso de instalación del sistema operativo que queremos instalar las herramientas Tk. La figura 5.3 es una captura de pantalla de la herramienta de configuración que muestra la confi- guración de las memorias caché on-chip. La versión concreta de Leon 2 que se ha utilizado es la 1.0.30 xst, y las características fundamentales de la configuración utilizada son: Ausencia de unidad de manejo de memoria (MMU), unidad de punto flo- tante (FPU) y coprocesador (CP). La unidad de enteros (integer unit) se ha configurado de forma que pueda responder a las instrucciones MUL/DIV del juego de instrucciones de Sparc V8, y se ha inferido un multiplicador para que estas instrucciones no tengan un tiempo de ejecución excesivo. Tecnología objetivo Virtex. Cachés de instrucciones y datos, cada una consta de 1 set de 4Kbytes y 32 bytes por línea. Unidad de Soporte de Depuración (DSU) habilitada. Controlador de memoria SRAM de 16 bits de ancho del bus de datos. Además, hemos modificado el wrapper leon_eth_xsv800.vhd, uniendo los pi- nes RTS13 y CTS14 de la UART 1 (señales PIO(13) y PIO(12) del procesador), que es la que utilizaremos para establecer una comunicación con Snapgear Linux, a través del programa minicom15. Es necesario realizar esto ya que, en caso contra- rio, Snapgear se cuelga al arrancar, durante la inicialización de la UART, ya que los pines que pretende utilizar para realizar el control de flujo por hardware (RTS y CTS) no están mapeados al exterior de la FPGA. Esto es así ya que la placa XSV-800 sólo dispone de un chip MAX232, lo cual significa que sólo tenemos cuatro señales disponibles: TX, RX, CTS y RTS, de forma que la UART1 de Leon 2 utiliza únicamente TX y RX, y la DSU transmite y recibe utilizando las pistas CTS y RTS. De hecho, para la realización de este proyecto se ha fabricado un 13Request To Send. 14Clear To Send. 15Unir los pines CTS y RTS de una UART no es ninguna novedad: es lo que muchísimos cable modem nulos (null modem cables) hacen ya. 35 Procesador Leon 2 5.3 Configuración del modelo Figura 5.3: Herramienta de configuración del procesador Leon 2 36 Procesador Leon 2 5.4 Añadiendo la parte HW de tu diseño a Leon 2 XSV-800 Conector serie 1 (UART) Conector serie 2 (DSU) (conectará con minicom) (conectará con grmon TD RD - RD TD - CTS (Rx) - TD RTS (Tx) - RD GND GND GND Figura 5.4: Esquema del cable serie en Y cable en Y que permite realizar dos comunicaciones serie con la placa XSV-800 (ver figura 5.4 en la página 37). Para evitar las optimizaciones agresivas, hemos mapeado esta señal rts-cts a un pin de la FPGA (concretamente, a uno de los leds del diagrama de barras). Tenemos que añadir que en principio se intentó realizar la síntesis del proce- sador Leon con el módulo ethernet, pero esto no fue posible debido a un problema con los IOB16 de la FPGA. Si bien este problema es solucionable, no se le prestó demasiada atención ya que nuestra placa de desarrollo está tan limitada en sus recursos RAM que aunque implementemos el módulo ethernet no podremos tener ninguna aplicación de red significativa, ya que este tipo de aplicaciones suelen demandar bastante RAM durante su ejecución. 5.4. Añadiendo la parte HW de tu diseño a Leon 2 Para añadir la parte hardware de un diseño a Leon 2, tenemos en principio 3 opciones: 1. Utilizar el interfaz genérico para conectar el Leon a un co-procesador: de es- ta forma, el bloque HW haría las veces de coprocesador. Como ventaja tiene que tendrá una rapidez considerable, ya que el interfaz conecta de una for- ma muy directa con el núcleo de la CPU, pero como desventajas tiene que el interfaz es bastante específico, por lo que no es extensible a otros pro- cesadores, y además puede ser muy complicado realizar una exploración del espacio de diseño, y que para utilizar este enfoque se requiere obvia- mente que no dispongamos ya de un co-procesador que queramos utilizar. Como nota a considerar, comentaremos que realmente en muchos casos el codiseño hardware/software se plantea como el sintetizar ciertas tareas en 16In/Out Blocks. 37 Procesador Leon 2 5.4 Añadiendo la parte HW de tu diseño a Leon 2 un módulo hardware que actúa de co-procesador (recordemos el caso de Impulse C). 2. Añadir la parte HW del diseño como un periférico AHB, muy útil si que- remos transferir grandes cantidades de información entre las partes HW y SW del diseño. 3. Añadir la parte HW del diseño como un periférico APB, con una tasa de transferencia de informaciónmenor, pero mucho más sencillo de imple- mentar, es la elección ideal si las operaciones que se realizan en el interfaz HW/SW son operaciones de control más que de transferencia de grandes volúmenes de datos. En la aplicación de demostración realizada en el capítulo 9 utilizamos el bus APB, para demostrar lo sencillo que es añadir módulos HW, y también porque se trata de una aplicación de muy poca complejidad que no necesita de interfaces avanzados. Para añadir la parte HW de la aplicación de demostración, hay que definir dos señales en el módulo que correspondan a los buses de entrada y salida APB, modificar el fichero mcore.vhd para añadir nuestro componente ‘hwpart’ como un periférico APB esclavo, y modificar apbmst.vhd para que extender la decodi- ficación de las direcciones, de forma que nuestro periférico sea reconocido en la dirección de memoria que hemos escogido (concretamente la 800000E0). Ade- más, ya que la parte HW del diseño actúa directamente sobre leds de la placa, hay que modificar todos los ficheros de los niveles superiores en la jerarquía hasta lle- gar al wrapper externo (mcore.vhd, leon_eth.vhd y leon_eth_xsv800), y además añadir los pines de los leds al ucf. 38 Capítulo 6 Placa de desarrollo XSV-800 “Playfully doing something difficult, whether useful or not, that is hacking" – Richard Stallman, attributed 6.1. Descripción La plataforma sobre la que se ha implementado el sistema es la placa de de- sarrollo XSV-800 de Xess [X E01b]. Esta plataforma nos permite demostrar un sistema mínimo sobre una FPGA Virtex XCV800, de aproximadamente 800000 puertas equivalentes, si en la cuenta de puertas equivalentes incluimos a las RAM internas. Tanto la FPGA como la placa de desarrollo están ya descatalogadas, y los recursos en la placa están bastante limitados en relación a lo disponible hoy en día. La placa de desarrollo dispone únicamente 2MB de memoria SRAM, que se han de compartir entre la imagen desde la que se arrancará el sistema operativo y la memoria disponible para los procesos del sistema, ya que no vamos a utilizar la Flash. Esta Flash comparte pines del bus de direcciones con los interruptores DIP presentes en la placa, que utilizamos para activar la DSU del procesador, por lo que no podemos utilizar la Flash. 39 Placa de desarrollo XSV-800 6.1 Descripción Figura 6.1: Xess XSV-800. Fotografía 40 Placa de desarrollo XSV-800 6.2 Configuración 6.2. Configuración 6.2.1. Configuración de jumpers La figura 6.2 muestra la configuración de jumpers utilizada. Jumper Configuración Efecto J13 y J14 Abiertos Alimentación utilizando fuente ATX J32 Shunt en pines 1-2 La alimentación de 2.5V para la FPGA se genera en la placa J22 Shunt en pines 2-3 Oscilador programado Shunt en pines 1-2 Oscilador en modo programación J36 Shunt en pines 1-2 CLK interno (generado por el oscilador) J23 Abierto La CPLD no puede ser reprogramada Cerrado La CPLD puede ser reprogramada J29, J30 y J31 Shunts en pines 2-3Permiten el uso de xsload Figura 6.2: Configuración de jumpers empleada Los jumpers J37, J18, J34, J33, J16 sirven para configurar el puerto USB, y su disposición concreta no influye en nuestra aplicación ya que no utilizamos dicho puerto. Igualmente ocurre con los jumpers de otros dispositivos on-board, como el RAMDAC VGA. Para los jumpers para los que aparecen dos configuraciones, se utiliza una u otra según el efecto deseado. 6.2.2. Frecuencia de reloj Se ha programado el reloj de la FPGA a 20MHz. Como el oscilador es de 100MHz, esto significa que hemos programado el divisor de frecuencias a un valor de 5. Esto se hace utilizando la utilidad xssetclk, siempre que hayamos con- figurado adecuadamente el jumper J22. 6.2.3. Reprogramación de la CPLD Ha sido necesario reconfigurar la CPLD presente en la placa para permitir el acceso por el puerto serie al procesador que implementaremos en la Virtex. Esto es indispensable para nuestro sistema, ya que el sistema operativo que introduci- remos en la placa de desarrollo mapeará su entrada y salida de consola a través del puerto serie. 41 Placa de desarrollo XSV-800 6.3 Xstools Figura 6.3: Diagrama de bloques de la plataforma Xess XSV-800 Para ello, se ha modificado el fichero de programación de la CPLD, dwnld- par.vhd, siguiendo las notas de [X E00]. Reprogramar la CPLD de la placa es una acción potencialmente peligrosa, ya que si se programaran los pines del JTAG de la CPLD como pines de salida1, no podríamos volver a programarla, siendo la única solución en ese caso el extraer el dispositivo de la placa y sustituirlo por otro. 6.3. Xstools El paquete XSTOOLs [X E01a] contiene las siguientes herramientas GUI y sus alternativas de línea de comandos: GXSTEST / XSTEST: Esta utilidad permite hacer un test a la placa para comprobar que su funcionamiento es correcto. 1Realmente, los pines 63, 71, 73 y 78 se podrían programar como salidas, pero en ese caso es indispensable que entren en un estado de alta impedancia cuando el pin DONE de la Virtex esté a nivel bajo (de forma que la CPLD se pueda reprogramar al encender la placa, cuando la FPGA aún no ha sido programada). 42 Placa de desarrollo XSV-800 6.3 Xstools GXSSETCLK / XSSETCLK: Esta utilidad permite configurar la frecuencia de reloj del oscilador programable de la placa. GXSLOAD / XSLOAD: Esta utilidad permite programar la FPGA y la CPLD y leer y escribir ficheros de datos en la RAM y la Flash de la pla- ca. GXSPORT / XSPORT: Esta utilidad permite enviar entradas lógicas a una placa XS cambiando los pines de datos del puerto paralelo. Las mismas herramientas sirven para toda la familia de placas XS, ya que su arquitectura es similar, basada en un dispositivo programable de configuración no volátil (la CPLD) en el cual se centralizan las acciones de programación y configuración de los distintos dispositivos on-board. El código fuente de las herramientas XSTOOLs fue liberado al dominio pú- blico por Xess, lo que ha posibilitado que exista un port de estas herramientas para Linux, y es este port el que hemos compilado y utilizado con éxito en este proyecto. 43 Capítulo 7 Snapgear Linux “All the best people in life seem to like Linux" – Stephen Wozniak 7.1. Necesidad de un sistema operativo Utilizar un sistema operativo en nuestro sistema integrado, en lugar de pro- gramar directamente las rutinas específicas de nuestra aplicación en código en- samblador, ofrece una serie de ventajas, siendo la más importante la capacidad de tener múltiples tareas ejecutándose en el microprocesador, y esto es de gran im- portancia para hacer codiseño HW/SW, ya que es de esperar que se tengan varias tareas ejecutándose en software. Para nuestro sistema, se ha decidido utilizar Snapgear Linux, una distribución de Linux específica para sistemas integrados con soporte para la familia de proce- sadores Leon. 7.2. Descripción Linux es un sistema operativo muy conocido, maduro y con soporte, multita- rea, con posibilidad de trabajo en tiempo real, y con muchas aplicaciones estables que se pueden utilizar sin que sea necesario modificarlas. Con respecto a otros sistemas operativos para sistemas integrados, Linux para sistemas integrados tie- ne la ventaja de presentar la misma interfaz a las aplicaciones que su versión para ordenadores personales, de forma que es posible utilizar, para el desarrollo de las aplicaciones, una plataforma muy semejante, con un entorno de ejecución y he- rramientas muy similares (las mismas), a las que luego estarán disponibles en el sistema integrado. El desarrollo y la posterior depuración de las aplicaciones son 44 Snapgear Linux 7.2 Descripción mucho más sencillos para el diseñador cuando el sistema operativo y el entorno de ejecución son los mismos en el PC de desarrollo y en el sistema final. Además, Linux, al ser un sistema UNIX, es un sistema tan interactivo que ofre- ce la posibilidad de realizar actualizaciones del software desde dentro del mismo, es decir, si el sistema dispone de suficiente memoria, es posible instalarel compi- lador de c (gcc) y, con este compilador recompilar las aplicaciones que necesite- mos modificar, sin necesidad de parar el sistema completo ni las aplicaciones que no se modifiquen. En lugar de Linux, podíamos habernos decantado por eCos, un sistema ope- rativo en tiempo real desarrollado inicialmente por Cygnus Solutions y en la ac- tualidad mantenido por eCosCentric. Este sistema operativo es especialmente útil cuando se tiene una plataforma con muy poca memoria disponible (su huella se puede reducir hasta los cientos o decenas de KBytes), pero ya que en nuestra pla- taforma tenemos memoria suficiente como para implementar un sistema Linux mínimo, sabiendo que Linux tiene mayor base de usuarios y una ingente cantidad de colaboradores y usuarios y, considerando además la posibilidad de reutilizar los conocimientos aprendidos de este proyecto en plataformas con mayores pres- taciones, hemos decidido finalmente utilizar Linux en lugar de eCos. 7.2.1. Kernels para sistemas con y sin MMU Para que un sistema operativo como Linux pueda funcionar en un procesa- dor, normalmente es necesario que dicho procesador disponga de una unidad de manejo de memoria (MMU), que se encarga de dar a cada proceso un espacio de memoria protegida, y de proteger al kernel de los procesos. Además, la MMU se encarga de realizar la traducción de las direcciones de memoria virtuales a di- recciones físicas antes de cada acceso a memoria, presentando al núcleo y a los procesos una interfaz estándar para el acceso a memoria. Afortunadamente existen versiones del núcleo de Linux que han sido adaptadas para su uso en procesadores que carecen de MMU [DL02]. Snapgear Linux ofrece la posibilidad de ejecutar kernels tanto para sistemas con unidades de manejo de memoria tanto para siste- mas que carecen de ella. El procesador leon 2 incluye una unidad de manejo de memoria que se puede implementar, como se ha comentado en el capítulo 5, si le da la opción correspon- diente en el menú de configuración del procesador, con el consecuente incremento del tamaño del diseño. Dado que la plataforma utilizada tiene ciertas limitaciones, ha sido necesario sintetizar el procesador sin unidad de manejo de memoria, por lo que finalmente se ha configurado el sistema Linux con un kernel con soporte para sistemas non-MMU. Concretamente, en la implementación aquí descrita se ha utilizado un kernel 2.0.39 con este soporte. La herramienta de configuración (ver figura 7.1) ofrece la posibilidad de ajus- 45 Snapgear Linux 7.3 Configuración tar las opciones concretas del núcleo Linux que se implementarán, así como las aplicaciones concretas que se compilarán en el sistema, de forma que se puede ganar espacio eliminando las funcionalidades que no se necesiten. Snapgear Li- nux permite añadir de forma sencilla aplicaciones específicas, que se compilarán junto al resto del sistema. Ya que el entorno utilizado comprende lenguaje C, las herramientas de desarrollo UNIX normales (gcc, make) y el API de un sistema POSIX, existen muchas facilidades para la reutilización del código. Esto, unido a, como se ha comentado anteriormente, que el entorno de ejecución final es el mis- mo que el de desarrollo de la aplicación, permite construir versiones integradas de aplicaciones previamente desarrolladas sobre ordenadores personales. 7.3. Configuración La versión concreta de snapgear que hemos utilizado es la versión p-17. Al igual que el procesador Leon 2, Snapgear Linux se configura utilizando una he- rramienta basada en Tk. Se ha tenido especial cuidado en la configuración de Snapgear Linux ya que nuestra placa está bastante limitada en lo que a recursos respecta. Ya que únicamente disponemos de 2MB de RAM, espacio que ha de compartirse con la imagen RAM, y�Clinux necesita alrededor de 1MB de RAM para poder ejecutar un sistema mínimo1, hemos reducido la imagen RAM todo lo posible eliminando funcionalidades no necesarias. La ocupación en RAM de la imagen de Linux obtenida finalmente ha sido de alrededor de 600KB, por lo que queda más de 1MB de memoria para uso de las aplicaciones. Las características fundamentales de la configuración utilizada son: Parámetros del procesador: Fabricante Gaisler y Modelo Leon 2 Versión del núcleo: linux-2.0.39 nommu Biblioteca estándar C: uClibc Tipo de ram: SRAM. 2 bancos de 8 MBytes cada uno. Estados de espera en lectura (rws), escritura (wws) y modificación (rms): 1. Configuración del núcleo: � Sin soporte para aplicaciones de red 1En el caso de tener menos memoria, tendremos errores de tipo ‘failed to free page’, debido a que Linux no puede reservar la memoria necesaria para los procesos que se quieren ejecutar. En estos casos no es raro observar que la memoria que requiere un proceso es menor que la memoria libre total, pero aún así no se puede ejecutar el proceso. Esto se debe a que toda la memoria que se asigne inicialmente a un proceso debe ser contigua. 46 Snapgear Linux 7.4 Añadiendo la parte SW de tu diseño a snapgear � Huella reducida � Soporte para el sistema de archivos /proc2 � Soporte para comunicaciones serie � Versiones de kmalloc.c/page_alloc.c que hacen un mejor aprovecha- miento de la memoria. Configuración de las aplicaciones: se han eliminado todas las aplicaciones de red, lo cual ha ayudado mucho a reducir el tamaño de la imagen RAM. Además, utilizamos un programa muy compacto llamado BusyBox que ha- ce las veces de init y se puede configurar para que proporcione las funcio- nalidades de múltiples comandos de shell, como ls o ps. El shell que hemos utilizado es sash (stand-alone shell), un shell frecuentemente usado en sis- temas integrados y en operaciones de recuperación de sistemas ya que está enlazado estáticamente, por lo que no necesita de librerías dinámicas para su funcionamiento. Para la conexión con Snapgear Linux, configuramos al programa minicom con los siguientes parámetros: 1. Parámetros de comunicación: a) Velocidad: 38500 baudios b) Datos: Palabras de 8 bits c) Paridad: Ninguna d) Bits de parada: 1 2. Carácter que envía la tecla Backspace: DEL 3. Line wrapping (evita que aparezcan en pantalla líneas que se salgan del margen de la consola): ON La figura 7.2 es una captura de pantalla del programa minicom, a través del cual establecemos una comunicación serie con el sistema integrado. En la figura se puede apreciar el shell del sistema tras un arranque satisfactorio. 7.4. Añadiendo la parte SW de tu diseño a snapgear Añadir la parte software de un diseño híbrido es bastante sencillo, y básica- mente consiste en añadir un programa a la distribución Snapgear. Dicho programa 2/proc es un sistema de archivos virtual que proporciona información útil del sistema. 47 Snapgear Linux 7.4 Añadiendo la parte SW de tu diseño a snapgear Figura 7.1: Herramienta de configuración de Snapgear 48 Snapgear Linux 7.4 Añadiendo la parte SW de tu diseño a snapgear Figura 7.2: Captura de pantalla del programa minicom 49 Snapgear Linux 7.4 Añadiendo la parte SW de tu diseño a snapgear interactuará con el HW leyendo y escribiendo en los registros del bus AMBA que pertenezcan a la parte hardware. Los pasos que se han seguido para añadir la parte SW de la aplicación de demostración descrita en el capítulo 9 han sido los siguientes: Crear la carpeta <snapgear>/user/swpart, siendo <snapgear> el directorio raíz de las fuentes de la distribución. Escribir el código fuente del programa, dentro de user/swpart. En nuestro caso, ya que se trata de una aplicación sencilla, el código fuente consiste únicamente de un fichero: swpart.c Escribir un Makefile, dentro de user/swpart, para automatizar la compila- ción del SW y para integrarlo en snapgear, de forma que se compile auto- máticamente junto con el resto de la distribución. El makefile tendrá tres reglas que son invocadas automáticamente por los Makefiles generales de Snapgear: ‘all’, que compila el programa y crea los binarios y ejecutables, ‘romfs’, que copia los binarios al directorio romfs (a partir del cual se
Compartir