Facultad de Matemática, Astronom´ıa y F´ısica

Anuncio
Facultad de Matemática,
Astronomı́a y Fı́sica
TRAFIC
Un mecanismo no intrusivo de inyección de
fallas en memoria de un System On a Chip
Volarik, Néstor Mariano
Director: Marques, Carlos
14 de Diciembre de 2012
Twenty years from now, you will be more
disappointed by the things that you didn’t
do than by the ones you did do.
So throw off the bowlines.
Sail away from the safe harbor.
Catch the trade winds in your sails.
Explore. Dream. Discover.
Mark Twain(1835-1910)
i
ii
Agradecimientos
En especial, quiero agradecer a mis padres, quienes realizaron mucho esfuerzo
a lo largo de mi carrera con el fin de brindarme la posibilidad de estudiar. Su
apoyo en cada momento de mi vida es invaluable. Este trabajo está dedicado a
ellos.
A mi novia Cecilia, quien me acompañó con mucho amor a lo largo de los
últimos 3 años de la carrera.
Al Ing. Carlos Marques por la dirección en este trabajo.
Al Dr. Pablo Ferreyra y al Lic. Eduardo Sanchez por su apoyo, consejos,
ideas y opiniones.
A mis compañeros de trabajo que desinteresadamente me enseñaron y me
aportaron su experiencia, principalmente al Ing. Lucas Gabutti y al Ing. Renzo
Bechler.
Al tribunal evaluador, compuesto por el Dr. Nicolás Wolovick, Dr. Pablo
Ferreyra e Ing. Walter Zaninetti.
A cada uno de los profesores que hacen que FaMAF sea una de las facultades
más prestigiosas.
iii
iv
Resumen
En los últimos años, el avance en la tecnologı́a y arquitectura de los semiconductores han permitido desarrollar nuevos dispositivos programables (FPGA,
ASIC, CPLD, entre otros) caracterizados por un mayor nivel de integración,
incremento en la velocidad de procesamiento, menor consumo y la capacidad de
implementar un sistema completo. Estos sistemas, denominados System On a
Chip (SoC), integran la mayorı́a de los componentes de un sistema: procesador,
memoria, controladores de periféricos, entre otros, en una sola pastilla.
Por sus interesantes caracterı́sticas de (re)programación, flexibilidad y rendimiento, los SoC’s están siendo utilizados en campos donde la confiabilidad es un
requisito fundamental, por ejemplo, en aviónica, medicina, espacio y automóviles.
Debido a la complejidad, comprobar la confiabilidad de un SoC es un desafı́o.
Una forma viable de evaluación es mediante mecanismos de inyección de fallas.
El objetivo es generar fallas de manera controlada a distintas zonas de un sistema
bajo ensayo y observar como reacciona.
Este trabajo presenta un novedoso mecanismo de inyección de fallas no intrusivo denominado TRAFIC (TRansparent And non-intrusive Fault InjeCtoR),
basado en la caracterı́stica de depuración OCD (On-Chip Debug) de los procesadores modernos.
Como caso de estudio, se implementó el SoC basado en la biblioteca GRLIB
y el procesador 32-bits LEON3, ambos de la empresa Aeroflex Gaisler (www.
gaisler.com), en el kit de desarrollo XUPV5 de Xilinx con FPGA LX110T
(http://www.xilinx.com/univ/xupv5-lx110t.htm).
Clasificación: B.8.1 [PERFORMANCE AND RELIABILITY] Reliability,
Testing, and Fault-Tolerance.
Palabras claves: Sistemas embebidos, procesador LEON3, biblioteca GRLIB,
inyección de fallas, sistemas tolerantes a fallos, confiabilidad.
v
vi
Índice general
Agradecimientos
III
Resumen
V
1. Introducción
1.1. Motivación . . . . . . . . . . . . . . . .
1.2. Dispositivos Lógicos Programables . . .
1.3. Acerca de VHDL . . . . . . . . . . . . .
1.4. IP Cores . . . . . . . . . . . . . . . . . .
1.4.1. Softcore . . . . . . . . . . . . . .
1.5. Procesador LEON3 y biblioteca GRLIB
1.6. Inyector de fallas . . . . . . . . . . . . .
1.7. Objetivos . . . . . . . . . . . . . . . . .
1.8. Organización del trabajo . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
3
4
5
7
7
7
8
8
9
9
2. Procesador LEON3
2.1. Sobre la arquitectura . . . .
2.1.1. Registros . . . . . .
2.1.2. Ventana de registros
2.1.3. Instrucciones . . . .
2.2. Programación en LEON3 .
2.2.1. Compilación . . . .
2.3. Simulación . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
11
11
12
13
13
16
17
17
3. Biblioteca GRLIB
3.1. Plantillas de diseño . . . .
3.2. Configuración . . . . . . .
3.3. Bus AMBA . . . . . . . .
3.4. Sı́ntesis e implementación
3.5. GRMON . . . . . . . . . .
3.6. Bootloader . . . . . . . .
3.7. Sistemas Operativos . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
21
22
22
24
25
25
28
31
4. Inyección de fallas
4.1. Tolerancia a fallos y confiabilidad . . . . . . . . . . . .
4.2. Falla, error y defecto . . . . . . . . . . . . . . . . . . .
4.2.1. Tipos de fallas . . . . . . . . . . . . . . . . . .
4.3. Efectos de la radiación cósmica en la microelectrónica
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
33
33
34
34
35
.
.
.
.
.
.
.
vii
ÍNDICE GENERAL
1
4.3.1. Fuentes de radiación . . . . . . . . . . . . . . . . . . . . .
4.4. Mecanismos de inyección de fallas . . . . . . . . . . . . . . . . . .
4.5. Trabajos anteriores . . . . . . . . . . . . . . . . . . . . . . . . . .
5. Diseño e implementación de TRAFIC
5.1. Debug Support Unit . . . . . . . . . . .
5.1.1. Operación . . . . . . . . . . . . .
5.2. Memoria . . . . . . . . . . . . . . . . . .
5.2.1. Implementación de AHBDPRAM
5.3. Diseño de TRAFIC . . . . . . . . . . . .
5.4. Receptor de fallas . . . . . . . . . . . . .
5.4.1. Tramas tipo fdframe . . . . . . .
5.4.2. Tramas tipo eotframe . . . . . .
5.5. Buffer . . . . . . . . . . . . . . . . . . .
5.6. Inyector de fallas . . . . . . . . . . . . .
5.7. Conexión de TRAFIC al SoC . . . . . .
5.7.1. Memoria . . . . . . . . . . . . . .
5.7.2. DSU . . . . . . . . . . . . . . . .
5.7.3. Reloj principal . . . . . . . . . .
5.8. Compilación . . . . . . . . . . . . . . . .
5.9. Cliente computadora host . . . . . . . .
5.9.1. TRAFIC Fault Transmitter . . .
5.9.2. Transmisión . . . . . . . . . . . .
5.9.3. Formato del fichero . . . . . . . .
. . .
. . .
. . .
en el
. . .
. . .
. . .
. . .
. . .
. . .
. . .
. . .
. . .
. . .
. . .
. . .
. . .
. . .
. . .
. . .
. . .
. . .
SoC
. . .
. . .
. . .
. . .
. . .
. . .
. . .
. . .
. . .
. . .
. . .
. . .
. . .
. . .
. . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
35
36
37
41
41
42
43
44
46
47
47
48
48
48
50
50
51
51
52
55
55
55
56
6. Conclusión
57
6.1. Primera etapa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
6.2. Segunda etapa . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
6.3. Trabajos Futuros . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
7. Bibliografı́a
61
2
ÍNDICE GENERAL
Capı́tulo 1
Introducción
En los últimos años, el avance en la tecnologı́a y arquitectura de los semiconductores, han permitido desarrollar nuevos dispositivos programables (FPGA,
ASIC, CPLD, entre otros) caracterizados por un mayor nivel de integración,
incremento en la velocidad de procesamiento, menor consumo y la capacidad
de implementar un sistema completo [FIRESoPC][VHDL2004, Appx A]. Estos sistemas, denominados System On a Chip (SoC), integran la mayorı́a de
los componentes de un sistema tı́pico: procesador, memoria, controladores de
periféricos, entre otros, en una sola pastilla.
Por ésta razón, los SoC’s son interesantes desde varios puntos de vista;
Primero, dado que se basan en dispositivos estándar, su costo es significativamente menor en comparación a dispositivos ad-hoc.
Segundo, siendo programables, son prácticamente adaptables a cualquier
aplicación y permiten ser optimizados para un uso especı́fico.
Tercero, siendo reprogramables, soportan actualizaciones y además, los defectos pueden ser reparados en cualquier etapa, incluso luego de haber sido
distribuidos.
Gracias a éstas caracterı́sticas, los SoC’s están siendo utilizados en campos
donde la confiabilidad es un requisito fundamental. Por ejemplo, en aviónica,
medicina, espacio y automóviles [FIRESoPC].
A medida que el nivel de integración aumenta, el nivel de tensión de operación disminuye y sumado a las altas velocidades que alcanzan los últimos
dispositivos programables desarrollados, la sensibilidad a fuentes de ruidos aumenta considerablemente. Esto significa que la cantidad de energı́a necesaria de
una partı́cula incidente para afectar la electrónica es muy baja [G-MAT2008].
Un estudio publicado en [SEUGL] demuestra que la radiación residual encontrada en la Tierra a nivel del mar, tiene la energı́a suficiente para alterar el valor de
un bit de memoria, que puede llevar a un funcionamiento erróneo del sistema,
con posibles resultados dramáticos. Estos incidentes, denominados Single Event
Upset (SEU), tienen la caracterı́stica de alterar el estado lógico de un dispositivo
programable sin dañarlo.
Debido a su complejidad, comprobar la confiabilidad de un SoC es un desafı́o.
Una forma viable de hacerlo, es mediante mecanismos de inyección de fallas. El
objetivo es generar fallas de manera controlada en distintas zonas de un sistema
bajo prueba, a veces denominados Device Under Testing (DUT), y observar
como reacciona.
3
4
CAPÍTULO 1. INTRODUCCIÓN
Distintos métodos han sido desarrollados hasta el momento, cada uno se
diferencia del área de cobertura, por ejemplo: memoria, registros, código del
programa, procesador y cuan intrusivo es implementarlo en el sistema. Prácticamente, la totalidad de los métodos estudiados son intrusivos (en distinto niveles), es decir, que para generar una falla, se requiere quitar, modificar o agregar
código, (re)compilar el software, utilizar interrupciones o eventos disparados por
distintas fuentes.
Este trabajo presenta un novedoso mecanismo de inyección de fallas no intrusivo denominado TRAFIC (TRansparent And non-intrusive Fault InjeCtoR),
basado en una caracterı́stica de depuración de los procesadores modernos, denominada On Chip Debug (OCD) [OCD2003], que permite controlar el progreso
de la ejecución del sistema. Logrando ası́ un mecanismo no intrusivo -la inyección de falla no altera el flujo original de ejecución del programa-, independiente
-el tamaño del software siendo ejecutado no incide en la inyección de fallas- y
transparente -para el sistema, el mecanismo de inyección de fallas es invisible-.
Como caso de estudio, se implementó TRAFIC en el SoC basado en la biblioteca GRLIB y el procesador 32-bits LEON3 [LEON3GRLIB], ambos productos de la empresa Aeroflex Gaisler (www.gaisler.com), en el kit de desarrollo XUPV5 de Xilinx con FPGA LX110T (http://www.xilinx.com/univ/
xupv5-lx110t.htm).
1.1.
Motivación
Los efectos de la radiación ionizante sobre dispositivos semiconductores se
ponen de manifiesto por primera vez al detectarse anomalı́as en vuelo en la
electrónica a bordo de las primeras misiones espaciales. El primer satélite artificial de los Estados Unidos, el Explorer I [ExplorerI], lanzado el 31 de Enero de
1958, portaba un contador Geiger1 de partı́culas ionizantes en un experimento propuesto por J. A. Van Allen. Luego del lanzamiento, el contador dejó de
funcionar cuando el satélite alcanzó una determinada altura. Posteriormente, se
supo que el contador habı́a saturado. Ese dı́a se descubrieron los Cinturones de
Van Allen [Mongollon2008].
Unos años después del lanzamiento del satélite Explorer I, el 10 de Julio
de 1962 se lanzó el satélite de telecomunicaciones americano Telstar [Telstar],
diseñado y construido en los laboratorios Bell. Fue el satélite que abrió la era
de las telecomunicaciones.
En plena Guerra Frı́a, el dı́a anterior al lanzamiento del Telstar, el gobierno
de los Estados Unidos realizó un experimento denominado Starfish Prime2 , haciendo detonar una bomba nuclear a gran altura. El aumento de la cantidad
de electrones en el escudo magnético de la Tierra, provocaron un mal funcionamiento en la electrónica de a bordo del Telstar, degradando su funcionalidades
gradualmente, hasta alcanzar la pérdida total del satélite el 21 de Febrero de
1963 [SSFAIL2005]. Fue el primer caso de pérdida de un satélite debido a los
efectos de la radiación sobre la electrónica.
Tal como lo demostró la suerte del satélite Telstar, la electrónica y más aún
los circuitos VLSI (Very Large Scale Integration) son susceptibles de sufrir fallos
1 http://en.wikipedia.org/wiki/Geiger_counter
2 http://en.wikipedia.org/wiki/Starfish_Prime
1.2. DISPOSITIVOS LÓGICOS PROGRAMABLES
5
debidos a causas naturales, principalmente provocados por la radiación cósmica y la interferencia electromagnética. Estos fallos, denominados Single Event
Effects (SEE), han preocupado a los diseñadores de aplicaciones de alta confiabilidad, tales como aplicaciones médicas, aeroespaciales, aviónica o automóviles
[Portela2007].
A medida que la tecnologı́a avanza, los componentes electrónicos son cada vez de menor tamaño, trabajan a menor tensión, a mayor velocidad y son
más complejos [SoCDesign]. Como consecuencia, la energı́a necesaria de una
partı́cula incidente para causar un SEE es menor [G-MAT2008].
Los SEE más frecuentes, son aquellos que no dañan al circuito fı́sicamente,
denominados Single Event Upset (SEU), pero si pueden inducir al sistema a un
estado erróneo.
La evaluación de la tolerancia a fallos es un problema ampliamente estudiado
por la comunidad cientı́fica. Existen dos formas de evaluar un circuito electrónico: de manera analı́tica o de manera experimental [FITT97][FIRESoPC][SFIT2004].
Los métodos analı́ticos se aplican al modelar el sistema, pero debido a la
complejidad de los circuitos electrónicos actuales, hacen que éstos métodos sean
prácticamente no aplicables.
Por otro lado, dentro de los métodos experimentales, la inyección de fallas es
una solución ampliamente aceptada y utilizada. Esta técnica se basa en inyectar
fallas en distintas regiones de un sistema prototipo DUT (Device Under Testing)
y observar la reacción.
La contribución exacta de los elementos de un circuito a la tasa de errores
(Soft Error Rate) depende de cada diseño, pero se puede asumir que aproximadamente, el 90% se debe a los elementos de memoria [Portela2007][Mitr05], tal
como lo muestra la Figura 1.1
Figura 1.1: Contribución a la tasa de errores de los distintos elementos que
componen un circuito tı́pico.
Por lo tanto, este trabajo está enfocado en los SEU’s que afectan a la memoria RAM de un sistema, inviertiendo el valor lógico de un bit de memoria.
1.2.
Dispositivos Lógicos Programables
Un dispositivo lógico programable o PLD (Programmable Logic Device), es
un componente electrónico utilizado para construir circuitos digitales reconfigu-
6
CAPÍTULO 1. INTRODUCCIÓN
rables. Es decir, a diferencia de una compuerta lógica, la cual tiene una función
definida, un PLD tiene una función indefinida al momento de su fabricación.
Antes de su utilización en un circuito digital, el PLD debe ser programado, o
para ser más especı́fico, reconfigurado.
Distintas tecnologı́as de fabricación dan lugar a distintos tipos de PLD, por
ejemplo:
ASIC (Application Specific Integrated Circuit), son dispositivos configurables por única vez, pero logran mayor velocidad que las FPGA’s y su costo
económico es menor.
FPGA (Field Programmable Gate Array) son dispositivos (re)programables
lo que brinda mayor flexibilidad que una ASIC a cambio de una menor
velocidad de reloj y mayor costo económico.
CPLD (Complex Programmable Logic Device) son similares a las FPGA
pero de menor tamaño lógico.
Este trabajo utiliza una FPGA de la empresa Xilinx para la implementación
del inyector de fallas junto al SoC. El modelo del kit de desarrollo es XUPV5LX110T (http://www.xilinx.com/univ/xupv5-lx110t.htm) y lo muestra la
Figura 1.2.
Una FPGA es un circuito integrado diseñado para ser configurado por un
el cliente o diseñador luego de su fabricación. Generalmente, la configuración
se especifı́ca utilizando un lenguaje de descripción de hardware (Hardware Description Language, HDL), como por ejemplo VHDL o Verilog [VHDL2004].
Figura 1.2: Kit de desarrollo XUPV5 de Xilinx con FPGA LX110T.
1.3. ACERCA DE VHDL
1.3.
7
Acerca de VHDL
VHDL es un lenguaje de descripción de hardware (Hardware Description
Language). Describe el comportamiento de un circuito electrónico o sistema que
luego puede ser implementado en un PLD.
VHDL significa VHSIC Hardware Description Language y a su vez, VHSIC es
una abreviación de Very High Speed Integrated Circuits, una iniciativa fundada
por el Departamento de Defensa de los Estados Unidos (US DoD) en 1980, que
luego llevó a la creación de VHDL.
La primera versión de VHDL es del año 1987 que luego fue actualizada en
el año 1993. VHDL fue el primer lenguaje de descripción de hardware en ser
estandarizado por el Institute of Electrical and Electronics Engineers a través
del estándar IEEE 1076 y posteriormente se agregó el estándar IEEE 1164 para
introducir lógica multi-valores [VHDL2004].
Fue diseñado para la sı́ntesis y simulación de circuitos digitales. Es completamente simulable, aunque existen sentencias no sintetizables. Una vez que
el código está escrito, puede ser sintetizado e implementado en un dispositivo
programable.
Es un lenguaje estándar, independiente de la tecnologı́a de implementación
subyacente y es por lo tanto, reusable y portable.
A diferencia de la programación de software donde la instrucciones se ejecutan secuencialmente, los instrucciones de VHDL se ejecutan inherentemente en
forma paralela.
Un buen libro para consultar sobre diseño de circuitos digitales utilizando
VHDL, es [VHDL2004].
1.4.
IP Cores
Un IP core (Intellectual Property Core) es un bloque de código reutilizable
que es usado en los diseños de circuitos digitales sintetizable en PLD. Es consecuencia de la tendencia de reutilizar componentes previamente implementados.
Idealmente, un IP core deberı́a ser portable, es decir, capaz de ser implementado en un PLD independientemente de la tecnologı́a subyacente.
Algunos ejemplos de IP cores son: Universal Asynchronous Receiver Transmitter (UART), controlador Ethernet, Peripheral Component Interconnect (PCI),
Central Processing Unit (CPU).
1.4.1.
Softcore
Un caso particular de IP core son aquellos que describen un procesador. Un
procesador Softcore, es un procesador que puede ser completamente implementado en un dispositivo de lógica programable.
La lista de softcores desarrollados hasta el momento es extensa, para nombrar
algunos ejemplos, se encuentran: LEON2, LEON3, MicroBlaze, Nios, OpenSparc
T1, Intel 8086. Una detallada lista de las caracterı́sticas de los softcores más
populares de la actualidad se encuentra en [SoftCores].
Este trabajo utiliza como caso de estudio el procesador LEON3 [LEONGRLIB]
de Gaisler (www.gaisler.com).
8
1.5.
CAPÍTULO 1. INTRODUCCIÓN
Procesador LEON3 y biblioteca GRLIB
El procesador LEON3 es un modelo VHDL sintetizable de un procesador
32-bits basado en la arquitectura SPARC V8 [Sparc92]. El softcore LEON3 es
altamente configurable y particularmente apropiado para el diseño de un System
On a Chip.
La configurabilidad del procesador permite a los diseñadores optimizar el
procesador para mayor rendimiento, menor consumo, mayor respuesta de entrada/salida y tamaño de implementación.
El procesador cuenta con una interfaz de bus AMBA AHB 2.0 [AMBA99]
para la conexión de distintos módulos IP cores incluı́dos en la biblioteca GRLIB
(Gaisler Research IP Library) [GRLIB2012].
La Fig. 1.3 muestra un sistema tı́pico basado en el procesador LEON3 y la
biblioteca GRLIB.
Figura 1.3: Ejemplo de un SoC basado en GRLIB y en el procesador LEON3.
1.6.
Inyector de fallas
Este trabajo presenta TRAFIC (TRansparent And non-intrusive Fault InjeCtoR ), un inyector de fallas de tipo SEU en memoria RAM. Utiliza un mecanismo basado en las caracterı́sticas de depuración de los procesadores modernos,
logrando ası́ un mecanismo no intrusivo, transparente e independiente.
Esto es, no altera el flujo de ejecución del sistema al momento de inyección
de una falla, a diferencias de otros métodos (no intrusivo).
Además, al desconectar el inyector de fallas, el sistema sigue funcionando de
manera usual (transparente).
La complejidad del software corriendo en el sistema no influye en el inyector
de fallas (independiente).
1.7. OBJETIVOS
1.7.
9
Objetivos
Este trabajo tiene dos objetivos principales:
Primer objetivo
Cada vez son más las aplicaciones utilizan un sistema embebido en sus diseños como una opción para dar solución a sus requerimientos. En la actualidad,
el procesador LEON3 es activamente utilizado en aplicaciones que van, desde
reproductores MP3 [LEONGRLIB] hasta la computadora a bordo de los dos
exploradores ExoMars que viajarán a Marte según lo planificado en 2016 y 2018
[ExoMars].
Por lo tanto, adquirir las aptitudes para el diseño e implementación del
System On Chip basado en la biblioteca GRLIB y el procesador LEON3, abre
el panorama a nuevas posibilidades de aplicación al egresado en la etapa laboral.
Segundo objetivo
En el mercado, los componentes electrónicos, en particular, los dispositivos
lógicos programables, se comercializan con distintos grados de calificación. Según
la aplicación donde van a ser utilizados, los componentes se califican (a grandes
rasgos) en: comerciales, militares y espaciales.
El precio entre los distintos tipos de componentes aumenta considerablemente. Basta con pedir cotizaciones a grandes empresas tales como Actel, ahora llamada Microsemi (http://www.actel.com/) ó a Xilinx (http://www.xilinx.
com/) para tener una noción de la pendiente de la curva de los precios entre
categorı́as.
En algunos casos, sucede, que los componentes entre las distintas categorı́as,
fueron construido de la misma forma y materia prima. La diferencia (y el precio)
recae sobre la etapa de calificación, los componentes militares y espaciales son
ensayados estrictamente.
Contar con un mecanismo de inyección de fallas, permite realizar nuestra propia califación de un sistema, y también probar la efectividad de algunos métodos
de tolerancia a fallos (por ejemplo, memoria redundada, TMR3 ), disminuyendo
el costo económico.
1.8.
Organización del trabajo
Este trabajo está dividido en 2 partes.
La primera parte, presenta al SoC utilizado como caso de prueba. El Cap. 2
presenta al procesador LEON3 de manera detallada a nivel arquitectura y a nivel
programación, junto a las herramientas de compilación, depuración y simulación.
El Cap. 3 introduce la biblioteca GRLIB, una colección de IP cores para conectar
al bus AMBA del sistema. También presenta GRMON, una herramienta de
depuración en tiempo real en hardware que es utilizada por TRAFIC.
En la segunda parte, en el Cap. 4, se define confiabilidad y sistemas tolerantes
a fallos. Se presenta el concepto de mecanismo de inyección de fallas, como una
3 Triple
Modular
redundancy.
Redundancy:
http://en.wikipedia.org/wiki/Triple_modular_
10
CAPÍTULO 1. INTRODUCCIÓN
herramienta para medir la confiabilidad de un sistema, junto a ejemplos de
trabajos desarrollados. En el Cap. 5 se diseña e implementa TRAFIC.
Finalmente, en el Cap. 6 se presenta la conclusión obtenida al finalizar éste
trabajo y en el Cap. 7, la bibliografı́a.
Capı́tulo 2
Procesador LEON3
LEON3 es un procesador 32-bits sintetizable desarrollado por la empresa
Aeroflex Gaisler (www.gaisler.com) y distribuido junto a la biblioteca GRLIB
[GRLIB2012], una colección de IP cores diseñada especialmente para el desarrollo de un system on a chip (SoC).
Posee un conjunto reducido de instrucciones y está basado en la arquitectura SPARC v8 [Sparc92]. Es altamente configurable, permitiendo optimizar el
procesador para aplicaciones especı́ficas. La Figura 2.1 muestra los bloques que
conforman al procesador LEON3, algunos de éstos son opcionales.
El procesador LEON3, la biblioteca GRLIB, el toolchain y demás herramientas, se distribuyen con licencia GNU GPL, permitiendo acceder de manera
gratuita a una versión académica de cada producto y también a su código fuente.
Algunas caracterı́sticas principales del procesador son:
Pipeline1 de 7 etapas.
Cache configurable.
Cache de datos y cache de instrucciones separados (modelo Harvard).
Instrucciones triádicas.
Unidades hardware dedicado para operaciones de multiplicación, división
y MAC. 2
Unidad de Punto Flotante IEEE-754 (Opcional).
2.1.
Sobre la arquitectura
SPARC (de Scalable Processor ARChitecture) es una arquitectura RISC bigendian diseñada por Sun Microsystem en el año 1985. Presenta algunas caracterı́sticas propias e innovadoras, tales como la ventana de registros, que permite
1 http://en.wikipedia.org/wiki/Classic_RISC_pipeline
2 La
operación MAC se define como: a := a + b x c.
11
12
CAPÍTULO 2. PROCESADOR LEON3
Figura 2.1: Procesador LEON3. Bloques constituyentes del procesador.
desarrollar compiladores más sencillos y reducir el tiempo entre cambios de contexto. LEON3 está basado en la versión 8 de la arquitectura SPARC.
Esta Sección describe brevemente la arquitectura, la especificación original
se encuentra en [Sparc92].
2.1.1.
Registros
Un procesador SPARC incluye 2 tipos de registros: registros de propósitos
generales y registros de control y estado. Los registros de propósitos generales
de la Integer Unit (IU) son llamados registros tipo r para diferenciarlos de los
registros de la FPU, llamados de tipo f.
Todos los registros son de 32 bits.
Registros de control y estado
Entre los registros de control y estado se encuentran:
Processor State Register (PSR): Controla la operación del procesador y
mantiene información de estado.
El PSR habilita/deshabilita el coprocesador (si está presente), la FPU
(si está presente), indica si está en modo usuario o en modo supervisor,
establece el nivel de interrupciones a la que el procesador atenderá, indica
el estado de la ALU luego de una operación aritmética (cero, negativo,
desbordamiento, acarreo), entre otras funciones.
2.1. SOBRE LA ARQUITECTURA
13
Trap Base Register (TBR): Indica la dirección de memoria donde se transfiere el control luego de que ocurra una trap.
Multiply/Divide Register (Y): Contiene los 32 bits más significativos del
resultado de una operación de multiplicación o división de doble precisión.
Program Counters (PC, nPC): El registro PC indica la dirección de memoria de la instrucción siendo ejecutada actualmente. La dirección de
la próxima instrucción a ejecutar (asumiendo que no ocurre una trap)
está contenida en el registro nPC.
Registros de propósitos generales
Un procesador SPARC v8 puede implementar desde 40 hasta 520 registros de
tipo r. Están organizados en 8 registros globales y en conjuntos de 16 registros
cada uno. Dependiendo de la implementación, la cantidad de conjuntos mı́nima
es 2 y la cantidad máxima es 32, dando un mı́nimo de 40 registros (2 conjuntos
de 16 más 8 globales) y un máximo de 520 (32 conjuntos de 16 cada uno más 8
globales).
Los registros de tipo r están dispuestos en forma de cola circular y son
accedidos mediante una ventana de registros.
2.1.2.
Ventana de registros
En un instante dado, los registros de tipo r a los que puede acceder una
instrucción (además de los registros globales) son los que están contenidos en la
ventana actual.
Una ventana está compuesta por 24 registros: 8 registros denominados ins:
i0, .. , i7, 8 registros locals: l0, .. ,l7 y 8 registros outs: o0, .. ,o7.
Los registros ins y locals son propios de la ventana actual, en cambio, los
registros outs son una referencia a los registros ins de la ventana adyacente. La
Fig. 2.2 muestra la superposición de registros.
El número de la ventana actual se indica en el campo CWP (bits [5..0] del
registro PSR). El campo CWP se incrementa en la ejecución de una instrucción
RESTORE ó RETT y decrementa con la instrucción SAVE (Fig. 2.3).
2.1.3.
Instrucciones
El conjunto reducido de instrucciones que define SPARC v8 puede agruparse
en 6 categorı́as básicas:
Carga y almacenamiento.
Aritméticas, lógicas y desplazamiento.
Transferencia de control.
Escritura y lectura de los registros de control.
Instrucciones de la unidad de punto flotante.
Instrucciones de coprocesador.
14
CAPÍTULO 2. PROCESADOR LEON3
Figura 2.2: Superposición de ventanas. Se puede apreciar la referencia de los
registros ins de la ventana CWP - 1 a través de los registros outs de la ventana
CWP.
Las instrucciones de carga y almacenamiento son las únicas que acceden a
memoria. Utilizan 2 registros de tipo r o un registro más una constante para
calcular la dirección de acceso.
Soportan lecturas/escrituras de longitud de un byte, halfword, word y double
word (8, 16, 32 y 64 bits resp.).
Los datos deben estar alineados en memoria de acuerdo a su longitud. Un
acceso desalineado genera una trap mem_address_not_aligned.
SPARC es big-endian, es decir, la dirección a la que apunta un dato, es la dirección de su byte más significativo, incrementar la dirección, significa disminuir
la significancia de la unidad siendo accedida (Fig. 2.4).
Las instrucciones aritméticas, lógicas y desplazamiento son triádicas (a excepción de SETHI). El formato es el siguiente: instr op1 op2 res, donde res
es el resultado de la operación ejecutada por instr como función de op1 y op2.
Las instrucciones de transferencia de control (CTI, control transfer instructions) incluyen llamadas a subrutinas, saltos relativos al contador de programa,
saltos registro-indirecto y traps condicional.
2.1. SOBRE LA ARQUITECTURA
15
Figura 2.3: Ventana de registros. La imagen muestra un sistema con 8 ventanas. La instrucción SAVE decrementa el valor de CWP, mientras que la instrucciones RESTORE y RETT lo incrementa. Figura extraı́da de [Sparc92].
Dentro de las instrucciones CTI están las denominadas DCTI (delayed CTI),
donde la instrucción siguiente a una DCTI se ejecuta antes de que la transferencia de control se lleve a cabo.
Ejemplo de ejecución de código real con DCTI. El código corresponde a la
aplicación Hello World! y se utiliza TSIM (Sección 2.3):
tsim> dis
400011ec
400011f0
400011f4
400011f8
400011fc
40001200
4000001f
90100019
82100008
84006001
c227bfe8
03100015
call
mov
mov
add
st
sethi
0x40001268
%i1, %o0
%o0, %g1
%g1, 1, %g2
%g1, [%fp - 0x18]
%hi(0x40005400), %g1
La primera columna corresponde a la dirección de memoria, la segunda columna al contenido, la tercera a la instrucción y parámetros.
16
CAPÍTULO 2. PROCESADOR LEON3
Figura 2.4: Arquitectura big-endian. (Gráfico Wikipedia: http://en.
wikipedia.org/wiki/Endianness).
El orden de ejecución de las 2 primeras lı́neas es el siguiente:
PC: 400011ec nPC:400011f0
PC: 400011f0 nPC:40001268
Como podemos observar, luego de la ejecución de la instrucción
call
0x40001268, la próxima instrucción a ejecutar no es la ubicada en la
dirección 0x40001268, sino, antes de que la transferencia de control se lleve a
cabo, se ejecuta la instrucción siguiente a la llamada call y luego recién el valor
0x40001268 se escribe en el PC.
La transferencia de control se toman con el retardo de una instrucción debido
a la cantidad de etapas del pipeline.
Las instrucciones de la categorı́a escritura y lectura de los registros de control
pueden alterar el estado visible del procesador accediendo a los registros de
control y estado.
Dependiendo de la implementación, el procesador puede añadir una FPU y
un coprocesador. Si está presente la FPU, se accede mediante las instrucciones
definidas por SPARC conforme a ANSI/IEEE estándar 754/1985. Las instrucciones de coprocesador no son definidas por SPARC y son dependientes de la
implementación.
2.2.
Programación en LEON3
Gaisler proporciona todas las herramientas necesarias para el desarrollo de
aplicaciones en LEON3. Incluye el compilador, depurador, simulador, entre
otros. El conjunto de éstas herramientas conforman el toolchain del procesador.
2.3. SIMULACIÓN
2.2.1.
17
Compilación
Para la compilación de aplicaciones escritas en C y C++ para LEON3 se
utiliza BCC Bare-C Cross-Compiler, un compilador de plataforma cruzada3 basado en GNU GCC, provisto por Gaisler (http://www.gaisler.com/anonftp/
bcc/bin/) y distribuido junto al toolchain del LEON3.
Por ejemplo, el código del tı́pico programa Hello World! se compila para una
plataforma LEON3 de la siguiente forma:
$ sparc-elf-gcc -o hello_world hello_world.c
Donde hello_world.c es:
#include <stdio.h>
int main(){
printf("Hello World!\n");
return 0;
}
Las opciones más importante, a nuestro criterio, soportadas por BCC son:
-g: Habilita soporte para depuración con GDB.
-msoft-float: Emula una unidad FPU para sistemas que no la implementen.
-mv8: Genera instrucciones mul/div. El procesador debe implementar el
hardware necesario.
-O2, -O3: Optimización de código en cuanto a rendimiento y tamaño.
El manual de BCC se encuentra en [BCC2011].
2.3.
Simulación
El ejecutable hello_world generado arriba, puede ejecutarse en TSIM [TSIM2011],
una máquina virtual basada en LEON3 y obtenida también desde el sitio de
Gaisler (http://gaisler.com/index.php/downloads/simulators).
Para correr el ejecutable hello_world en TSIM, se inicia desde una consola:
$ tsim-leon3.exe
This TSIM evaluation version will expire January 1, 2013
3 Un compilador de plataforma cruzada ó cross compiler, es un compilador que se ejecuta
sobre una arquitectura de tipo A y genera ejecutables para una arquitectura de tipo B. Más
información en http://en.wikipedia.org/wiki/Cross_compiler
18
CAPÍTULO 2. PROCESADOR LEON3
TSIM/LEON3 SPARC simulator, version 2.0.21 (evaluation version)
Copyright (C) 2001, Gaisler Research - all rights reserved.
This software may only be used with a valid license.
For latest updates, go to http://www.gaisler.com/
Comments or bug-reports to [email protected]
serial port A on stdin/stdout
allocated 4096 K RAM memory, in 1 bank(s)
allocated 32 M SDRAM memory, in 1 bank
allocated 2048 K ROM memory
icache: 1 * 4 kbytes, 16 bytes/line (4 kbytes total)
dcache: 1 * 4 kbytes, 16 bytes/line (4 kbytes total)
tsim>
Con el comando load se carga en memoria el programa hello_world:
tsim> load hello_world
section: .text, addr: 0x40000000, size 21728 bytes
section: .data, addr: 0x400054e0, size 2912 bytes
read 162 symbols
Y finalmente, con el comando run se ejecuta:
tsim> run
starting at 0x40000000
Hello World
Program exited normally.
TSIM soporta, entre otras, las siguientes funciones:
Setear breakpoints con el comando break [dirección o subrutina]:
tsim> break main
breakpoint 1 at 0x400011a4:
tsim> run
starting at 0x40000000
breakpoint 1 main
main
Examinar los registros internos con el comando reg:
tsim> reg
2.3. SIMULACIÓN
0:
1:
2:
3:
4:
5:
6:
7:
INS
00000000
400054CC
00000000
00000000
00000000
00000000
403FFE00
40001064
psr: F34010E6
pc: 400011a4
npc: 400011a8
19
LOCALS
40006000
400054F8
00000000
00000000
00000000
00000000
00000000
00000000
OUTS
00000000
00000000
00000000
00000000
00000000
00000000
403FFDA0
400054BC
wim: 00000002
03100015
90106090
GLOBALS
00000000
FFFFFFFF
00000000
FFFFFFF8
40004400
40006014
400046AC
00000000
tbr: 40000000
y: 00000000
sethi %hi(0x40005400), %g1
or
%g1, 0x90, %o0
Desensamblar código con dis [dirección] [cantidad], donde el primer
parámetro indica la dirección y el segundo la cantidad de lı́neas a mostrar
(parámetro opcional):
tsim> dis 0x400011a4
400011a4
400011a8
400011ac
400011b0
400011b4
400011b8
400011bc
400011c0
400011c4
400011c8
400011cc
400011d0
400011d4
400011d8
400011dc
400011e0
03100015
90106090
40000028
01000000
82102000
b0100001
81e80000
81c3e008
01000000
92100008
94102000
90102000
96102000
8213c000
40000048
9e104000
sethi
or
call
nop
mov
mov
restore
retl
nop
mov
mov
mov
mov
or
call
or
%hi(0x40005400), %g1
%g1, 0x90, %o0
0x4000124c
0, %g1
%g1, %i0
%o0, %o1
0, %o2
0, %o0
0, %o3
%o7, %g1
0x400012fc
%g1, %o7
Examinar la memoria con mem [dirección]:
tsim> mem 0x40000000
40000000
40000010
40000020
40000030
88100000
a1480000
91d02000
91d02000
09100011
a7500000
01000000
01000000
81c123b4
108011e1
01000000
01000000
01000000
ac102001
01000000
01000000
..........#.....
.H...P........ .
.. .............
.. .............
20
CAPÍTULO 2. PROCESADOR LEON3
Capı́tulo 3
Biblioteca GRLIB
El procesador LEON3 se entrega junto a la biblioteca GRLIB, una colección
de IP cores que pueden añadirse al sistema a través del bus AMBA, incluyendo
una amplia variedad de módulos que permiten dar soporte a la mayorı́a de
las aplicaciones. Algunos de los módulos que contiene son: controlador SVGA,
controlador USB, PS/2, interfaz 1553, controlador ATA, timers, Ethernet, PCI,
SPI, I2C.
El diseño del sistema, como ası́ también el procesador y cada componente,
son altamente configurables.
Para la implementación rápida en la mayorı́a de los kits de desarrollo, la
biblioteca GRLIB incluye plantillas de diseño (template designs).
Este Cap. presenta primero el concepto de plantillas de diseño. Luego, presenta una herramienta gráfica para la configuración del sistema, y finalmente, el
proceso de sı́ntesis e implementación y la depuración en hardware del sistema,
utilizando GRMON.
Figura 3.1: Biblioteca GRLIB. Ejemplo de un SoC basado en GRLIB.
21
22
CAPÍTULO 3. BIBLIOTECA GRLIB
3.1.
Plantillas de diseño
La implementación de un circuito digital en un dispositivo lógico programable requiere de parámetros especı́ficos del hardware, tales como: encapsulado del
PLD, velocidad, asignación de señales del circuito a pines del PLD, entre otros.
Para agilizar y facilitar la implementación del sistema, la biblioteca GRLIB
incluye plantillas de diseño, dentro del directorio grlib-gpl-1.1.0-b4113/designs/,
que contienen todos los archivos especı́ficos para la implementación del sistema
en la mayorı́a de los kits de desarrollos comerciales.
En éste trabajo se utiliza el kit de desarrollo XUPV5-LX110T de Xilinx
también conocida como Xilinx ML509. Por lo tanto, todos los comandos en éste
Capı́tulo se ejecutan dentro de la plantilla de diseño:
grlib-gpl-1.1.0-b4113/designs/leon3-xilinx-ml509.
3.2.
Configuración
El procesador LEON3 y la biblioteca GRLIB son altamente configurables.
La biblioteca incluye una aplicación gráfica (Fig. 3.2) para simplificar el proceso
de configuración. Se ejecuta con el comando make xconfig:
/grlib-gpl-1.1.0-b4113/designs/leon3-xilinx-ml509/$ make xconfig
Figura 3.2: Interfaz gráfica para la configuración del procesador LEON3 y la
biblioteca GRLIB.
Algunas de las opciones de configuración son:
Processor
Number of processor: Cantidad de procesadores en el sistema. El procesador LEON3 puede ser utilizado en sistemas multiprocesadores con
configuración SMP (Synchronous Multiprocessing) o AMP (Asymmetric
Multiprocessing). Hasta 16 procesadores pueden ser implementado en un
sistema.
3.2. CONFIGURACIÓN
23
Integer Unit
SPARC register windows: Longitud de la cola circular de conjuntos de
registros de tipo r (Valores: [2..32]).
SPARC V8 MUL/DIV instructions: El hardware implementa las instrucciones de multiplicación y división, incrementando el rendimiento en código que ejecutan operaciones aritméticas.
El código debe ser compilado con el flag -mv8.
Branch prediction: Dependiendo de la aplicación, habilitando branch prediction se pueden obtener incrementos de rendimiento de hasta un 20 %.
El propósito del branch prediction es mejorar el flujo en el pipeline, prediciendo que rama tomar en una bifurcación if-then-else o en un ciclo, antes
de ejecutar el condicional.
Single-vector trapping: Habilitando esta opción, todas las traps transfieren
el control a la dirección de la trap 0.
No se requiere más una trap table. El tratamiento de una trap la realiza el
sistema operativo leyendo el tipo de la trap tt del registro PSR (Sección:
2.1.1).
Ahorra recursos disponibles de FPGA a cambio de incremento de overhead
cuando se genera una trap.
Floating-Point Unit
Enable FPU: Añade una unidad FPU al procesador.
Cache System
Enable instruction cache: Habilitar cache de instrucciones.
Associativity (sets): Establece el número de entradas posibles en cache para el almacenamiento de un valor de memoria, es decir, si el valor de asociatividad es N, un valor en la memoria principal, tiene N lugares posibles
en cache donde almacenarse. Cuando N = 1, se denomina direct-mapped
(Fig. 3.3).
Replacement algorithm: Define el algoritmo de reemplazo de datos en cache1 . Soporta: random, direct, LRU y LRR.
MMU
Enable MMU: Implementar el procesador con o sin MMU.
1 Más
información en http://en.wikipedia.org/wiki/Cache_algorithms
24
CAPÍTULO 3. BIBLIOTECA GRLIB
Figura 3.3: Polı́tica de ubicación de datos en cache. (Gráfico Wikipedia:
http://en.wikipedia.org/wiki/CPU_cache).
Peripherals
Memory controller: Habilitar y configurar el controlador de memoria.
El controlador puede acceder a ROM, I/O, SRAM y SDRAM.
On-chip RAM/ROM: Añadir memorias on-chip RAM y ROM al sistema.
Ethernet: Habilitar y configurar el controlador Gaisler Research 10/100/1000
Mbit Ethernet MAC.
UART, timer, I2C, I/O port and interrupt controller: Añadir y configurar
éstos elementos.
3.3.
Bus AMBA
La biblioteca GRLIB está diseñada centrada en un bus principal, los módulos
están conectado a un bus común on-chip. El bus elegido por GRLIB es el AMBA2.0 AHB / APB [AMBA99] debido a su amplio uso en procesadores ARM y
porque está bien documentado y puede ser usado libremente sin restricciones de
licencia [GRLIB2012].
La especificación AMBA (Advanced Microcontroller Bus Architecture) define
un estándar de comunicaciones on-chip para el diseño de microcontroladores
embebidos de alto performance.
La especificación AMBA define 3 buses:
Advanced High-performance Bus (AHB).
Advanced System Bus (ASB).
Advanced Peripheral Bus (APB).
Advanced High-performance Bus (AHB)
El bus AMBA AHB está diseñado para módulos de alta performance y frecuencia
de reloj.
3.4. SÍNTESIS E IMPLEMENTACIÓN
25
Soporta la conexión eficiente de procesadores, memorias on-chip y periféricos
de alta velocidad.
En un bus AHB pueden distinguirse dos tipos de dispositivos: maestros y
esclavos. Un dispositivo maestro AHB es capaz de iniciar una operación de lectura y escritura, proveyendo una dirección e información de control. Solamente
un maestro puede estar activo en un instante dado. Un dispositivo esclavo AHB
responde a operaciones de lectura o escritura dentro de un espacio o dirección
especificado.
Advanced System Bus (ASB)
El bus AMBA ASB es una alternativa al bus AHB, también de alta performance pero de menor caracterı́sticas.
No es utilizado por la biblioteca GRLIB.
Advanced Peripheral Bus (APB)
El bus AMBA APB está diseñado para la conexión de periféricos de bajo
consumo y de baja velocidad. Posee una interfaz de conexión menos compleja.
3.4.
Sı́ntesis e implementación
Sı́ntesis es el proceso que transforma el código VHDL del SoC a un bitstream
a nivel de compuertas lógicas y flip-flops entendido por la FPGA.
Se inicia con el comando:
/grlib-gpl-1.1.0-b4113/designs/leon3-xilinx-ml509/$ make ise
Este comando utiliza el sintetizador Xilinx XST, pero pueden usarse otras
herramientas disponibles, tales como synplify (ejecutar $ make help para más
detalles).
El proceso puede tomar varios minutos y termina generando un archivo
leon3mp.bit, que es descargado en la placa durante el proceso de implementación.
La implementación del archivo leon3mp.bit en el kit de desarrollo, es sencilla
y rápida, pero es dependiente del hardware del kit. En el proyecto se utilizó la
herramienta iMPACT de Xilinx.
Una vez que el LEON3 ha sido implementado en la placa de desarrollo, puede
utilizarse GRMON [GRMON2011] para verificar el funcionamiento del sistema.
3.5.
GRMON
GRMON [GRMON2011] es una aplicación que corre en la computadora host
y se conecta con el SoC implementado en el kit, mediante el puerto JTAG u
otra interfaz (UART, USB, PCI, Ethernet). Se comunica con el módulo Debug
Support Unit (DSU) conectado al bus AMBA AHB [GRLIBIP2012, Chp. 27].
Al iniciar GRMON, el procesador entra en modo depuración. En este modo,
se detiene la ejecución de instrucciones (pero no el reloj) y el procesador es
controlado mediante el DSU y GRMON, permitiendo acceder a los registros
del procesador y de cada componente del sistema, examinar la memoria, cargar
26
CAPÍTULO 3. BIBLIOTECA GRLIB
aplicaciones en memoria RAM y ejecutarlas, escribir la memoria ROM, colocar
breakpoints entre otras funciones.
Al correr una aplicación, el procesador retorna a modo normal reanudando
la ejecución de instrucciones desde donde se detuvo.
GRMON se inicia desde una consola:
$ grmon-eval.exe -freq 80 -xilusb -u
GRMON LEON debug monitor v1.1.52 evaluation version
Copyright (C) 2004-2011 Aeroflex Gaisler - all rights reserved.
For latest updates, go to http://www.gaisler.com/
Comments or bug-reports to [email protected]
This evaluation version will expire on 20/6/2013
Try to open libusb filter driver
Xilinx cable: Cable type/rev : 0x3
JTAG chain: xc5vlx110t xccace xc95144xl xcf32p xcf32p
Device ID: : 0x509
GRLIB build version: 4113
initialising ...................
SRAM waitstates: 2
Component
LEON3 SPARC V8 Processor
AHB Debug UART
AHB Debug JTAG TAP
SVGA Controller
GR Ethernet MAC
DDR2 Controller
AHB/APB Bridge
LEON3 Debug Support Unit
LEON2 Memory Controller
System ACE I/F Controller
Generic APB UART
Multi-processor Interrupt Ctrl
Modular Timer Unit
PS/2 interface
PS/2 interface
General purpose I/O port
AMBA Wrapper for OC I2C-master
AMBA Wrapper for OC I2C-master
AHB status register
Vendor
Gaisler Research
Gaisler Research
Gaisler Research
Gaisler Research
Gaisler Research
Gaisler Research
Gaisler Research
Gaisler Research
European Space Agency
Gaisler Research
Gaisler Research
Gaisler Research
Gaisler Research
Gaisler Research
Gaisler Research
Gaisler Research
Gaisler Research
Gaisler Research
Gaisler Research
Use command ’info sys’ to print a detailed report of attached cores
grlib>
3.5. GRMON
27
Los parámetros de entradas son los siguientes:
-freq: Establece la frecuencia del sistema, anulando la frecuencia detectada. El valor establecido se encuentra en MHz.
-xilusb: Indica que la interfaz de comunicación será USB.
-u: loopback on: Por defecto, la entrada y salida estándar de las aplicaciones que corren sobre el LEON3, está direccionada al puerto UART del kit
de desarrollo. Con la opción -u, se redirecciona la entrada y salida estándar
al teclado y a la pantalla respectivamente.
Para correr la aplicación Hello World!, compilado en apartados anteriores,
debe cargarse en memoria primero con el comando load:
grlib> load hello_world
section: .text at 0x40000000, size 21728 bytes
section: .data at 0x400054e0, size 2912 bytes
total size: 24640 bytes (916.8 kbit/s)
read 162 symbols
entry point: 0x40000000
Y con el comando run se inicia la ejecución:
grlib> run
Hello World
Program exited normally.
Soporta básicamente, los mismo comandos que TSIM.
Por ejemplo, en la siguiente ejecución, se setea un breakpoint en main, se
inicia la ejecución, se visualiza el estado de los registros, y de la memoria:
grlib> break main
grlib> run
CPU 0 Breakpoint 1
grlib> reg
0:
1:
2:
3:
4:
5:
6:
7:
INS
00000000
400054CC
00000000
00000000
00000000
00000000
4FFFFF70
40001064
psr: F34000E6
main (0x400011a4)
LOCALS
40006000
400054F8
00000000
00000000
00000000
00000000
00000000
00000000
OUTS
00000000
00000000
00000000
00000000
00000000
00000000
4FFFFF10
400054BC
wim: 00000002
GLOBALS
00000000
FFFFFFFF
00000000
FFFFFFF8
40004400
40006014
400046AC
00000000
tbr: 40000000
y: 00000000
28
CAPÍTULO 3. BIBLIOTECA GRLIB
pc: 400011a4
npc: 400011a8
sethi %hi(0x40005400), %g1
or %g1, 0x90, %o0
grlib> mem 0x400011a4
400011A4
400011B4
400011C4
400011D4
03100015
82102000
01000000
96102000
90106090
b0100001
92100008
8213c000
40000028
81e80000
94102000
40000048
01000000
81c3e008
90102000
9e104000
......‘.@..(....
.. .............
.......... ... .
.. [email protected]..@.
grlib> cont
Hello World
Program exited normally.
grlib>
3.6.
Bootloader
En la Sección anterior, la aplicación Hello World! fue cargada directamente
en la memoria RAM del kit de desarrollo, utilizando GRMON.
Con el comando run, la ejecución comenzó directamente desde la dirección
de memoria 0x40000000 (dirección de comienzo de la memoria RAM). Cuando el
procesador arranca, lo hace a partir de la dirección 0x0, por lo que, si reiniciamos
el procesador no volveremos a tener un Hello World!, además que no estarı́a más
en memoria.
Para crear un sistema autónomo, es decir, que cada vez que el procesador
arranque, comience la ejecución de una aplicación necesitamos un bootloader.
MKPROM [MKPROM2010] es una herramienta provista por Gaisler, para
crear bootloaders de programa compilados con BCC.
Las imágenes creadas con MKPROM son escrita en memoria ROM a partir
de la dirección 0x0 y cuando el sistema es iniciado, se realizan los siguientes
tareas:
Se inicializan todos los registros de la IU y FPU (si está presente).
El controlador de memoria, UART y timers son iniciados de acuerdo a
opciones especı́ficas.
La aplicación se descomprime en RAM.
Finalmente, se inicia la ejecución de la aplicación.
MKPROM2 también se obtiene desde el sitio de Gaisler (http://gaisler.
com/index.php/downloads/debug-tools?task=view&id=190).
Una imagen de ROM del Hello World! compilado secciones anteriores, para
un sistema tı́pico se genera de la siguiente forma:
$ mkprom2.exe -v -rmw -ramsize 1024 hello_world
3.6. BOOTLOADER
29
El archivo generado, por defecto llamado prom.out también puede simularse
en TSIM:
$ tsim-leon3.exe prom.out
This TSIM evaluation version will expire January 1, 2013
TSIM/LEON3 SPARC simulator, version 2.0.21 (evaluation version)
Copyright (C) 2001, Gaisler Research - all rights reserved.
This software may only be used with a valid license.
For latest updates, go to http://www.gaisler.com/
Comments or bug-reports to [email protected]
serial port A on stdin/stdout
allocated 4096 K RAM memory, in 1 bank(s)
allocated 32 M SDRAM memory, in 1 bank
allocated 2048 K ROM memory
icache: 1 * 4 kbytes, 16 bytes/line (4 kbytes total)
dcache: 1 * 4 kbytes, 16 bytes/line (4 kbytes total)
section: .text, addr: 0x0, size 18432 bytes
read 136 symbols
tsim>
Se inicia la ejecución con el comando run
tsim> run
MkProm2 boot loader v2.0
Copyright Gaisler Research - all rights reserved
system clock
baud rate
prom
sram
:
:
:
:
50.0 MHz
19171 baud
512 K, (2/2) ws (r/w)
1024 K, 1 bank(s), 0/0 ws (r/w)
decompressing .text to 0x40000000
decompressing .data to 0x400054e0
starting hello_world
Hello World
Program exited normally.
Utilizando GRMON, se puede escribir la imagen prom.out en memoria ROM
del kit de desarrollo, para que la aplicación sea ejecutada cada vez que el sistema
es iniciado, prescindiendo de GRMON y creando un sistema autónomo.
30
CAPÍTULO 3. BIBLIOTECA GRLIB
La generación de la imagen para la placa XUPV5-LX110T ML-509 necesita
parámetros de configuración especı́ficos dependiente del hardware:
$ mkprom2.exe hello_world -freq 80 -baud 38400 -ddrram 256 -nosram
-ddrfreq 190 -ddrcol 1024 -romws 15 -romwidth 64 -msoft-float
Para escribir la memoria ROM, se inicia GRMON:
$ grmon-eval.exe -xilusb -freq 80 -u
Se desbloquea la escritura a la memoria Flash (memoria PROM) y se borra
todo el contenido:
grlib> flash unlock all
grlib> flash erase all
Erase in progress
Block @ 0x00000000 : code
Block @ 0x00020000 : code
Block @ 0x00040000 : code
...
Block @ 0x01fe8000 : code
Block @ 0x01ff0000 : code
Block @ 0x01ff8000 : code
Erase complete
= 0x80
= 0x80
= 0x80
OK
OK
OK
= 0x80
= 0x80
= 0x80
OK
OK
OK
Se carga la imagen de ROM y se verifica que esté correcto:
grlib> flash load prom.out
section: .text at 0x0, size 18336 bytes
total size: 18336 bytes (294.5 kbit/s)
read 136 symbols
entry point: 0x00000000
grlib> verify prom.out
section: .text at 0x0, size 18336 bytes
total size: 18336 bytes (83.8 kbit/s)
entry point: 0x00000000
grlib>
Finalmente se bloquea nuevamente la memoria Flash:
grlib> flash lock all
Para verificar que la aplicación funciona de manera correcta, se puede conectar un cable NULL MODEM entre el UART del kit de desarrollo y una
PC.
Usando una terminal, al iniciar la placa (sin GRMON) obtenemos:
3.7. SISTEMAS OPERATIVOS
3.7.
31
Sistemas Operativos
Un amplio rango de los sistemas operativos más populares, traen soporte
para el procesador LEON3. Desde un simple administrador de tareas hasta
sistemas operativos de tiempo real (RTOS Real-Time Operating System) pueden
ser instalado en un sistema embebido basado en el procesador LEON. Las lista
completa se encuentra en [LEONOS], pero podemos nombrar a los siguientes
SO:
VxWORKS (http://www.windriver.com/products/vxworks/).
RTEMS (http://www.rtems.org/).
eCos (http://ecos.sourceware.org/).
Linux SnapGear (http://www.gaisler.com/index.php/products/operating-systems/
linux?task=view&id=63).
32
CAPÍTULO 3. BIBLIOTECA GRLIB
Capı́tulo 4
Inyección de fallas
Tal como lo vimos en la historia del Telstar (Sección 1.1), en diseños digitales
para aplicaciones crı́ticas, el cambio de estado de un dispositivo microelectrónico
tales como un microprocesador, memoria o transitor, provocado por radiación
o interferencia electromagnética puede producir un efecto adverso. De modo
que es deseable la capacidad de comparar la inmunidad de distintas soluciones
propuesta a éstos tipos de fallos.
Muchas de las aproximaciones para medir la confiabilidad de un sistema
tolerante a fallos están basadas en el modelo evaluación bit flip [G-MAT2008],
que implica invertir el valor de distintos bits de memoria de manera controlada,
es decir, eligiendo la localidad y el instante.
Además, y en complemento a otras aproximaciones, tales como los métodos
analı́ticos, donde la aplicación y la precisión están significantemente restringido
en el caso de sistemas complejos, la inyección de fallas ha sido particularmente
atractiva y valiosa. La inyección de fallas proporciona un método para evaluar la
confiabilidad de un sistema [SFIT2004]. Consiste en generar fallas en distintas
zonas de un sistema y observar su reacción.
Muchos métodos han sido desarrollados hasta el momento, cada uno se diferencia del mecanismo utilizado, el área de cobertura y cuan intrusivo es implementarlo en el sistema.
Este Capı́tulo, presenta primero el concepto de confiabilidad y sistemas tolerantes a fallos. Luego, define inyección de fallas y muestra algunos trabajos
previos.
4.1.
Tolerancia a fallos y confiabilidad
Un circuito es tolerante a fallos, si puede continuar realizando sus funciones
en presencia de errores [Jhon89]. Es decir, la calidad del servicio prestado por
el circuito, no disminuye cuando el sistema se ve afectado por algún fallo. Esta
propiedad, denominada confiabilidad, es el objetivo principal que debe cumplir
un sistema tolerante a fallos para aplicaciones crı́ticas.
La confiabilidad de un sistema se mide de acuerdo a los siguientes parámetros
[Portela2007]:
Fiabilidad: Cuantifica la continuidad del servicio prestado. Es decir, mide
la duración de los periodos donde el sistema funciona correctamente.
33
34
CAPÍTULO 4. INYECCIÓN DE FALLAS
Disponibilidad: Es la capacidad del sistema de estar preparado para ejecutar una función en un instante dado. Está relacionada con la velocidad
de recuperación ante una falla.
Seguridad: Un sistema es seguro si ante una falla no existe la posibilidad
de dañar a otro sistema o componente.
Capacidad de ejecución: Mide la cantidad de funciones de un sistema que
están activas en un periodo de tiempo. Se utiliza cuando un fallo no interrumpe el funcionamiento total del sistema, sino que disminuye su capacidad.
Mantenibilidad: Indica cuan fácil es reparar un sistema dañado.
Testeabilidad: Indica la capacidad del sistema para comprobar el estado
de sus componentes y la calidad de sus funciones.
4.2.
Falla, error y defecto
Un sistema no siempre realiza la función para el cual fue diseñado. Las
causas y consecuencias de la desviación de la ejecución esperada de un sistema
se llaman factores de confiabilidad [SFIT2004].
Un fallo en un circuito indica un defecto fı́sico o imperfección en algún componente hardware o software del circuito, como por ejemplo lo puede ser un
cortocuito o un defecto en un dispositivo semiconductor. La manifestación de
un fallo se denomina error. Ası́, en el caso del cortocicuito puede ocurrir que
una lı́nea del circuito quede fijada a un valor de tensión. A su vez, un error
puede provocar un funcionamiento deficiente del circuito denominado defecto.
4.2.1.
Tipos de fallas
Las fallas de hardware que ocurren durante la operación de un sistema pueden ser clasificadas según su duración, en: permanentes, transitorias e intermitentes [SFIT2004]:
Falla permanente: Falla provocada por un daño irreversible de un componente. Por ejemplo, juntura PNPN de un semiconductor causado por
envejecimiento, temperatura o defecto de fabricación.
Falla transitoria: Generada por una condición ambiental tal como una fluctuación en una lı́nea de tensión, interferencia electromagnética o radiación.
Este tipo de falla raramente daña al componente afectado, aunque si puede inducir el sistema a un estado erróneo. Más conocida en la literatura
como Single Event Upset (SEU).
Falla intermitente: Es causada por hardware inestable que provoca la transición de estados del sistema de manera no deseada.
Las fallas del tipo permanentes y del tipo transitorias, pueden ser fácilmente
inyectadas en un dispositivo hardware. Existen herramientas de hardware dedicado, para invertir el valor lógico de un integrado, variar la tensión de los
conductores, o incluso bombardear el sistema con iones pesados (por ejemplo
4.3. EFECTOS DE LA RADIACIÓN CÓSMICA EN LA MICROELECTRÓNICA35
[LEON3FT]), con el fin de generar fallas lo mas cercano a la falla real en un
sistema en operación.
Una herramienta que está ganando popularidad es el injector de fallas de tipo
transitorias implementado en software. Cuyo objetivo, es alterar el valor lógico
de un conjunto de bits de memoria o registros del procesador, produciendo de
ésta manera, el mismo efecto que una falla de hardware transitoria.
Todas estas técnicas, requieren que se implemente un sistema, o al menos
un prototipo, con el fin de realizar el ensayo.
4.3.
Efectos de la radiación cósmica en la microelectrónica
Los factores ambientales, tales como la variación en la temperatura, fluctuaciones en la tensión de las lı́neas de alimentación, interferencias electromagnéticas, y en especial la radiación cósmica, pueden afectar al comportamiento normal
de un circuito de un sistema en operación [Portela2007].
El fuerte desarrollo de la tecnologı́a de los semiconductores, ha provocado
un aumento significativo de la sensibilidad a dichos factores. Se han reducido
las dimensiones de los transistores hasta escalas nanométricas, las tensiones de
alimentación han disminuido y las frecuencias de funcionamiento se han incrementado.
Estos avances implican una reducción de los niveles de ruidos aceptables,
que producen un aumento en la sensibilidad del sistema a fuentes de ruidos y
disminuye su confiabilidad.
Un caso especial de ruido, es la radiación cósmica, conformado por partı́culas
cargadas y ondas altamente energéticas que provienen del espacio.
Es una radiación ionizante, lo que significa que interacciona con la materia a
la que llega, con suficiente energı́a como para provocar la pérdida de electrones
en los átomos, ionizando las moléculas.
4.3.1.
Fuentes de radiación
En el espacio existen gran cantidad de partı́culas, entre ellas electrones,
protones e iones pesados, que son las principales responsables de la presencia de
radiación. Podemos agrupar las fuentes de radiación en 4 grupos [Rod2007]:
Cinturones de Van Allen.
Erupciones solares.
Vientos solares.
Rayos cósmicos.
Cinturones de Van Allen
Los cinturones de Van Allen, son ciertas zonas de la magnetósfera terrestre
donde se concentran las partı́culas cargadas. Fueron descubiertas por el Fı́sico estadounidense James Alfred Van Allen (1914-2006), a través del satélite
Explorer 1 (Sección 1.1).
36
CAPÍTULO 4. INYECCIÓN DE FALLAS
Hay dos cinturones de Van Allen:
Cinturón Inferior: Se extiende desde los 1.000 km por encima de la superficie terrestre, hasta más allá de los 5.000 km. Los satélites de órbita
baja LEO1 , deben elegir cuidadosamente sus órbitas para no estár demasiado expuesto a la radiación.
Cinturón Superior: Se extiende desde los 15.000 km por encima de la
superficie terrestre hasta los 20.000 km.
Erupciones solares
Las erupciones solares son grandes explosiones que se producen en la atmósfera del Sol. Debido a éstas explosiones, se aceleran los protones, electrones e iones
pesados a velocidades cercanas a la velocidad de la luz. Esta radiación que genera podrı́a llegar a la Tierra, afectando a cualquier satélite artificial o nave
espacial. También es dañina para la salud humana.
Toda la información actualizada sobre la actividad solar puede encontrarse en la página web de la NASA http://www.nasa.gov/mission_pages/sdo/
news/solar-activity.html, en particular, la erupción solar del 22 de Octubre del 2012 que afectó a los dispositivos electrónicos (http://www.nasa.gov/
mission_pages/sunearth/news/News102312-xflare.html).
Vientos solares
El viento solar es una corriente de partı́culas cargadas expulsada de la
atmósfera superior del Sol. Este viento consiste principalmente de electrones
y protones. La temperatura y velocidad del flujo de partı́culas varı́a con el tiempo. Estas partı́culas pueden escapar de la gravedad del Sol debido a su alta
energı́a cinética y alta temperatura de la corona. Alcanzan una velocidad entre
300 y 900 km/s.
Rayos cósmicos
Consisten en partı́culas subatómicas aceleradas como protones, electrones e
iones pesados. Podrı́an ser, por ejemplo, generadas gracias a la explosión de una
supernova por erupciones solares.
Los rayos cósmicos están compuesto en su mayor parte por protones (83%).
Cuando un rayo cósmico llega a la atmósfera se lo denomina rayo primario. A
la superficie terrestre llegará la radiación de una forma más atenuada, producto
del paso por la atmósfera. Al llegar a la superficie terrestre, se lo llaman rayos
secundarios.
4.4.
Mecanismos de inyección de fallas
La inyección de fallas es definido por Arlat [ARLAT] como la técnica de
validación de la confiabilidad de un sistema tolerante a fallas, que consiste en
1 http://en.wikipedia.org/wiki/Low_Earth_orbit
4.5. TRABAJOS ANTERIORES
37
el cumplimiento de experimentos controlados donde la observación del comportamiento del sistema en presencia de fallas es inducida explı́citamente por la
inyección de fallas en el sistema.
Las técnicas de inyección de fallas han sido reconocidas por mucho tiempo como necesarias para validar la confiabilidad de un sistema, analizando el
comportamiento de los dispositivos cuando una falla ocurre.
A lo largo de los últimos años, se han implementado distintas técnicas para la
inyección de fallas en un prototipo de sistema o modelo [Portela2007][SFIT2004].
Muchas de esas técnicas pueden agruparse en una de las siguientes categorı́as:
Basadas en hardware: Es realizado a nivel fı́sico, perturbando el hardware con parámetros ambientales (radiación de iones pesados, interferencia
electromagnética), alteración de la tensión en las lı́neas o modificación de
los valores de la entradas y salidas del circuito.
Basadas en software: El objetivo de éste técnica consiste en reproducir a nivel de software, fallas que podrı́an ser generados por fallas en el hardware,
por ejemplo, alteración de valores de memoria, de registro del procesador,
etc.
Basadas en simulación: Consiste en la inyección de fallas en modelos de
alto nivel (a menudo, modelos VHDL). Permite evaluar de manera temprana la confiabilidad de un sistema, únicamente cuando un modelo del
sistema está disponible.
Basadas en emulación: Esta técnica ha sido presentada como una solución
alternativa para reducir el tiempo durante etapas de inyección de fallas en
simulaciones. Consiste en la implementación del circuito lógico bajo ensayo
en FPGA, para conseguir ası́ mayor velocidad en fases de depuración.
Modelos hı́bridos: Esta aproximación utiliza un método de inyección basado en software y la monitorización se realiza mediante hardware.
4.5.
Trabajos anteriores
Este trabajo presenta un mecanismo de inyección de fallas del tipo de software, es decir, el objetivo es generar fallas en el sistema que se asemeje a la
naturaleza de las fallas producidas por causas de hardware. Por lo tanto, la recopilación de métodos y herramientas presentadas en esta Sección, pertenecen
a ésta categorı́a.
Debido a la diversidad de trabajos diseñados a lo largo de las últimas décadas, los cientı́ficos han categorizado los métodos utilizados, en dos grupos, dependiendo del instante en el que la falla es inyectada: tiempo de compilación o
tiempo de ejecución.
Inyección en tiempo de compilación
El código fuente del programa es alterado en tiempo de compilación, generando una imagen de programa errónea. De esta manera, el programa causa (o
no) una falla en tiempo de ejecución. Este método inyecta fallas en código fuente
38
CAPÍTULO 4. INYECCIÓN DE FALLAS
del programa, a diferencia de otros métodos que inyectan fallas en el sistema
(memoria, registros de CPU, bus).
Un método es el mutation testing2 , que reemplaza lı́neas de códigos por otras
que contienen errores.
Por ejemplo:
La lı́nea
a = a + 1;
cambia a
a = a - 1;
Es una técnica simple, pero poco práctica, ya que en cada ensayo distinto,
se requiere compilar nuevamente el código.
Inyección en tiempo de ejecución
La falla es inyectada dinámicamente durante la ejecución del sistema. Se requiere un mecanismo de disparo de la falla. Los mecanismos usados más comunes
incluyen:
Time-out: Es la técnica más simple. Cuando un temporizador expira a un
tiempo predeterminado, dispara la falla. Generalmente, la expiración de un
temporizador genera una interrupción, que es aprovechada para ejecutar
el mecanismo de inyección de fallas.
Excepción: En este caso, una excepción de hardware o de software (trap)
transfiere el control al inyector de fallas. A diferencia de time-out, se pueden utilizar eventos para disparar la falla, por ejemplo, al intentar escribir
una posición de memoria, o al ejecutar una instrucción en particular.
Inserción de código: En ésta técnica, se agregan instrucciones al programa,
que permiten generar fallas bajo ciertas condiciones. A diferencia de los
métodos de tiempo de compilación, la inserción de código agrega instrucciones en vez de modificarlas.
Algunos trabajos previos
Los siguientes trabajos han sido desarrollados por distintas Universidades
utilizando los métdos descriptos en la Sección anterior. Se describe principalmente los métodos utilizados y el área de acción sobre el sistema.
FERRARI (Fault and Error Automatic Real-Time Injection) Desarrollado
en la Universidad de Texas. Utiliza traps para inyectar fallas en CPU,
memoria y fallas en el bus. Ferrari consiste de 4 módulos: un inicializador
y activador, información al usuario, inyector/colector de datos y analizador
[FERRARI].
2 http://en.wikipedia.org/wiki/Mutation_testing
4.5. TRABAJOS ANTERIORES
39
FTaPE (Fault Tolerance and Perfomance Evaluator) Desarrollado en la
Universidad de Illinois. Inyecta fallas en registros de CPU, memoria y
disco. La fallas son generadas desde los controladores de dispositivos del
sistema operativo, por lo tanto, no es necesario la modificación de código
de las aplicaciones, pero si el del sistema operativo [FTaPE].
DOCTOR (integrateD sOftware fault injeCTiOn enviRonment) Desarrollado en la Universidad de Michigan, permite inyección de fallas en CPU,
memoria y comunicaciones de red. Combina los métodos de time-out, trap
y modificación de código [DOCTOR].
40
CAPÍTULO 4. INYECCIÓN DE FALLAS
Capı́tulo 5
Diseño e implementación de
TRAFIC
La mayorı́a de los procesadores actuales implementan una caracterı́stica denominada On-Chip Debug (OCD) [OCD2003], que hace posible depurar en tiempo real el sistema implementado en el hardware. Este mecanismo, consta básicamente de un módulo conectado al bus principal del sistema, con una interfaz
externa que se comunica con un cliente remoto y que permite tomar control del
procesador desde una computadora host.
El procesador LEON3 también tiene soporte OCD brindado por el módulo
Debug Support Unit (DSU) y el cliente GRMON (Sección 3.5).
El procesador implementa un modo depuración, en el cual, se detiene la
ejecución de instrucciones y el sistema es controlado a través de GRMON. Al
regresar al modo normal la ejecución se reanuda a partir de la instrucción desde
donde se detuvo.
TRAFIC (TRansparent And non-intrusive Fault InjeCtor), aprovecha ésta
caracterı́stica del procesador y lo induce a modo depuración al momento de
inyectar la falla y lo regresa al modo normal cuando ya ha sido inyectada para
no alterar el flujo de ejecución del programa, logrando ası́ un mecanismo no
intrusivo.
5.1.
Debug Support Unit
Para simplificar la tarea de depuración en tiempo real del SoC ya implementado en el hardware, el procesador LEON3 implementa un modo depuración,
durante el cual, el pipeline1 detiene la ejecución de instrucciones y el procesador
es controlado por el DSU y el cliente remoto GRMON (Sección 3.5), permitiendo:
Leer y escribir la memoria, los registros del procesador y de cada componente conectado al bus.
Desensamblar código.
1 Wikipedia:
http://en.wikipedia.org/wiki/Classic_RISC_pipeline
41
42
CAPÍTULO 5. DISEÑO E IMPLEMENTACIÓN DE TRAFIC
Cargar y ejecutar aplicaciones.
Colocar breakpoints.
Trazar la ejecución de un programa.
Crear un perfil (profiling) de la aplicación.
Cuando el procesador sale del modo depuración y entra al modo normal, se
reanuda la ejecución de instrucciones desde donde se detuvo.
El DSU está conectado al bus AMBA AHB y comunica con el cliente remoto
GRMON mediante una interfaz externa, entre las que se encuentran: UART,
JTAG, PCI, USB o Ethernet.
Figura 5.1: Debug Support Unit. El módulo DSU está conectado al bus AMBA AHB y también se comunica con la interfaz de depuración del procesador. El
recuadro con lı́nea punteada de la imagen señala las distintas interfaces externas
con la que el DSU se comunica con el cliente remoto GRMON.
5.1.1.
Operación
A través del DSU, cualquier módulo AHB Maestro (Sección 3.3) puede acceder a los registros del procesador y a los de cada módulo conectado al bus.
Los registros del DSU pueden accederse en cualquier momento, mientras que los
registros del procesador sólo pueden ser accedidos cuando el procesador está en
modo depuración.
El procesador entra en modo depuración cuando sucede algunos de los siguientes eventos:
La ejecución de un breakpoint ó watchpoint.
Flanco ascendente de la señal externa break del DSU.
5.2. MEMORIA
43
Escribiendo un 1 en el bit BN (break now) del registro de control del DSU.
La ejecución de una trap que causa al procesador entrar en modo de error.
Ocurrencia de alguna trap definida en el registro de control del DSU.
El DSU debe estar activado (señal externa dsuen = 1) cuando el procesador
entra en modo depuración. Cuando cambia de modo, se realizan las siguientes
acciones:
Los registros PC y nPC son almacenado en registros temporales.
La lı́nea externa active pasa a nivel alto para indicar el nuevo modo.
Opcionalmente, se detienen los timers y el watchdog.
La instrucción que causa al procesador entrar en modo depuración no es
ejecutada y el estado del procesador se mantiene sin modificaciones.
El modo normal se reanuda escribiendo un 0 en el bit BN (break now) del
registro de control del DSU o deshabilitando el DSU (lı́nea dsuen = 0).
El manual del módulo DSU se encuentra en [GRLIBIP2012, Chp. 27].
5.2.
Memoria
Por defecto, el SoC implementa un controlador para acceder a la memoria
RAM fı́sica del kit de desarrollo, una DDR2 de 256 Mbyte2 . La interfaz del controlador [GRLIBIP2012, Chp. 24] es compleja, y no aporta mucha significancia
en éste trabajo utilizar éste tipo de memoria, por lo que se decidió reemplazarla
por una con interfaz más simple: una memoria RAM de dos puertos.
Estas memorias son especialmente útiles como buffer entre la comunicación
del procesador con un dispositivo externo.
Se utilizó la AHBDPRAM (Dual-port RAM with AHB interface) de 32 bits
de Gaisler, incluı́da en la biblioteca GRLIB [GRLIBIP2012, Chp. 8].
La memoria tiene un puerto con interfaz AMBA AHB, que se comunica con
el procesador y un puerto denominado backend para aplicaciones de usuarios.
El tamaño de la memoria es configurable a través de parámetros de VHDL (es
decir, generics). Dependiendo de la tecnologı́a de la FPGA, el tamaño mı́nimo
es 1KB y el máximo es 2048KB.
Los accesos de lectura requieren 0-waitstate3 , mientras que los de escritura
1-waitstate.
El puerto backend consiste de las siguientes señales:
Señal
CLKDP
ADDRESS[abits-1:0]
DATAIN[31:0]
DATAOUT
ENABLE
WRITE[0:3]
E/S
Entrada
Entrada
Entrada
Salida
Entrada
Entrada
Función
Entrada de reloj del puerto backend
Bus de direcciones.
Bus de escritura
Bus de lectura
Habilitar puerto backend
Seleccionar el byte de escritura cuando
bytewrite = 1 (Activo por alto)
2 http://www.xilinx.com/univ/xupv5-lx110t.htm
3 Wikipedia:
http://en.wikipedia.org/wiki/Wait_state
44
CAPÍTULO 5. DISEÑO E IMPLEMENTACIÓN DE TRAFIC
Todas éstas señales son muestradas en el flanco ascendente del pulso de reloj
(lı́nea CLKDP), implementando ası́ una RAM sincrónica.
La memoria no implementa ningún tipo de mecanismo de protección contra
inconsistencia de datos en el caso de una lectura y escritura simultánea realizada
por ambos puertos a la vez. El usuario debe controlar la sincronización de los
accesos.
La hoja de datos de AHBDPRAM se encuentra en [GRLIBIP2012, Chp. 8].
Figura 5.2: Memoria AHBDPRAM. La figura muestra las interfaces de los
dos puntos de accesos.
5.2.1.
Implementación de AHBDPRAM en el SoC
La memoria actúa como un dispositivo esclavo (Sección 3.3) del bus AMBA
AHB y se conecta tal como lo muestra la Fig. 5.3.
Se instancia en el archivo leon3mp.vhd dentro del directorio grlib-gpl-1.1.0b4113/designs/leon3-xilinx-ml509.
Para conectar la AHBDPRAM es necesario agregar las siguientes librerı́as:
library grlib;
use grlib.amba.all;
library gaisler;
use gaisler.misc.all;
En el archivo leon3mp.vhd agregamos el siguiente código:
ahbdpram : ahbdpram
generic map (
hindex => AHBDPRAM_INDEX,
haddr => 16#400#,
tech => CFG_MEMTECH,
5.2. MEMORIA
45
Figura 5.3: Conexión de la memoria AHBDPRAM. La memoria se conecta
al bus AMBA AHB como un dispositivo esclavo.
abits => AHBDPRAM_ABITS,
bytewrite => 0)
port map (
rst => rstn,
clk => clkm,
ahbsi => ahbsi,
ahbso => ahbso(AHBDPRAM_INDEX),
clkdp => clkm,
address => dpram_address,
datain => dpram_datain,
dataout => dpram_dataout,
enable => dpram_enable,
write => dpram_write
);
donde:
hindex es el ı́ndice del dispositivo dentro del bus AMBA.
haddr son los bits más significativo de la dirección de hardware de la
memoria (corresponde a la dirección 0x40000000 donde se asigna la sección
.text (código de programa) del ejecutable).
tech indica que tipo de tecnologı́a tiene la FPGA para implementar la
memoria.
abits es el ancho del bus de direcciones.
bytewrite es una opción que permite escrituras de un byte dentro del bus
de datos de 32 bits.
46
CAPÍTULO 5. DISEÑO E IMPLEMENTACIÓN DE TRAFIC
5.3.
Diseño de TRAFIC
TRAFIC es un inyector de fallas en memoria RAM basado en el modelo
bit-flip. Consideraremos que la acción de una falla es la corrupción de un dato
en memoria. Por lo tanto, el objetivo de TRAFIC es invertir el valor de una
selección de bits de una posición de memoria en un instante dado.
Una falla f se define como una 3-upla (a, m, t) donde a es una dirección de
memoria, m una máscara (indica con un 1 que bits de la dirección a invertirán
su valor al momento de la falla) y t es el en instante que debe generarse la falla.
Tal como lo muestra la Fig. 5.4, TRAFIC está implementado en los recursos
disponibles de la FPGA aunque no forma parte del SoC y se comunica con una
computadora host a través del puerto serie para recibir la lista de fallas.
Figura 5.4: Implementación de TRAFIC en la FPGA.
El funcionamiento básico de TRAFIC es el siguiente:
TRAFIC recibe una lista de fallas f desde la computadora host y las
almacena en un buffer interno. Sea n (n > 0) la longitud de la lista.
Para i = 0 a i = n − 1 sea fi = (ai , mi , ti ) la i-ésima falla de la lista f :
• Tomar la falla fi y contar ti flancos ascendentes de reloj desde que
arrancó el procesador o desde que se reanudó la ejecución.
• Al alcanzar la cuenta inducir al procesador a modo depuración.
• Con la ejecución de instrucciones detenida leer la posición de memoria
ai . Sea d el valor leı́do.
5.4. RECEPTOR DE FALLAS
47
• Aplicar la máscara mi y calcular el nuevo valor d0 = d XOR mi .
• Escribir el valor d0 en la posición ai .
• Restaurar el procesador a modo normal.
Fin.
TRAFIC internamente está compuesto por un receptor de fallas, un buffer
y el mecanismo de inyección de fallas propiamente dicho.
Figura 5.5: Interfaz TRAFIC y componentes. TRAFIC está compuesto por
un receptor de comandos, un buffer para el almacenamiento de entradas de la
forma (dirección, máscara y tiempo) y el mecanismo de inyección de fallas.
5.4.
Receptor de fallas
FaultReceiver es el módulo interno de TRAFIC encargado de recibir las fallas transmitidas desde la computadora host. Internamente está compuesto por
un receptor UART (extraı́do de [FPGAEX]), implementando un canal simplex
(solo lı́nea RX). Los parámetros baudrate y clock son configurables a través de
generics.
Las fallas se envı́an en tramas con orden big endian, es decir, los valores
están en orden natural dentro de los campos.
Existen dos tipos de tramas, las que contiene los datos de las fallas, denominadas fdframe y las que indican el fin de la transmisión, eotframe.
5.4.1.
Tramas tipo fdframe
Contienen los datos de las fallas. Tienen una longitud de 13 bytes y están
compuestas por un encabezado (1 byte) y los campos: address, mask y time (4
48
CAPÍTULO 5. DISEÑO E IMPLEMENTACIÓN DE TRAFIC
bytes cada uno).
El encabezado identifica el tipo de la trama, está definido en la constante
FDHEADER de la entidad FaultReceiver.
El campo address indica la posición de memoria donde insertar falla.
El campo mask indica que bits de la posición de memoria apuntada por
address intercambiarán su valor al momento de la falla. Un 1 en el n-ésimo
bit de la palabra mask, indica que el n-ésimo bit de la palabra de memoria
de la dirección address, intercambiará su valor al momento de la falla,
mientras que un 0 mantendrá el valor.
El campo time indica cuantos flancos ascendentes de reloj deben pasar
desde que el procesador arrancó o desde que se reanudó desde la última
falla, para insertar la nueva.
La Fig. 5.6 muestra el formato de un trama de tipo fdframe.
Figura 5.6: Formato de una trama de tipo fdframe.
5.4.2.
Tramas tipo eotframe
Las tramas de tipo EOT (End Of Transmission) tienen una longitud de 1
byte y están compuestas únicamente por el encabezado. Sirven para indicar el
fin de la transmisión de tramas del tipo fdframe.
El encabezado está definido en la constante EOTHEADER.
Figura 5.7: Formato de una trama de tipo eotframe.
Por defecto, el valor de la constante FHEADER tiene el valor 0x55 y la
constante EOTHEADER el valor 0xff.
5.5.
Buffer
Las fallas se almacenan en un buffer interno con entradas del tipo (address,
mask, time). La longitud del buffer es configurable y depende de la tecnologı́a y
capacidad de la FPGA. En este trabajo, el tamaño del buffer es de 500 entradas.
5.6.
Inyector de fallas
Una vez explicado el concepto de modo depuración del procesador LEON3,
el funcionamiento de las memorias dos puertos y los componentes internos de
5.6. INYECTOR DE FALLAS
49
TRAFIC: FaultReceiver y Buffer, podemos pasar a explicar el mecanismo de
inyección de fallas.
FaultInjector es el componente de TRAFIC de más alto nivel, encargado de
la inyección de falla. Está implementado como una máquina de estados finitos,
por lo tanto, vamos a explicar el funcionamiento en base a sus estados internos.
Figura 5.8: Máquina de estados interna de TRAFIC.
Recibir lista de fallas
Es el estado inicial de TRAFIC. FaultReceiver recibe la lista de fallas desde
la computadora host y la almacena en el buffer interno. Cuando se recibe la
trama de fin de transmisión, se pasa al siguiente estado.
En espera
Una vez recibidas las fallas y almacenadas en el buffer, el inyector espera a
que el procesador comience la ejecución.
50
CAPÍTULO 5. DISEÑO E IMPLEMENTACIÓN DE TRAFIC
La lı́nea de entrada START está conectada a la lı́nea active del DSU e indica
con un 0, que el procesador sale del modo depuración y entra en el modo normal,
e indica con un 1 cuando realiza la transición inversa.
Contando
TRAFIC está conectado a la misma fuente de reloj del procesador. Al comenzar la ejecución (transición de 1 a 0 de la lı́nea START), el inyector de fallas,
cuenta flancos ascendentes de pulsos de reloj. Cuando alcanza la cantidad de
pulsos definidos por la falla, el inyector induce al procesador a modo depuración.
Modo depuración
Uno de los eventos que induce al procesador a modo depuración, es un flanco
ascendente en la lı́nea external break del DSU (Sección 5.1.1). TRAFIC escribe
un 1 en la lı́nea external break del DSU a través de la lı́nea STOP e induce al
procesador a modo depuración para leer la memoria en el próximo estado.
Leer memoria
Con la ejecución de instrucciones detenida, TRAFIC accede a la memoria
RAM a través del puerto backend, para leer el contenido.
Aplicar máscara
Se aplica la máscara definida en la falla, sobre el valor de memoria leı́do,
para intercambiar el valor de los bits.
Escribir memoria
Se escribe en memoria el nuevo valor. Si quedan más fallas para inyectar, el
siguiente estado es en espera, sino, el TRAFIC pasa al estado final.
Fin
Es el estado final, luego de inyectar todas las fallas.
5.7.
5.7.1.
Conexión de TRAFIC al SoC
Memoria
Tal como vimos más arriba, la interfaz backend de la memoria dos puertos,
consta de los siguientes buses y lı́neas:
clkdp
address(31:0)
dataout(31:0)
datain(31:0)
5.7. CONEXIÓN DE TRAFIC AL SOC
51
enable
write(3:0)
Reloj
La memoria AHBDPRAM es una memoria sincrónica. Los señales son muestradas en el flanco ascendente del pulso de reloj clkdp. Por lo tanto, a ésta señal
está conectado a la fuente de reloj maestro del sistema, clkmst.
Buses address, dataout y datain
El bus de direcciones address de la memoria se conecta con el bus de salida
address de TRAFIC.
Para escribir un valor en memoria, se conecta el bus de salida dataout de
TRAFIC al bus de escritura datain de la memoria.
Para leer un valor de la memoria, el bus de datos de lectura dataout, se
conecta con el bus de entrada datain, de TRAFIC.
Linea enable
La lı́nea enable habilita la memoria. Funciona como lı́nea chip select4 cuando
se utilizan múltiples pastillas de memoria. En este trabajo se utiliza solamente
una pastilla, por lo tanto, ésta lı́nea está cableada al valor 1.
Bus write
La memoria tiene la opción bytewrite que cuando es habilitada
(bytewrite = 1), el bus datain se particiona en 4 canales de un byte cada uno,
que pueden ser escritos de manera independiente. write(0) controla la escritura
del byte datain[31:24], write(1) el byte datain[23:16] y ası́ siguiendo.
En este trabajo, se realizan únicamente escrituras de palabras de 32 bits,
por lo tanto, la opción bytewrite está deshabilitada. La linea write(0) controla
la escritura de la palabra de 32 bits y es conectada a la lı́nea active de TRAFIC
que indica que el valor del bus dataout está preparada para ser escrito en la
dirección apuntada por el valor del bus address.
5.7.2.
DSU
La interfaz del DSU posee la lı́nea de salida active que indica si el procesador
está en modo normal o en modo depuración, y la lı́nea de entrada break que al
escribir un 1, el procesador entra en modo depuración.
Estas lı́neas se conectan respectivamente a las lı́neas START y STOP de
TRAFIC. A través de ellas, el inyector de fallas, conoce cuando el procesador
comenzó la ejecución y también puede inducirlo en modo depuración.
5.7.3.
Reloj principal
El SoC incluye un generador de reloj (CLKGEN [GRLIBIP2012, Chp. 21])
que se encarga de distribuir el reloj maestro al procesador, al bus AMBA y a
cada dispositivo. TRAFIC aprovecha ésta fuente, para contar los pulsos de reloj
para inyectar la falla.
4 http://en.wikipedia.org/wiki/Chip_select
52
CAPÍTULO 5. DISEÑO E IMPLEMENTACIÓN DE TRAFIC
Figura 5.9: Conexión TRAFIC con la memoria AHBDPRAM.
Figura 5.10: Conexión TRAFIC con el DSU.
5.8.
Compilación
El proceso de sı́ntesis (Sección 3.4) comienza examinando qué librerı́as y
qué componentes de cada una, deben ser compilados y sintetizados junto al
SoC:
~/grlib-gpl-1.1.0-b4113/designs/leon3-xilinx-ml509/$ make ise
Scanning libraries
grlib: stdlib util sparc modgen amba
unisim: ise
dware: simprims
synplify: sim
techmap: gencomp inferred dware unisim maps
eth: comp core wrapper
opencores: occomp i2c spi ac97
gaisler: arith memctrl leon3 misc net uart sim jtag greth ddr i2c spi
esa: memoryctrl
cypress: ssram
hynix: ddr2
micron: sdram ddr
5.8. COMPILACIÓN
53
Figura 5.11: Conexión TRAFIC con la fuente de reloj del sistema.
work: debug
Por lo tanto, debemos indicarle a la herramienta de compilación, que agregue
a TRAFIC en el proceso.
La biblioteca GRLIB incluye una colección de IP cores agrupados por fabricante dentro del subdirectorio grlib-gpl-1.1.0-b4113/lib.
Por ejemplo, la versión b4113 contiene módulos de los siguientes fabricantes:
~/grlib-gpl-1.1.0-b4113/lib$ ls -1
contrib
cypress
esa
eth
fmf
gaisler
gleichmann
grlib
gsi
hynix
micron
openchip
opencores
praesum
spansion
spw
synplify
tech
techmap
work
libs.txt
54
CAPÍTULO 5. DISEÑO E IMPLEMENTACIÓN DE TRAFIC
Cada fabricante incluye sus propios IP cores, por ejemplo los siguientes componentes fueron creados por Gaisler:
~/grlib-gpl-1.1.0-b4113/lib/gaisler$ ls -1
ambatest
arith
ata
can
ddr
gr1553b
greth
i2c
jtag
leon3
leon3ft
memctrl
misc
net
pci
sim
spacewire
spi
uart
usb
dirs.txt
Por ejemplo, el IP core Serial Peripheral Interface (SPI) contiene los siguientes archivos:
~/grlib-gpl-1.1.0-b4113/lib/gaisler/spi$ ls -1
spi.vhd
spi2ahb.in
spi2ahb.in.h
spi2ahb.in.help
spi2ahb.in.vhd
spi2ahb.vhd
spi2ahb_apb.vhd
spi2ahbx.vhd
spi_flash.vhd
spictrl.in
spictrl.in.h
spictrl.in.help
spictrl.in.vhd
spictrl.vhd
spictrlx.vhd
spimctrl.in
spimctrl.in.h
spimctrl.in.help
spimctrl.in.vhd
spimctrl.vhd
vhdlsim.txt
5.9. CLIENTE COMPUTADORA HOST
55
vhdlsyn.txt
Las librerı́as que van a formar parte del proceso de compilación y sı́ntesis,
están declaradas en el archivo /lib/libs.txt.
Cada librerı́a contiene un subdirectorio por cada componente y un archivo
llamado dirs.txt que indica cuales de éstos deben ser incluı́dos en la compilación.
Como un mismo componente puede constar de distintos archivos (por ej:
código fuente, casos de pruebas, archivos de simulación), dentro de cada componente, el archivo vhdlsyn.txt que archivos debe compilarse.
Por lo tanto, se creó una nueva librerı́a llamada faultinjector y se la declaró en
el archivo /lib/libs.txt.
Dentro del directorio /lib/faultinjector se agregó el componente TRAFIC y
se lo declaró en el archivo /lib/faultinjector/dirs.txt.
Finalmente, dentro del directorio /lib/faultinjector/trafic/ se agregó el código
fuente de TRAFIC y se los declaró en el archivo vhdlsyn.txt
5.9.
Cliente computadora host
Para la transmisión de fallas desde la computadora host a TRAFIC, se desarrolló un cliente denominado TRAFIC Fault Transmitter (TFT). TFT toma una
lista de fallas definida en un archivo de texto plano y la transmite por el puerto
serie de la computadora host.
5.9.1.
TRAFIC Fault Transmitter
El software de transmisión de fallas TFT fue desarrollado en Python. Tiene
una lógica simple, ya que su función es básicamente leer un fichero de texto
plano y transmitirlo por UART.
Se decidió utilizar Python por la flexibilidad que brinda en el manejo de lista
y cadenas.
TFT toma los siguientes argumentos:
$./TFT <filename> [<port>] [<baudrate>]
filename: Nombre del archivo que contiene la lista de fallas.
port: (Opcional) Establece puerto de comunicación (Por defecto: COM1).
baudrate: (Opcional) Establece el baudrate de la comunicación (Por defecto: 9600).
5.9.2.
Transmisión
Para transmitir datos a través del puerto serie, se utilizó la librerı́a pySerial
[pySerial]. Esta librerı́a encapsula el acceso al puerto serie. Proporciona soporte
para Python corriendo en Windows y en Linux.
El uso de pySerial es muy sencillo. Por ejemplo, para abrir el puerto 0 a
9600 bps y enviar la cadena "hello" y luego recibir 10 bytes, se necesitan las
siguientes lı́neas:
56
CAPÍTULO 5. DISEÑO E IMPLEMENTACIÓN DE TRAFIC
user@pc $python
>>> ser = serial.Serial(’/dev/ttyS1’, 19200, timeout=1)
>>> ser.write("hello")
# Enviar ’hello’
>>> s = ser.read(10)
# Recibir hasta 10 bytes con timeoout = 10
>>> ser.close()
# Cerrar el puerto
5.9.3.
Formato del fichero
La lista de fallas está definida en un fichero de texto plano. El fichero contiene una lı́nea por cada falla. Cada lı́nea está compuesta por 3 columnas de
8 caracteres cada una, separadas por un espacio en blanco, y corresponden, en
base hexadecimal a los valores de dirección, máscara e instante de la falla.
Por ejemplo, un archivo con 2 fallas contiene las siguientes lı́neas:
40000000 00001000 00000002
40000004 00000100 00000003
La primera falla va a invertir el bit 13-ésimo (0x00001000) de la dirección de
memoria 0x40000000 luego de 2 ciclos de reloj de comenzar la ejecución. La segunda falla, corresponde al 9-ésimo bit (0x00000100) de la dirección 0x40000004
y va a suceder 3 pulsos de reloj luego de suceder la primera, es decir, 5 pulsos
luego de arrancar el procesador.
Capı́tulo 6
Conclusión
Este trabajo puede dividirse en dos etapas, una por cada objetivo planteado
al comienzo (Sección 1.7).
La primera etapa consta desde el inicio del trabajo hasta la implementación
del procesador LEON3 en el kit de desarrollo. Esto abarca: el estudio preliminar
de la biblioteca GRLIB, el estudio de la arquitectura SPARC v8, preparación del
entorno de desarrollo, instalación del toolchain, pruebas en simuladores, preparación del entorno de implementación en FPGA y finalmente la implementación
y test en FPGA.
La segunda etapa corresponde a un estudio de bajo nivel del código del procesador LEON3, estructura de archivos de compilación, implementación de la
memoria de dos puertos, extracción de módulos no utilizados, estudios referentes a los mecanismo de inyección de fallas y por último el diseño, desarrollo e
implementación del inyector de fallas.
6.1.
Primera etapa
El procesador LEON3 es quizás unos de los procesadores más populares
que existe hoy en dı́a en el mundo de los IP cores. Posee ciertas caracterı́sticas
que permiten ser el elegido entre otras opciones, para distintas aplicaciones,
que van desde reproductores MP3 hasta aplicaciones espaciales [LEONGRLIB]
[ExoMars]. Algunas de las cualidades del procesador son las siguientes:
Se distribuye con código abierto y licencia GNU/GPL (aunque también por
un bajo costo económico se puede obtener una licencia Comercial).
Se entrega junto a la biblioteca GRLIB incluyendo más de 45 componentes bien documentados listo para conectar al bus AMBA, que permiten dar
soluciones a prácticamente cualquier aplicación.
Incluye las herramientas de depuración y simulación (TSIM), el compilador
de plataforma cruzada (sparc-elf-gcc), un monitor en tiempo real para depuración del SoC implementado en el hardware (GRMON), un sistema operativo
Linux (Snapgear 2.6), soporte para los sistemas operativos más utilizados (Sección 3.7), entre otras aplicaciones.
Existe también un grupo soporte oficial libre1 mantenido por Jiri Gaisler,
para que la comunidad que trabaja con los productos de su empresa puedan
1 http://tech.groups.yahoo.com/group/leon_sparc/
57
58
CAPÍTULO 6. CONCLUSIÓN
consultar sus dudas, realizar sugerencias y compartir información.
Además, en comparación de las caracterı́stica técnicas con procesadores similares (Nios II, MicroBlaze, Xtensa XL, OpenRISC 1200), LEON3 posee ciertas
ventajas: mayor velocidad de reloj del sistema (llegando hasta los 400 MHz en
ASIC y a los 125 MHz en FPGA), cache configurable de tamaño hasta 256
kb (mientras que los demás procesadores 64 kb como máximo), FPU incluı́da,
pipeline de 7 etapas y cantidad de registros de usuarios configurables. Una publicación que compara los procesadores sintetizable de la actualidad se puede
encontrar en [SCPES2006].
La primera parte de este trabajo comenzó con el estudio y manejo del procesador y el tool-chain (compilador, simulador, depurador, etc). Luego continuó con el agregado de un IP core al sistema (memoria RAM de dos puertos),
lo que requirió un estudio del bus AMBA AHB para conocer como es el manejo
de señales de comunicación interna del sistema.
Finalizando con la extracción de módulos tales como el controlador de VGA,
PS/2, USB, Ethernet, etc para minimizar el diseño del DUT (Device under Test)
y poder enfocar en el núcleo del problema: la inyección de fallas.
Al finalizar la primera etapa, contaba con las aptitudes necesarias para el
diseño e implementación de un SoC basado en GRLIB para diversas aplicaciones.
Como fruto del desarrollo de este trabajo y quizás el más importante, puedo
agregar que fui contratado en una empresa local contratista de CONAE para
unirme al equipo de desarrollo de computadoras de alta confiabilidad basadas
en LEON3 para ser utilizada en la actividad aeroespacial.
6.2.
Segunda etapa
En la industria espacial, en la tecnologı́a militar, en equipamiento médicos y
en los demás sistemas crı́ticos, el principal requerimiento en el diseño de un producto, es la confiabilidad. Estos productos, están construidos con componentes
de distintos grados de calificación, por ejemplo: comercial, militar y espacial, y
son sometidos a mayores controles de calidad y test según su calificación, y por
supuesto, el costo económico de estos componentes es notablemente superior a
los componentes comerciales.
En algunos casos, la calidad de los componentes entre los distintos grados
de calificación es la misma, la diferencia recae sobre el proceso del control de
calidad de dichos productos.
Contar con un mecanismo de inyección de fallas, permite realizar una calificación propia de algunos componentes, tales como la FPGA, y de ésta manera
abaratar costos utilizando componentes comerciales severamente testeados mediante el inyector de fallas. Esta es la filosofı́a de los desarrolladores de CubeSats
[CubeSats].
El diseño del mecanismo de inyección de fallas demandó una aproximación
de más bajo nivel del procesador y más precisamente del bus AMBA. La implementación VHDL del inyector de falla no fué tarea fácil. Si bien, durante
la carrera en Lic. en Cs. de la Computación, en la materia Arquitectura de
Computadoras, se introduce el tema de programación VHDL e implementación
en FPGA, desarrollar un módulo que lea y escriba la memoria RAM de un sistema ya implementado y que interecepte lı́neas del procesador para inducirlo en
6.3. TRABAJOS FUTUROS
59
modo depuración o en modo normal, requirı́o un estudio más avanzado sobre el
tema.
6.3.
Trabajos Futuros
TRAFIC es el primer método de inyección de fallas basado en las caracterı́sticas de depuración del procesador. Esto, lo convierte en un trabajo original
y en una primera versión que puede ser continuada con el fin de agregarle más
caracterı́sticas.
Además, si el procesador está ganando popularidad y está siendo utilizado
en aplicaciones donde se requiere alta confiabilidad, la inyección de fallas tiene
un buen futuro.
Durante el desarrollo de este trabajo, encontré algunos puntos que podrı́an
agregarse a versiones futuras, que no fueron agregadas en esta versión porque
requiere de mucha investigación, tiempo y para no exceder los limites fijados
para ésta investigación y convertirlo en un ambicioso proyecto.
Uno de los puntos, es el área de cobertura del inyector de fallas. Como vimos, TRAFIC inyecta fallas solamente en memoria RAM. Cuando el procesador
entra en modo depuración, es posible leer y escribir los registros internos del procesador, de hecho, GRMON lo hace. Una próxima versión de TRAFIC podrı́a
agregar un nueva localidad para la falla: los registros internos del procesador,
logrando ası́ una cobertura más amplia de ataque.
Otra mejora propuesta, es el tipo de memoria. En éste trabajo se implementó una memoria de dos puertos. Por un puerto lee y escribe el procesador,
mientras que el otro puerto es aprovechado por el inyector de fallas para alterar
el valor de los bits de memoria. Quizás, es posible realizar de manera similar el
mismo enfoque pero sin utilizar éste tipo de memoria, interceptando los buses
de comunicación del procesador con la memoria y desde allı́ insertar la falla,
obteniendo de ésta manera un inyector más flexible.
Cabe aclarar, que éstas 2 mejoras son un agregado a las caracterı́sticas de
TRAFIC, se requiere estudiar y entender el funcionamiento interno de éste inyector para proceder a realizarle éstas mejoras.
60
CAPÍTULO 6. CONCLUSIÓN
Capı́tulo 7
Bibliografı́a
[LEONGRLIB ] LEON3/GRLIB SOC IP Library. Aeroflex Gaisler.
[GRLIB2012 ] GRLIB IP Library User’s Manual. Version 1.1.0 B4113. Aeroflex Gaisler.
2012
[GRLIBIP2012 ] GRLIB IP Core User’s Manual. Version 1.1.0 B4113. Aeroflex Gaisler.
2012
[LEONOS ] Operating Systems. Compilers and real-time operating systems for LEON
and ERC32. Aeroflex Gaisler.
[Sparc92 ] The SPARC Architecture Manual Version 8. Sparc International Inc,
1992.
[AMBA99 ] AMBA Specification (Rev 2.0). ARM. 1999
[BCC2011 ] BCC - Bare-C Cross-Compiler Users Manual.Version 1.0.36. Jiri Gaisler.
Aeroflex Gaisler. 2011.
[TSIM2011 ] TSIM2 Simulator User’s Manual.Version 2.0.21. Aeroflex Gaisler. 2011.
[GRMON2011 ] GRMON User’s Manual. Version 1.1.51. Aeroflex Gaisler. 2011.
[MKPROM2010 ] MKPROM2 User’s Manual. Version 2.0.25. Aeroflex Gaisler. 2010.
[SparcARM1995 ] SPARC Assembly Language Reference Manual. SunSoft. 1995.
[pySerial ] http://pyserial.sf.net/
[FITT97 ] Fault Injection Techniques and Tools. Mei-Chen Hsueh, Timothy K. Tsai,
Ravishankar K. Iyer. University of Illinois at Urbana Champaign. IEEE.
April 1997.
[FIRESoPC ] Fault Injection-based Reliabity Evaluation of SoPCs. M. Sonza Reorda,
L. Sterpone, M. Violante, M. Portela-Garcia, C. Lopez-Ongil, L. Entrena.
IEEE European Test Symposium 2006.
[SFIT2004 ] A Survey on Fault Injection Techniques. Haissam Ziade, Rafic Ayoubi,
Raoul Velazco. The International Arab Journal of Information Technology,
Vol. 1, No. 2. July 2004
61
62
CAPÍTULO 7. BIBLIOGRAFÍA
[LEON3FT ] LEON3-FT-RTAX SEU test results. Jiri Gaisler. Gaisler Research. December 2005.
[ARLAT ] Validation de la sûreté de Fonctionnement Par Injection de Fautes. Arlat
Jean. December 1990
[Portela2007 ] Técnicas de inyección de fallas basadas en FPGAs para la evaluación de
la tolerancia de fallos de tipo SEU en circuitos digitales. Marta Portela
Garcia. Tesis doctoral. Universidad Carlos III de Madrid. Leganés 2007.
[Rod2007 ] Diseño de un entorno de hardware para el testeo de chips sometidos a un
entorno de radiación nuclear. José Antonio Rodrı́guez. Septiembre 2007.
[SEUGL ] Single Event Upset at Ground Level. Eugene Normand. Boeing Defense
& Space Group.
[SCPES2006 ] Soft-Core Processor for Embedded Systems. Jason G. Tong, Ian D. L. Anderson and Mohammed A. S. Khalid. The 18th International Confernece
on Microelectronics (ICM) 2006.
[CubeSats ] Wikipedia: http://en.wikipedia.org/wiki/CubeSat
[SoftCores ] Soft CPU Cores for FPGA. Core Technologies.
[G-MAT2008 ] A Non-Invasive System for the Measurement of the Robustness of Microprocessortype Architectures Against Radiation-induced Soft Errors. H. GuzmánMiranda, M.A Aguirre, J. Tombs. Universidad de Sevilla. 2008.
[DOCTOR ] DOCTOR: An Integrated Software Fault Injection Environment. Han S.,
Rosenberg H., Shin K. Technical Report CSE-TR-192-93, University of
Michigan. 1993.
[FERRARI ] FERRARI: A Tool for the Validation of System Dependability Properties. Kanawati G. A., Kanawati N. A. Abraham J.A. Proceedings of 22th
Annual International Symposium Fault-Tolerant Computing. 1992.
[FTape ] An Approach to Benchmarking of Fault-Tolerant Commercial Systems.
Tsai T.K., Iyer R.K. Proceedings of 26th Annual International Symposium
Fault-Tolerant Computing. 1996.
[Mitr05 ] Robust System Design with Built-In Soft Error Resilience. S. Mitra, N.
Seifert, M. Zhang, Q. Shi, K. S. Kim. IEEE Computer, pp. 43-52. 2005.
[Mongollon2008 ] Técnicas para la simulación de los efectos de la radiación cósmica en un
dispositivo CMOS. Juan M. Mongollón Garcı́a. Trabajo Fin de Máster.
Noviembre 2008.
[SSFAIL2005 ] Space Systems Failures. Disasters and Rescues of Satellites, Rockets and
Space Probes. David M. Hardland. Ralph D. Lorenz. Springer. 2005.
[ExplorerI ] Explorer I. Jet Propulsion Laboratory. 2007.
[Telstar ] SatMagazine. Pages 43-45. http://www.satmagazine.com. May 2008.
[ExoMars ] ExoMars Vehicle. M. Roe. http://www.stfc.ac.uk/resources/pdf/
astriumpresentation.pdf. EADS astrium. Feb 2008.
63
[SoCDesign ] Core Based SOC Design. Prof. Anish Goel.
[FPGAEX ] FPGA Prototyping By VHDL Examples. PONG P. CHU. John Wiley
and Sons, Inc. 2008.
[VHDL2004 ] Circuit Design with VHDL. Volnei A. Pedroni. Massachusetts Institute
of Technology. 2004.
[Jhon89 ] Design and analysis of Fault-Tolerant Digital System. B. Johnson. AddisonWesley. 1989.
[OCD2003 ] Introduction to On-Chip Debug. Arnold Berger, Michael Barr. February
2003.
Descargar