Detector de la secuencia no solapada “1011” con reset asíncrono y latches D dinámicos. Diseño completo a nivel microelectrónico (full-custom) empleando la herramienta de diseño CADENCE.
Full-custom design. 1011 non-overlaping sequence detector with an asyncronous reset and dynamic D-latches using CADENCE tool
Detector de secuencia no solapada 1011 empleando PLA
1. Detector de Secuencia
Circuitos Microelectrónicos
Jesús Pardal Garcés
Marc Tena Gil
28/09/2010
Diseñar mediante CADENCE con tecnología CMOS de 0.35μm y pozo-n de
AMS las células básicas para el diseño de PLAs cuyos planos lógicos sean
pseudo-nMOS estáticos. La PLA adoptará un esquema de temporización
dinámico pseudo-2fases. Aplicarlo a un detector de la secuencia no
solapada “1011” con reset asíncrono y latches D dinámicos
3. Índice
1) Estudio teórico PLA: ...................................... 4
2) Metodología de diseño ................................. 8 3
3) Detector de secuencia .................................. 9
4) Etapa de entrada ........................................ 10
5) Etapa de salida ............................................ 18
6) Generador de reloj ..................................... 27
7) PLA .............................................................. 35
8) Estudio de potencia .................................... 42
9) Estudio de frecuencia ................................. 44
10)Bibliografía................................................. 47
4. 1) Estudio teórico PLA:
4
Figura 1.1: Estructura PLA
Comentar inicialmente, que en nuestro caso las 2 fases las vamos a usar
únicamente para el control de los latches de entrada salida, y no para
controlar la evaluación de los planos and y or, en los que se utiliza lógica
pseudo-nmos, por lo tanto no se emplean las fases de reloj para el
conexionado en cascada de varias etapas como en la lógica dominó o para
crear elementos de memoria (los Planos PLA son estáticos).
El estudio a realizar es estático ya que las redes AND y OR son puramente
combinacionales, y el reloj sólo nos controla la entrada y salida de datos
para poder generar la secuenciación y la máquina de estados.
La estructura PLA (Programmable Logic Array) se basa en dos matrices o
planos (AND y OR) programables, que busca la facilidad de
implementación y programación gracias a su estructura replicable, que
nos facilita un sencillo escalado, aumentando el número de variables a
5. tantas como nos sean necesarias (tanto en variables de entrada o
realimentaciones como en forma de términos suma).
En un circuito del tipo PLA se consigue un gran aprovechamiento de los
recursos disponibles, de tal forma que se genera el mínimo número de
términos necesarios para implementar una función lógica, usando alguno
de los productos programados para otra de las salidas o empleando
alguna entrada para funciones que tengan factores en común, reutilizando
así productos y aumentando la capacidad de integración en un mismo 5
circuito programable. Aunque por su contra debido a la estructura
replicable también se desaprovecha cierto espacio.
Hay que tener en cuenta a la hora de diseñar usando una PLA que al tener
un inversor en la etapa de salida (latch de salida) tendremos que reescribir
las funciones lógicas utilizando la ley de De Morgan como la función
negada a la deseada:
Se va a comentar un poco más sobre la lógica pseudo-nmos empleada en
la PLA.
Figura 1.2: Lógica pseudo-nmos
Para este tipo de lógica se tuiliza en la red de pull-up transistores tipo
pmos altamente resistivos con la base conectad a gnd.
6. La estructura general del detector de secuencia será, como se ha
comentado, con latches a la entrada y salida:
6
Figura 1.3: Esquema de bloques
Presentamos a continuación el camino que recorre una función lógica a
través de la estructura PLA, y un stick diagram del circuito completo a falta
del generador de reloj.
Figura 1.4: Camino de una variable en la PLA
8. 2) Metodología de diseño
Conforme se ha ido diseñando cada etapa por separado (latch entrada,
plano and, plano or, etcétera) se han realizado sobre papel muchos stick
diagrams para ubicar todo intentar y conseguir simetría en las células
individuales, que éstas a su vez tuvieran una simetría en las estructuras
globales de las que forman parte e intentar compactarlas todo lo que se
ha podido. También se ha intentado reducir al máximo el área ocupada 8
intentando aprovechar una misma difusión para varios transistores
(además la lógica pseudo-nmos emplea menos TRT que la CMOS,
reduciéndose el área necesaria). Asimismo cuando se han necesitado
transistores más anchos, se han colocado TRT más estrechos en paralelo
para conseguir ahorrar espacio.
Se ha intentado también situar de la mejor manera los puertos de acceso
para facilitar el diseño, aunque habría que ver si se tiene que integrar el
sistema diseñado en otros mayores, tanto para poder hacer una mejor
distribución de las señales como para estudiar dónde sería la mejor
ubicación de los puertos de entrada.
En particular, la estructura PLA lo que busca es facilidad de
implementación y programación gracias a su estructura replicable, que
nos facilita un sencillo escalado, aunque esto influye negativamente en la
minimización del espacio ocupado por la célula.
Finalmente comentar el estilo que se ha empleado:
Alimentación MET2
GND MET1, MET2 (compartida en el
plano AND)
Interconexiones verticales MET1 (Acceso a las puertas)
Interconexiones horizontales MET2
Se ha intentado trabajar siempre el metal1 y el polisilicio en la misma
dirección y las difusiones perpendiculares a éstos.
9. 3) Detector de secuencia
El circuito a diseñar ha de ser capaz de detectar la secuencia 1011 sin
solape a su entrada. Un diagrama de tiempos de la evolución de la entrada
en función del reloj se muestra en la figura 3.1,en la que se puede
observar que la señal que hay que analizar para detectar la secuencia
correcta está muestreada en el flanco de subida del reloj.
Notar que el circuito dispone de una entrada de reset asíncrono activo a
nivel alto.
9
Figura 3.2: Diagrama de burbujas de la máquina de estados
Qt Qt+1
E Q0 Q1 Q0 Q1 S
An Bn
0 0 0 0 0 0 R1
1 0 0 0 1 0 R2
0 0 1 1 0 0 R3
1 0 1 0 1 0 R4
0 1 0 0 0 0 R5
1 1 0 1 1 0 R6
0 1 1 1 0 0 R7
1 1 1 0 0 1 R8
Figura 3.3: Tabla de excitaciones
10. ECUACIONES DE DISEÑO
10
4) Etapa de entrada
La etapa de entrada consistirá en un latch controlado por la señal de reloj
y a continuación dos inversores para obtener la señal de entrada negada y
afirmada (estructura parecida a los pad cells de entrada de los circuitos
para “bufferear” las entradas).
El latch consistirá simplemente en un transistor cmos tipo n, ya que el
enunciado pide que los planos lógicos sean pseudo-nmos. En su base
conectaremos la señal de reloj, dependiendo si hay un cero o un uno en la
base, el transistor estará en corte (un cero) o activo (un uno) por lo que
impedirá o permitirá el paso de señal a su entrada.
Después de dicho latch colocaremos un inversor para obtener la señal de
entrada negada y a continuación de éste, otro inversor para obtener la
señal afirmada. Este procedimiento se utiliza para restaurar el nivel de
tensión ya que los latch están formados por transistores nmos y no
conducen bien los unos. También habría que tener en cuenta que en las
redes nmos de los planos AND-OR se obtiene un cero débil que proviene
del divisor resistivo formado por el pmos y los nmos de la función lógica.
11. En el circuito habrá tres entradas, una de ellas será por donde se
introducirá la secuencia serie a detectar y las otras son realimentación de
las salidas para así poder realizar la máquina de estados.
A continuación se presenta el esquemático de la célula de entrada básica:
11
Figura 4.1: Esquema eléctrico de una célula de entrada
Después de hacer el esquemático, se crea el símbolo. Estando en el
esquemático, buscar Desing/Create cellview /from cellview donde
aparecerá una subpantalla en la que hay que elegir la opción from
schematic → to symbol. A continuación aparece un esquemático por
defecto, éste se puede modificar gráficamente a placer.
Figura 4.2: Símbolo de una célula de entrada
12. Tras realizar el símbolo, hay que implementar el diseño del layout e
intentar optimizar al máximo (compartiendo y solapando contactos y
vias…) para que el diseño ocupe el mínimo espacio posible. El layout de
una entrada quedará:
12
Figura 4.3: Layout de una célula de entrada
Siguiendo los pasos,chequeamos el DRC (incluyendo la opción
no_coverage para evitar que aparezcan los mensajes de los porcentajes de
densidades) sin que de errores, se realiza la vista extraída del layout.
Buscar en Verify → Extract.
Para comprobar si el layout diseñado y el esquemático no tienen
diferencias entre ellos se va utilizar la herramienta LVS. En caso de
aparecer alguna discrepancia, se puede emplear la opción Error Display
para localizar qué es diferente en el diseño original y el propio en las vistas
schematic y extracted.
13. 13
Figura 4.4: Extracción del layout de una célula de entrada
Para finalizar se debe crear un testbench para poder simular las dos vistas,
la extraída y el esquemático original. El procedimiento a seguir es el
siguiente:
-Creamos un esquemático introduciendo el símbolo y conectando lo
que toca a cada entrada.
-Luego replicamos en el mismo esquemático el mismo circuito una
vista de tipo config empleando el Hierarchy Editor.
14. - Abrir la vista config y crear una nueva configuración (ventana New
Configuration) empleando la plantilla Spectre en la opción Use
Template.
- Abrir la vista en árbol desplegable. Si ahora se abre la rama de la
célula testbench, se puede ver la vista que se escogen por defecto
para cada una de las instancias del símbolo; por lo tanto basta con
escoger una de la instancia como extraída y la otra como
esquemático. 14
- Por último se salvará la vista config.
- Desde la vista config seleccionamos Analog Design Environment
para poder llevar a cabo la simulación con la configuración adecuada
de las células.
Figura 4.5: Testbench combinando la célula extraída y del
esquemático una célula de entrada
15. Después de realizar la simulación con los estímulos adecuados, teniendo
en cuenta que cuando el reloj esté a nivel alto no haya cambios en la señal
de entrada, y seleccionando en el Virtuoso Analog Environment los
puertos que se quiere que salgan en la simulación, aparece el siguiente
resultado:
15
Figura 4.6: Simulación la célula de entrada
Como puede observarse, mientras fi ( primera fase del reloj) está a nivel
alto se muestrean los datos de entrada, variando éstos mientras el reloj se
encuentra a nivel bajo.
17. De las simulaciones se puede sacar como conclusión que la célula extraída
es un poco más lenta que el esquemático original, esto es debido a todas
las capacidades y resistencias parásitas que hay en los componentes
reales.
También podemos observar que la transición de 0 a 1 es más lenta que la
de 1 a 0.
A continuación se replica la célula base tres veces, creando la célula final
17
de entrada en un nuevo layout.
Figura 4.9: Layout bloque de entrada
18. 5) Etapa de salida
La etapa de salida contará con un latch que dejará pasar o no la señal de
salida, seguido de un inversor.
El latch consistirá simplemente en un transistor cmos tipo n, ya que se
especifica que los planos lógicos deben de ser pseudo-nmos. En su base
conectaremos la señal de reloj, dependiendo si hay un cero o un uno en 18
ella, el transistor estará en corte (un cero) o activo (un uno) por lo que
impedirá o permitirá pasar la señal de salida. Es el mismo circuito que en
la entrada.
Estas dos señales de reloj son distintas y tiene que estar desfasadas y
nunca solaparse en el mismo nivel (alto o bajo), para que cuando f1 esté
activa, pase la señal de entrada y le dé tiempo a los planos AND y OR a
evaluar la señal y así tener a la salida la señal deseada. Luego éste será el
tiempo que tienen que estar desfasadas las señales f1 y f2 como mínimo
para que cuando f2 esté a nivel alto, tengamos a la salida el valor
adecuado (hablaremos más adelante en el apartado del reloj).
Después colocamos un inversor al igual que en la etapa de entrada,
además tendremos que tener cuidado en el diseño de la máquina de
estados debido a este inversor negará nuestra señal, obligándonos a
trabajar en productos de términos suma en vez de con sumas de términos
producto.
En nuestro circuito tendremos dos salidas que serán realimentadas hasta
las entradas, más otra que será nuestra salida real del circuito, la cual se
pondrá a nivel alto cuando se detecte la secuencia 1011 sin solape.
19. A continuación mostramos el esquemático de la célula de la etapa de
salida básica:
19
Figura 5.1: Esquema eléctrico célula individual de salida
Después de hacer el esquemático, se crea el símbolo. Estando en el
esquemático, buscar Desing/Create cellview /from cellview donde
aparecerá una subpantalla en la que hay que elegir la opción from
schematic → to symbol. A continuación aparece un esquemático por
defecto, éste se puede modificar gráficamente a placer.
Figura 5.2: Símbolo célula individual de salida
20. Después de realizar el símbolo, realizaremos el diseño del layout e
intentaremos optimizar al máximo(compartiendo y solapando contactos ,
vías…)para que ocupe el mínimo espacio posible.
Layout de una célula individual de salida:
20
Figura 5.3: Layout célula individual de salida
Ahora,tras realizar el layout y pasar el DRC (incluyendo la opción
no_coverage para evitar que aparezcan los mensajes de los porcentajes de
densidades) sin que de errores, se realiza la vista extraída del layout.
Buscar en Verify → Extract.
21. Para comprobar si el layout diseñado y el esquemático no tienen
diferencias entre ellos se va utilizar la herramienta LVS. En caso de
aparecer alguna discrepancia, se puede emplear la opción Error Display
para localizar qué es diferente en el diseño original y el propio en las vistas
schematic y extracted.
21
Figura 5.4: Extracción del layout célula individual de salida
22. Después de realizar la extracción debemos crear un testbench para poder
simular las dos vistas, la extraída y el esquemático original. El
procedimiento a seguir es el siguiente:
-Creamos un esquemático introduciendo el símbolo y conectando lo
que toca a cada entrada.
-Luego replicamos en el mismo esquemático el mismo circuito. 22
-Creamos una vista de tipo config empleando el Hierarchy Editor.
-Abrir la vista config y crear una nueva configuración (ventana New
Configuration) empleando la plantilla Spectre en la opción Use
Template.
-Abrir la vista en árbol desplegable. Si ahora se abre la rama de la
célula testbench, se puede ver la vista que se escogen por defecto
para cada una de las instancias del símbolo. Por lo tanto basta con
escoger una de la instancia como extraída y la otra como
esquemático.
-Por último se salvará la vista config.
Desde la vista config seleccionamos Analog Design Environment para
poder llevar a cabo la simulación con la configuración adecuada de las
células.
23. 23
Figura 5.5: Testbench combinado esquemático/extracción
Después de realizar la simulación con los estímulos adecuados, teniendo
en cuenta que cuando el reloj esté a uno no haya cambios en la señal de
entrada, y seleccionando en el Virtuoso Analog Environment las señales
que queremos que salga en la simulación obtenemos el siguiente
resultado:
24. Podemos ver como se muestrea el dato cuando fi cambia a nivel alto.
24
Figura 5.6: Resultado testbench
Figura 5.7: Muestreo de un nivel alto
25. 25
Figura 5.8: Muestreo de un nivel bajo
De las simulaciones sacamos una conclusión clara, que la célula extraída es
un poco más lenta que el esquemático original. Esto es debido a todas las
capacidades y resistencias parásitas que hay debido a los transistores,
cruces de metales… y que funciona como cabía esperar.
A continuación se han juntado todas las salidas en un mismo layout
replicando simplemente la célula base.
27. 6) Generador de reloj
El generador de reloj de un sistema digital es un bloque básico para su
buen funcionamiento, ya que de la estabilidad de la frecuencia de reloj
depende que el sistema funcione de forma fiable.
De todas las configuraciones posibles elegiremos la dinámica pseudo-2
fases ya que es la que nos indica el enunciado del trabajo.
Con esta configuración para realizar los relojes no sólo han de ser
27
lógicamente complementarios, sino que no han de solaparse, y con un
cierto margen de tolerancia. Esto quiere decir que durante el tiempo en
que la primera fase (fi1) está a nivel alto se leen los datos de la entrada y
se evalúan en los planos lógicos AND y OR.
El margen de tiempo del que dispone este bloque para el procesado de
los datos viene dado por el periodo de reloj, ya que no vuelve a capturar
nuevos datos hasta la siguiente fase activa de fi1. Sin embargo, la salida se
activa a nivel alto de la segunda fase (fi2), por lo tanto el cálculo de los
datos tiene que haber acabado antes que llegue éste para obtener unas
salidas correctas. Ello es debido a que unos relojes complementarios
ideales, aunque no se solaparan en absoluto, podrían verse afectados por
diferente retardo (clock skew), con lo que a la entrada de la puerta se
podrían solapar, cosa que provocaría que el dato de entrada empiece a
evaluarse y que el de salida sea realimentado antes de lo previsto,
llevando al caos al sistema. Resumiendo, la lógica combinacional que hay
entre el latch de entrada y el de salida tiene como mucho para evaluarse,
la diferencia entre fases del reloj, dando lugar a un periodo de reloj que
sea como mínimo el tiempo combinacional, junto con los tiempos de set-
up y las fases del reloj.
En un sistema mayor que el propuesto sería necesario hacer un estudio de
la técnica a seguir para distribuir la señal de reloj por el sistema, realizar
un buen árbol de distribución para minimizar el clock skew producido por
la diferencia de camino del reloj a las diferentes partes del C.I. Utilizar si
fuera necesario PLL, etc. No se va a profundizar más porque la magnitud
del proyecto tampoco lo requiere.
28. En la figura se muestra un generador de reloj no solapado y su salida
teórica:
28
Figura 6.1: Circuito generador de las 2 fases
Figura 6.2: Diagrama temporal de las fases
Figura 6.3: Esquema eléctrico del reloj 2 fases
29. Después de hacer el esquemático, se crea el símbolo. Estando en el
esquemático, buscar Desing/Create cellview /from cellview donde
aparecerá una subpantalla en la que hay que elegir la opción from
schematic → to symbol. A continuación aparece un esquemático por
defecto, éste se puede modificar gráficamente a placer.
29
Figura 6.4: Símbolo del reloj de dos fases
Tras realizar el símbolo, se pasa a diseñar el layout, optimizando como
siempre el máximo que podamos para que ocupe el mínimo espacio
posible.
30. El layout del generador de reloj quedará:
30
Figura 6.5: Layout del reloj
A continuación de realizar el layout y pasar el DRC (incluyendo la opción
no_coverage para evitar que aparezcan los mensajes de los porcentajes de
densidades) sin que de errores, se realiza la vista extraída del layout.
Buscar en Verify → Extract.
Para comprobar si el layout diseñado y el esquemático no tienen
diferencias entre ellos se va utilizar la herramienta LVS. En caso de
aparecer alguna discrepancia, se puede emplear la opción Error Display
para localizar qué es diferente en el diseño original y el propio en las vistas
chematic y extracted.
31. 31
Figura 6.6: Extracción del layout
Después de realizar la extracción debemos crear un testbench para poder
simular las dos vistas, la extraída y el esquemático original. El
procedimiento a seguir es el siguiente:
-Creamos un esquemático introduciendo el símbolo y conectando lo
que toca a cada entrada.
-Luego replicamos en el mismo esquemático el mismo circuito.
-Creamos una vista de tipo config empleando Hierarchy Editor.
-Abrir la vista config y crear una nueva configuración (ventana New
Configuration) empleando la plantilla Spectre en la opción Use
Template.
32. -Abrir la vista en árbol desplegable. Si ahora se abre la rama de la
célula testbench, se puede ver la vista que se escogen por defecto
para cada una de las instancias del símbolo. Por lo tanto basta con
escoger una de la instancia como extraída y la otra como
esquemático.
- Por último se salvará la vista config.
Desde la vista config seleccionamos Analog Design Environment para
32
poder llevar a cabo la simulación con la configuración adecuada de las
células.
Figura 6.7: Testbench combinado esquemático-extracción
33. Después de realizar la simulación con los estímulos adecuados, que
cuando el reloj esté a uno no haya cambios en la señal de entrada, y
seleccionando en el Virtuoso Analog Environment los puertos que
queremos que salga en nuestra simulación nos da lo siguiente:
33
Figura 6.8: Resultados testbench
De las simulaciones obtenidas sacamos otra vez la misma conclusión, la
célula extraída es un poco más lenta que el esquemático original, esto es
debido a todas las capacidades y resistencias parásitas que aparecen.
Como se ve observando la figura anterior y las dos siguientes no existe
solape entre fi1 y f2 por lo tanto funciona como queríamos.
34. 34
Figura 6.9: Detalle 1 de simulación de reloj
Figura 6.10: Detalle 2 de simulación de reloj
35. 7) PLA
A continuación presentaremos diferentes capturas de la PLA, las cuales
prescindirán de explicaciones debido a la repetitividad del proceso.
35
Figura 7.1: Esquema eléctrico de la PLA
36. 36
Figura 7.2: Detalle plano AND
Figura 7.3: Fichero estímulos de entrada
37. 37
Figura 7.4: Detalle plano OR
**Comentar que ha sido posible simplificar algunas de las ecuaciones de diseño,
simplificando el plano OR, con su consecuente ahorro de espacio y consumo.
Figura 7.5: Símbolo de la PLA
38. Presentamos finalmente el testbench definitivo en el que se han juntado
el generador de las dos fases y la PLA, tanto los esquemáticos como las
versiones extraídas de los layouts.
38
Figura 7.6: Testbench final
39. 39
Figura 7.7: Layout PLA
La suma de las áreas del layout de la PLA y del generador de las dos fases
del reloj nos da como resultado:
Área = 41 x 32,1 + 16,75 x 14,4
= 1557,3 µm2
42. 8) Estudio de potencia
Para hacer el estudio de potencia incluimos un amperímetro de corriente
(iprobe) en nuestro diseño que colocaremos en la fuente de alimentación
para ver qué corriente está suministrando al sistema y colocaremos el
reloj a la máxima frecuencia de funcionamiento.
Se crea un nuevo testbench para nuestro sistema y en la alimentación
conectamos dicho amperímetro. A la hora de realizar la simulación lo que 42
nos interesa son las corrientes que pasan por dicho medidor, por eso
seleccionaremos los nodos de corriente como salidas a visualizar en la
simulación.
Figura 8.1: Testbench medida potencia consumida
Figura 8.2: Testbench medida potencia consumida
43. Podemos observar que hay potencia disipada durante todo el intervalo de
tiempo, que es debido a los 11 transistores pmos que siempre estarán
funcionando independientemente de lo que ocurra en el resto del circuito.
También podemos ver picotazos de corriente que son debidos a los
cambios de estados de nuestra máquina que hace que se activen o
desactiven transistores debido a las entradas.
Para obtener la potencia que disipa el circuito elegimos una de las
gráficas de corriente y abrimos la calculadora. A continuación pulsamos 43
rms para obtener la corriente eficaz y la multiplicamos por la tensión de
alimentación, que en nuestra tecnología es de 3.3V, pulsamos eval para
obtener la potencia estática que consume la PLA.
Como se aprecia, el circuito consume aproximadamente 1,67 mW.
Figura 8.3: Testbench medida potencia consumida durante
la detección de una secuencia
44. 9) Estudio de frecuencia
Para el estudio de frecuencia lo que se ha hecho ha sido coger el
testbench del sistema completo y crear una nueva simulación donde se ha
ido cambiando el periodo de reloj de referencia (teniendo en cuenta que
el rise time y fall time se han tomado aproximadamente del 10% del
periodo) hasta ver en la simulación que la señal se deteriora hasta el
punto que el diseño deja de funcionar correctamente. Siendo pues dicha 44
frecuencia la máxima. Como se puede apreciar en las distintas graficas se
consigue un periodo mínimo de 3ns que corresponde con una frecuencia
máxima sobre los 333 MHz.
Para éste cálculo se ha tenido en cuenta que el generador de reloj no
fuera el sistema limitante a la hora de calcular la frecuencia máxima (ya
que inicialmente al subir en frecuencia fallaba la fase 2 del reloj debido al
tamaño mínimo escogido desde un principio para los transistores del
generador). Para evitar el problema se ha cambiado el dimensionamiento
de los transistores a tres veces su ancho mínimo, aunque puede que con
que fueran el doble bastaría.
Figura 9.1: Testbench fmáx
46. 46
Figura 9.4: tpLH = 1,77 ns
Los tiempos los hemos calculado desde el 50% del flanco de subida de fi1
que es la señal que indica cuando se capturan los datos de entrada hasta
el 50% del flanco de subida/bajada de la señal de salida de la PLA.
47. 10) Bibliografía
Apuntes de Circuitos Microeletrónicos.
Kamran Eshraghian .Basic VLSI Design: Systems and Circuits Prentice Hall,
Sidney, 1994.
Jan M. Rabaey. Circuitos Integrados Digitales: Una perspectiva de diseño.
Prentice Hall, España, 2004
Antonio Rubio. Diseño de circuitos y sistemas integrados. Edicions UPC, 47
Barcelona, 2003
Wikipedia: http://es.wikipedia.org/