Documentos de Académico
Documentos de Profesional
Documentos de Cultura
ALUMNO:
Galasso Christian L. christian_galasso81@yahoo.com.ar
Resumen: En el presente informe se realiza un anlisis de caractersticas particulares del procesador TigerSHARC, y de algunas que difieren de la arquitectura SHARC tpica, y que le hacen tener ventajas sobre la misma, adems de presentarse ejemplos de cdigo para la implementacin de dichas caractersticas.
ndice de contenido
1.Breve descripcin del DSP tigerSHARC........................................5 1.1.Arquitectura del procesador.............................................5 1.2.Caractersticas especiales del TigerSHARC...............................7 2.Arquitectura superescalar Vs VLIW...........................................8 2.1.Introduccin a las arquitecturas de procesadores........................8 2.2.Arquitectura Superescalar...............................................9 2.3.Arquitectura VLIW (Superescalar esttica)..............................10 2.4.Planificacin en una mquina Superescalar vs. una VLIW.................10 2.5.Diferencias y semejanzas...............................................11 3.Caractersticas que hacen del TigerSHARC un DSP ortogonal..................12 3.1.Instrucciones Ortogonales..............................................12 3.2.Registros ortogonales..................................................12 4.Unidad lgica orientada a las comunicaciones (CLU).........................13 4.1.Descripcin de la CLU..................................................13 4.2.Operaciones de la CLU..................................................14 4.2.1.Funcin TMAX (Trellis Maximum).....................................14 4.2.2.Funciones de celosa (Trellis Function)............................15 4.2.3.Funciones de dispersin (Despread Function)........................16 5.Registros de los bloques de clculo........................................18 6.Unidad aritmtico-lgica orientada a enteros (IALU)........................21 6.1.Descripcin de la IALU.................................................21 6.2.Direccionamiento directo e indirecto...................................22 6.3.Acceso a memoria Normal, Broadcast y Fusionado........................23 6.4.Buffer de alineacin de datos(DAB).....................................24 6.5.Direccionamiento de buffer circular....................................25 6.6.Direccionamiento Bit Reverse...........................................26 6.7.Direccionamiento en las operaciones SISD y SIMD........................28 7.Secuenciador de programa...................................................29 7.1.Introduccin al secuenciador de programa...............................29 7.2.Pipeline...............................................................30 7.2.1.Introduccin al pipeline...........................................30 7.2.2.Operacin del pipeline de instrucciones............................31 7.2.3.Efectos sobre el pipeline de las dependencias y los recursos.......32 7.3.Cach de instrucciones y buffer de destino de saltos(BTB)..............32 7.3.1.Introduccin al BTB y comparacin con la cach del SHARC...........32 7.3.2.Como se ahorra ciclos con el BTB?.................................33 7.3.3.Cuando es conveniente el uso del BTB?.............................34 7.3.4.Sobre colocar ms de un salto en una palabra cudruple.............34 7.4.Buffer de alineacin de instrucciones(IAB).............................35 7.5.Variaciones en el flujo de programa....................................36 7.6.Interrupciones.........................................................38 8.Soporte para sistemas operativos...........................................43 8.1.Cambio de contexto.....................................................43 8.2.Anidamiento de llamadas e interrupciones...............................43 8.3.Direccionamiento relativo..............................................43 9.Bibliografa y Agradecimientos.............................................44 9.1.Bibliografa...........................................................44 9Agradecimientos...........................................................44
La segunda llamada perifricos del procesador, que es la parte donde almacenamos los datos y tomamos o enviamos datos desde el exterior al DSP o desde el DSP al exterior:
Como se puede observar en las figuras 1-1 y 1-2 la arquitectura posee los siguientes componentes:
2 Bloques de clculo: X e Y, cada uno constituido por un multiplicador, ALU, CLU, unidad de
desplazamiento de bits (de ahora en adelante: Shifter), y 32 registros de 32-bits (tamao palabra) cada uno.
Secuenciador de programa Controla el flujo de la ejecucin y contiene el buffer de alineacin de instrucciones IAB (Instruction Alignment Buffer) y el buffer de destino de salto BTB (Branch Target Buffer). 3 canales (buses) de 128-bits que proveen una conectividad de gran ancho de banda entre la memoria interna y el resto de los elementos del procesador (bloques de clculo, IALUs, secuenciador de programa, y la interfase SOC). 1 Canal de 128-bits que provee una conectividad de gran ancho de banda entre la memoria interna y los perifricos de I/O (DMA, puertos externos y puertos de linkeo). Interfase con los puertos externos, incluyendo, interfase maestra, controlador de SDRAM, interfase con el pipeline esttico, 14 canales DMA, 4 puertos link LVDS (uno cada dos canales DMA), y soporte para multiprocesamiento. 24 Mbits de memoria interna dividida en 6 bloques de 4 Mbits, cada uno de los cules contiene 128 K-palabras de 32-bits; cada bloque se interconecta a travs de su propio buffer y de una memoria cach asociativa de 128 K-bits. Caractersticas de depuracin (Debug features). Puerto de testeo y emulacin JTAG.
Soporta los formatos punto fijo y flotante IEEE. Cumple con el estndar 1149.1 del IEEE. JTAG. La arquitectura soporta lenguaje de alto nivel y sistemas operativos.
Las caractersticas que hacen posible utilizar en el mismo lenguaje de alto nivel y sistemas operativos son:
Set de instrucciones ortogonales (vase seccin 3) que permite al compilador el uso eficiente de los slots multi-instrucciones. Registros de datos de propsito general y de IALU. Soporte para datos de 32-bits (IEEE estndar 754/854) y 40-bits en punto flotante y 8-, 16-, 32-, y 64-bit en punto fijo. Gran espacio de direcciones. Modificacin de campos de direcciones inmediato. Fcil reubicacin de cdigo y datos. Est optimizado para guardar y/o recuperar rpidamente, los registros del procesador, dentro de la pila de la memoria interna (o sea que, est optimizado para realizar los cambios de contexto tpicos de los sistemas operativos multitarea).
Nota: Que soporte lenguajes de alto nivel no implica que sea eficiente usarlos para programar el TigerSHARC, ya que por ser superescalar esttico, aparece un problema de dependencias entre instrucciones, y conflictos de recursos; el compilador hace su mejor esfuerzo por acomodar las instrucciones paralelizables pero la experiencia dice que el resultado del compilador deja mucho que desear, a tal punto que lo ms conveniente en la mayora de los casos, es que el mismo programador escriba el cdigo en lenguaje ensamblador haciendo uso de las tablas de dependencias provistas en la programing reference, pudiendo as obtener resultados mucho ms satisfactorios que el compilador y por ende algoritmos que se ejecutarn en un nmero menor de ciclos, que sern mucho mas rpidos y eficientes.
Luego apareci la arquitectura HARVARD la cul tiene memoria de programa y memoria de datos separadas y se accede a ellas a travs de buses separados. La instruccin se trae a la CPU en un solo acceso a la memoria de programa . Mientras tanto el bus de datos est libre y puede accederse a travs de l a los datos que se necesitan para ejecutar la instruccin de programa anterior a la que se esta trayendo de memoria de programa en ese momento.
Ventaja:
El tiempo de acceso se mejora respecto a la arquitectura von Neumann donde programa y datos se traen a la CPU usando el mismo bus.
Ahora bien, nos falta definir otra caracterstica de la arquitectura, si es escalar o vectorial. Los procesadores escalares son el tipo ms sencillo de procesadores. Cada instruccin de un procesador escalar opera sobre un dato cada vez. En contraposicin, en un procesador vectorial una sola instruccin opera simultneamente sobre un conjunto ms o menos grande de datos. La diferencia entre ambos es la misma que entre la aritmtica escalar y vectorial[3].
2.2.Arquitectura Superescalar
Superescalar (tambin conocida como vectorial) es el trmino utilizado para designar un tipo de microarquitectura de procesador capaz de ejecutar ms de una instruccin por ciclo de reloj. El trmino se emplea por oposicin a la microarquitectura escalar que slo es capaz de ejecutar una instruccin por ciclo de reloj. La microarquitectura superescalar utiliza el paralelismo de instrucciones adems del paralelismo de flujo, ste ltimo gracias a la estructura en pipeline. La estructura tpica de un procesador superescalar consta de un pipeline con las siguientes etapas:
lectura (fetch). decodificacin (decode). lanzamiento (dispatch). ejecucin (execute). escritura (writeback). finalizacin (retirement).
En un procesador superescalar, el procesador maneja ms de una instruccin en cada etapa. El nmero mximo de instrucciones en una etapa concreta del pipeline se denomina grado, as un procesador superescalar de grado 4 en lectura (fetch) es capaz de leer como mximo cuatro instrucciones por ciclo. El grado de la etapa de ejecucin depende del nmero y del tipo de las unidades funcionales. Un procesador superescalar suele tener unidades funcionales independientes de los tipos siguientes:
aritmtico lgica (ALU) de lectura / escritura en memoria (Load/Store Unit) de coma flotante (Floating Point Unit) de salto (Branch unit)
Un procesador superescalar es capaz de ejecutar ms de una instruccin simultneamente nicamente si las instrucciones no presentan algn tipo de dependencia (hazard). Los tipos de dependencia entre instrucciones son:
dependencia estructural, esta ocurre cuando dos instrucciones requieren el mismo tipo unidad
dependencia de datos, esta ocurre cuando una instruccin necesita del resultado de otra
dependencia de escritura o falsa dependencia , esta ocurre cuando dos instrucciones necesitan
La deteccin y resolucin de las dependencias entre instrucciones puede ser esttica (durante la compilacin), para el caso de las arquitecturas VLIW (superescalares estticas) , o dinmica, es decir, a medida que se ejecuta un programa, generalmente durante las etapas de codificacin y lanzamiento de las instrucciones. La deteccin y resolucin dinmica de las dependencias entre instrucciones suele realizarse mediante alguna variante del algoritmo de Tomasulo que permite la ejecucin de instrucciones en un orden distinto al del programa tambin llamada ejecucin en desorden . La eficacia de un procesador superescalar viene limitada por un lado por la dificultad en suministrar al procesador suficientes instrucciones que puedan ser ejecutadas en paralelo y por otro lado por las prestaciones de la jerarqua de memorias. Si las instrucciones de salto son un problema para los procesadores con pipeline en general, en el caso de los procesadores superescalares, el problema se multiplica ya que un parn en el pipeline tiene consecuencias en un nmero mayor de instrucciones. Por esta razn, los fabricantes de procesadores recurren a tcnicas de ejecucin especulativa y disean algoritmos de prediccin de saltos cada vez ms sofisticados as como sistemas de almacenamiento de instrucciones por trazas (trace caches). Ventajas:
Aumento de la velocidad de procesamiento al poder ejecutar ms de una sola instruccin por ciclo de reloj.
Inconvenientes:
Las arquitecturas superescalares adolecen de una estructura compleja y de un mal aprovechamiento de sus recursos debido en parte a la dificultad en encontrar suficientes instrucciones paralelizables. Una forma de obtener un mayor nmero de instrucciones paralelizables es aumentar la ventana de instrucciones, es decir el conjunto de instrucciones que la unidad de lanzamiento considera como candidatas a ser lanzadas en un momento dado. Desafortunadamente la complejidad del procesador superescalar aumenta desproporcionadamente con respecto al tamao de dicha ventana lo que se traduce por un ralentizamiento general del circuito. Otra forma de obtener ms instrucciones paralelizables es manipulando instrucciones de ms de un programa a la vez, lo que se conoce bajo el nombre de multitarea simultnea o multithreading simultneo.
Simplificacin de la arquitectura hardware al no tener que planificar el cdigo Reduccin del nmero de instrucciones de los programas
Inconvenientes:
Requiere compiladores mucho ms complejos Cualquier mejora en la arquitectura hardware implica un cambio en el juego de instrucciones (compatibilidad hacia atrs nula) A da de hoy, las mquinas VLIW prcticamente han desaparecido, ya que los inconvenientes pesan bastante ms que las ventajas. La imposibilidad de tener compatibilidad hacia atrs, los excesivos cambios requeridos en los compiladores, y el hecho de que la simplificacin del hardware respecto a las mquinas superescalares convencionales no sea tampoco excesiva han hecho que se abandonen este tipo de diseos. Aunque existen conversores de cdigo binario, que traducen los programas compilados para un procesador al lenguaje binario de los modelos posteriores, sin necesidad de reescritura o recompilado mediante el nuevo compilador.
En una mquina VLIW, toda la planificacin anterior la hara el compilador (o el propio programador si programa en ensamblador), y el cdigo resultante sera algo as: 1 MULT(R1,R2,R3) 2 REST(R1,R4,R6) SUM(R3,R4,R5)
Se puede ver como en cada instruccin se especifica el estado de cada unidad funcional, de modo que en la primera instruccin se activan el multiplicador y el restador, dejando el sumador ocioso al no poder calcular an la suma, y en la siguiente instruccin se hace la suma que faltaba.
2.5.Diferencias y semejanzas
Diferencias:
El momento en el cul se hace el chequeo de las dependencias entre las instrucciones. El tipo de instrucciones.
Semejanzas:
Misma estructura bsica compuesta por mltiples unidades de procesamiento, operando en paralelo, y un nico banco de registros compartido, o uno por cada unidad de procesamiento.
3.2.Registros ortogonales
Cada uno de los bloque de procesamiento posee un registro ortogonal multipuerto de 32 palabras de 32-bits, el cul se puede utilizar para transferencias de datos entre los bloques y los canales de datos y para almacenar resultados intermedios. Todos estos registros pueden ser accedidos de 3 formas distintas:
Decodificacin Viterbi[5]. Decodificacin de Turbo cdigos[4]. Dispersin para sistemas de Acceso mltiple por divisin de cdigo (CDMA)[3]. Correlaciones cruzadas usadas para bsqueda de camino (CDMA)[3].
El hecho de incluir las instrucciones especficas de las CLUs simplifica la programacin de dichos algoritmos, manteniendo la flexibilidad de un enfoque de software. De sta manera, es sencillo ajustar el algoritmo a los requisitos especficos del usuario. Adems, las instrucciones se pueden utilizar para una variedad de propsitos, por ejemplo la instruccin TMAX, incluida para soportar la decodificacin de turbo-cdigos, es tambin muy utilizada en la decodificacin de cdigos de paridad de baja densidad.
4.2.Operaciones de la CLU
Las instrucciones de la CLU se aplican a datos de punto fijo los cuales pueden ser reales o complejos. Las mismas estn orientadas a los siguientes usos:
Logaritmo Jacobiano para turbo cdigos (TMAX). Dispersin para CDMA (DESPREAD). Correlaciones cruzadas para CDMA (XCORRS). Reordenamiento polinomial (PERMUTE). Suma/comparacin/seleccin de celosas (Trellis).
Rm,n,s 32 (Datos) Registros de los bloque de procesamiento. TRm,n,s 32 (Trellis) Registros dedicados a las instrucciones de la CLU. THR 4 (Trellis History) Registros usados por las instrucciones ACS, DESPREAD, y XCORRS por datos desplazados. CMCTL Registros de control de comunicaciones usados por la instruccin XCORRS los cuales son una entrada opcional para el valor CUT.
Nota: Aunque se ven cuatro puntos pero los tipos de registro son 3: Datos, Trellis (celosa), Trellis History(histrico de la celosa). Las funciones de la CLU podemos clasificarlas en:
Funcin TMAX. Funcin de celosa (Trellis Function). Funciones de dispersin (Despread Function). Funciones de correlaciones cruzadas.
Trabaja con aritmtica en el dominio logartmico; con lo que los productos se transforman en sumas, las sumas se pueden calcular mediante el Logaritmo Jacobiano:
ln e e = max x , y ln 1 e
y x
ln 1 eba
Ejemplos de uso la funcin TMAX (celosa mxima): Sintaxis: {X|Y|XY}{S}TRsd = TMAX(TRmd + Rmq_h, TRnd + Rmq_l) {(NF)} ; {X|Y|XY}{S}TRsd = TMAX(TRmd - Rmq_h, TRnd - Rmq_l) {(NF)} ; {X|Y|XY}{S}Rs = TMAX(TRm, TRn) {(NF)} ; Cdigo: XYTR1:0 = TMAX(TR3:2 + R3:2, TR5:4 + R1:0) ; XYTR1:0 = TMAX(TR3:2 - R7:6, TR5:4 - R5:4) ; XYR8 = TMAX(TR4, TR0) ; En la figura 4-3, podemos ver el diagrama de flujo del primer ejemplo:
Sintaxis: {X|Y|XY}TRs += DESPREAD (Rmq, THRd) ; {X|Y|XY}Rs = TRs, TRs = DESPREAD (Rmq, THRd) {(NF)} ; (dual op.) {X|Y|XY}Rsd = TRsd, TRsd = DESPREAD (Rmq, THRd) {(NF)} ; (dual op.)
Cdigo: XYTR8 += DESPREAD (R7:4, THR1:0) ;; XYR8 = TR8, TR8 = DESPREAD (R7:4, THR1:0) ;; XYR1:0 = TR1:0, TR1:0 = DESPREAD (R7:4, THR1:0) ;; Estas son solo algunas de las instrucciones que sta particular unidad puede ejecutar; para un anlisis ms detallado de la misma se recomienda dirigirse al ADSP-TS201 TigerSHARC Processor Programming Reference. Es importante mencionar que no todos lo procesadores TigerSHARC poseen sta unidad dentro de sus bloques de clculo.
Nota: En la figura 5-1, H se refiere a los 64-bits ms significativos (127-64) y L a los 64-bits menos significativos (63-0). En la figura 5-1 se muestra que los datos entrantes al conjunto de registros puede o no pasar por el buffer de alineacin de datos (DAB). El DAB es una FIFO formada por 2 registros de palabra cudruple (128-bits), el cul alinea los datos que se reciben en forma desordenada desde la memoria. En los bloques de clculo existen 2 tipos de registros:
Los primeros pueden ser accedidos por los dispositivos externos a travs de los canales de datos por lo que son denominados: registros universales (Ureg). Los segundos son internos del bloque y no accesibles desde el exterior del bloque al que pertenecen; nos referiremos a ellos como registros de datos (Dreg). En sistemas de multiprocesamientos es particularmente beneficioso tener los registros internos mapeados en un lugar definido de memoria y accesibles a travs del canal de datos. Para poder desarrollar ejemplos fue necesario plantear un esquema de mapeo de registros comparativo entre un DSP SHARC y un procesador TigerSHARC, el cul se presenta en la tabla 5-1, el mismo no es fijo, es solo un ejemplo de como podra hacerse:
Tabla 5-1: Esquema de mapeo de registros del DSP SHARC y procesador TigerSHARC.
Aclaracin de la tabla: 5-1: P/R: Primary Registers, S/R: Secondary Registers, N/A: Not Applicable. La comilla simple () es utilizada para denotar el set de registros secundarios o alternativos[10]. El cdigo escrito a continuacin muestra como el DSP SHARC y el procesador TigerSHARC utilizan los registros primarios y secundarios, basados en el mapeo previamente visto: // SHARC (ADSP-21xxx) //PEx (Primary Regs.) r0 = 0x1234; r1 = 0x5678; //PEx (Secondary Regs.) Bit set MODE1 SRRFL; nop; r0 = 0x1234; r1 = 0x5678; // TigerSHARC (ADSP-TSxxx) // CBx xr0 = 0x1234;; xr1 = 0x5678;; // No secondary registers // xr31-16 are used instead // No need to enable mode xr16 = 0x1234;; xr17 = 0x5678;;
Suma y resta, con y sin carry/borrow. Desplazamiento aritmtico a la derecha, desplazamiento lgico a la derecha y rotacin. Operaciones lgicas: AND, AND NOT, NOT, OR, and XOR. Funciones: Valor absoluto, mnimo, mximo y comparacin.
Asimismo las IALUs son las encargadas de realizar el direccionamiento de la memoria cuando se realiza alguna transferencia de datos entre la memoria y los registros del procesado. Las mismas trabajando en simultneo direccionan 2 accesos a memoria (escritura/lectura). Las operaciones de carga, almacenado y transferencia de datos incluyen:
A diferencia de los DAGs, las IALUs estn conectadas a todos los bloques de memoria interna (es decir que no hay limitaciones del tipo DM/PM) lo que les permite direccionar cualquier bloque. Los DAGs de la arquitectura SHARC tienen al igual que los elementos de procesamiento un set de registros secundarios
(a parte de los registros primarios), no as las IALUs que solo poseen un set de 32 registros de 32-bits (solo los primarios) por unidad (J y K), de los cuales 3 (y no 8 como en el caso de SHARC) cumplen las mismas funciones que los registros secundarios de los DAGs. Esto, sin embargo, no debera influir en la mayora (si no en todas) de las solicitudes, porque no todos los dems registros disponibles(J/K19-12, J/K30-28) se utilizarn al mismo tiempo. A diferencia de los dems registros de las IALUs, J31 y K31 no pueden utilizarse como registros de propsito general. Los DAGs soportan carga y almacenaje de datos usando los canales PM y DM en la misma instruccin (por ejemplo: dm(i0,m0)=r0, f8=pm(i8,m8);). Asimismo las IALUs soportan el uso de ambas en paralelo; sin embargo, debido a que en el esquema de mapeo de registros utilizado en los ejemplos del presente informe hemos dedicando los registros CBx a Pex (CBy a Pey; recordemos que CBx e y son los registros internos de los bloques de clculo), KALU y JALU, no pueden utilizarse en la misma instruccin para almacenar datos en CBx. Esto lo veremos ms claro con un ejemplo: //Parallel LOAD from memory-ALLOWED xr0 = [j4+j12]; xr1 = [k4+=k12];; //Parallel STORE [j4+=j12] = xr2; //Parallel STORE [j4+=j12] = xr2; to memory-NOT ALLOWED [k4+=k12] = xr3;; to memory-ALLOWED [k4+=k12] = yr3;;
La segunda instruccin se traduce como una violacin de recursos, ya que el nmero de puertos de salida requeridos de CBx (2 datos requieren de 2 puertos para salir al mismo tiempo), superan el mximo permitido (el conjunto de registros internos de cada bloque de procesamiento solo tiene 1 puerto de salida). En la tercera lnea de cdigo vemos el uso correcto de JALU y KALU en la misma instruccin. Esto no tiene por que ser siempre as! Nota: Para los DSPs SHARC, las instrucciones paralelas estn separadas por una coma , y el final de una lnea de instruccin se denota por un punto y coma ;. Para los procesadores TigerSHARC, un punto y coma ; separa instrucciones paralelas y un doble punto y coma ;; termina una lnea de instruccin.
A modo comparativo se presenta un ejemplo de cdigo de ste direccionamiento en dos tipos de arquitectura de DSP: // SHARC (ADSP-21xxx) //Setting up registers r0 = 0x1234; r1 = 0x5678; i0 = source_buffer1; m0 = 1; i8 = source_buffer2; m8 = 1; // Post-modify DAG1 operation dm(i0, m0)= r0; // Pre-modify DAG2 operation pm(m8, i8)= r1; // Parallel DAG1 & DAG2 LOAD r0=dm(i0, m0), r1=pm(i8, m8); // Parallel DAG1 & DAG2 STORE dm(i0, m0)= r0, pm(i8, m8)= r1; // TigerSHARC (ADSP-TSxxx) // Setting up registers xr0 = 0x1234;; xr1 = 0x5678;; j4 = source_buffer1;; j12 = 1;; k4 = source_buffer2;; k12 = 1;; //Post-modify JALU operation [j4 +=j12]=xr0;; //Pre-modify KALU operation [k4 + k12]=xr1;; // Parallel JALU & KALU LOAD xr0=[j4 +=j12]; xr1=[k4 += k12];; // Parallel JALU & KALU STORE [j4 +=j12]=xr0;; [k4 +=k12]=xr1;;
Lectura/escritura Normal, lee o escribe datos en registro universales (Ureg). Este tipo de acceso lee o escribe 1, 2 o 4 palabras de 32-bits necesarios para la lectura/escritura del registro fuente/destino indicado en la instruccin. Dichos accesos se producen solo cuando los tamaos de los registros fuente y destino coinciden. El acceso Broadcast, lee datos de memoria y los carga en los registros de los bloques de clculo. En este modo de acceso se leen datos de 1, 2 o 4 palabras (32-bits) y se cargan en el registro destino de ambos bloques. El acceso Broadcast ocurre cuando el tamao del registro fuente coincide con el tamao del operador de acceso de la IALU y el nombre del registro destino es XY (o ningn prefijo), para indicar ambos bloques de clculo. El acceso Fusin de lectura/escritura, lee o escribe datos en los registros de datos de los bloques de clculo. Las transferencias de datos de ste tipo son de tamao de dobles (64-bits) o cudruples (128-bits) palabras. La transferencia se realiza entre la memoria y los registros de datos de ambos bloques, donde los datos son divididos entre X e Y. Si una palabra larga (64-bits) es leda de la memoria, una palabra (32-bits) es cargada en el bloque X y la otra en el Y. Si una palabra cudruple (128-bits) es leda de la memoria, 2 palabras son cargadas en el bloque X y las otras 2 en el Y. Este acceso puede trabajar en ambas direcciones (lectura o escritura) y el orden entre X e Y se puede cambiar utilizando los prefijos XY o YX. En el caso de XY la parte alta del dato transferido (palabra alta para el caso de palabra larga o las 2 palabras ms significativas para el caso de la palabra cudruple) se carga en registros X y la parte baja en registros Y, y al revs para el caso YX.
Figura 6-3: Datos contenidos en la memoria para los ejemplos de accesos normal, fusin y broadcast.
Ejemplos de accesos a memoria: /*Acceso a memoria Normal, de datos de 32-bits*/ XRs = [Jm += Jn] ;; /* Jm = direccin de word 0.*/ /*word 0 es almacenada en XRs*/
/*Acceso a memoria Broadcast, de datos de 32-bits*/ XYRs = [Jm += Jn] ;; /* Jm = direccin de word 0.*/ /*word 0 es almacenada en XRs y en YRs*/
/*Acceso a memoria Fusin, de datos de 32-bits*/ XYRs = L [Jm += Jn] ;; /* Jm = address of word 0.*/ /*word 0 es almacenada en YRs y word 1 en XRs*/ YXRs = L [Jm += Jn] ;; /* Jm = address of word 0.*/ /*word 0 es almacenada en XRs y word 1 en YRs*/ Comparacin entre los cdigos de un DSP SHARC y un procesador TigerSHARC para el acceso Broadcast: //SHARC (ADSP-21xxx) //Broadcast Loading Mode Bit Set MODE1 BDCST1; nop; r2=dm(i1,m1); /*Load r2 with 0xC*/ //Load s2 with 0xC //TigerSHARC (ADSP-TSxxx) //Broadcast Load //Broadcast not a mode ->no need to enable //Specified by register names r2=[j5+=j13];; //Load xr2 with 0xC //Load yr2 with 0xC
Figura 6-4: ejemplo de instruccin con los datos alineados (Izq.) y no-alineados (Der.).
Los accesos utilizando los DABs deben entenderse como repetidas series de accesos a memoria, por medio de direccionamiento para buffer circular o direccionamiento lineal. Esto requiere una primera lectura para clarear el DAB de los datos anteriores y cargar los primeros datos correctos de la serie antes de que el DAB est listo para repetidos accesos. El DAB determina automticamente la palabra cudruple ms cercana del ndice de direcciones y lee de memoria, la palabra cudruple correcta a cargar en el DAB. Como los DAB establecen automticamente un direccionamiento del tipo buffer circular es necesario establecer los valores correctos de los registro implementados por dicho direccionamiento (ndice, base, longitud y modificador) antes de comenzar el acceso a travs de los DABs. Por ello, las instrucciones del DAB solo deben utilizar los registros de la IALU que estn destinados al direccionamiento de buffers circulares.
;; ;; ;; ;; ;; ;; ;; ;; ;; ;; ;; ;;
Comparacin entre los cdigos de un DSP SHARC y un procesador TigerSHARC para realizar un direccionamiento de buffer circular: //SHARC (ADSP-21xxx) bit set mode1 CBUFEN; // Enable circular mode (2116x only) r1 r2 B0 I0 L0 M0 = = = = = = 0x1234; 0x5678; output; b0; 3; 1; //TigerSHARC (ADSP-TSxxx) // Enabled in TigerSHARC by // using CB xr1 = 0x1234;; xr2 = 0x5678;; jB0 = output;; j0 = jB0;; jL0 = 3;; j12 = 1;; CB[j0+=j12] CB[j0+=j12] CB[j0+=j12] CB[j0+=j12] = = = = xr1;; xr1;; xr1;; xr2;;
/*Base for buffer*/ /*initialize index*/ /*length circular*/ /*Modifier*/ /*i0=buffer(top)*/ /*i0=buffer+1*/ /*i0=buffer+2*/ /*i0=buffer(top)*/
//Base for buffer //initialize index //Length of buffer //Modifier //j0=buffer(top) //j0=buffer+1 //j0=buffer+2 //j0=buffer(top)
Figura 6-6: acarreo del bit de carry en la operacin Bit Reverse (opcin BR).
La figura 6-6 es un ejemplo de la forma de acarreo en la operacin bit reverse. Para una suma normal el resultado de 0xA5A5 + 0x2121, es 0xB6B6, pero para una operacin de acarreo bit reverse el resultado es 0x9494. Al igual que con el direccionamiento de buffer circular, el bit reverse se realiza utilizando solo los registros J3J0 o K3K0; no as con los registros base y longitud, ya que stos no necesitan ser seteados para el bit reverse. En las operaciones bit reverse no hay overflow.
Figura 6-7: Direccionamiento Bit Reverse del cdigo ejemplo - Orden de las palabras del acceso.
Ejemplo de direccionamiento bit reverse, en el procesador TigerSHARC: #define N 8 /* N = 8; number of bit reverse locations; N must be a power of 2 */ .section data1; .align N; /* align the input buffers start to an address that is a multiple of N; assume * for this example that the address is 0x1000 0000 0000 0000 */ .var input[N]={0,1,2,3,4,5,6,7}; .var output[N]; .section program; _main: j0 = j31 + ADDRESS(input) ;; /* Input pointer */ j4 = j31 + ADDRESS(output) ;; /* Output pointer */ LC0 = N ;; /* Set up loop counter */ _my_loop: xr0 = BR [J0 += N/2] ;; /* Data read with bit reverse; modifier must be equal to N/2 */ if NLC0E, jump _my_loop ; [j4+=1] = xr0 ;; /* Write linear */
Nota: Estos ejemplos estn basados en el esquema de mapeo de registros visto en la seccin 5 (registros de los bloques de clculo), tabla 5-1. Como puede verse en el ejemplo anterior, el cdigo r0=dm(i1,0); en SHARC es lo mismo que xr0=[j5+j31];; en TigerSHARC, donde J31 es siempre igual a 0 cuando se lo utiliza como operando. Otra cosa para notar es que el SHARC siempre realiza movimientos con datos de 64-bits ( r0 = dm (i1, m1);modo SIMD habilitado), en cambio en el TigerSHARC la longitud del dato deber ser especificada con la letra L cuando se trate de palabras de 64-bits. Esto se traduce en tener una palabra de 64-bits cargada dentro de los registros x (32-bits, parte baja) e y (32-bit, parte alta), segn lo especificado por la instruccin (yxr1 = L [j5 + J13];;). Si el prefijo L no se agrega en la instruccin, la misma palabra de 32-bits (palabra normal de 32-bits es el modo por defecto) es cargada en los registros x e y; y esto como ya es sabido es el modo Broadcast del TigerSHARC.
7.Secuenciador de programa
7.1.Introduccin al secuenciador de programa
El ncleo del procesador TigerSHARC posee un secuenciador de programa el cul es el encargado de administrar la ejecucin de los programas. El mismo cuenta con un buffer de alineacin de instrucciones (IAB), un contador de programa (PC), un buffer de destino de saltos (BTB), un administrador de interrupciones, y un mecanismo de bsqueda de direcciones ( Addres Fetch). El secuenciador busca las instrucciones en la memoria, y extrae una lnea de instruccin (128-bits) por ciclo; identifica en que unidad/es debe ejecutarse cada una de las instrucciones contenidas en la lnea (recordemos que es un VLIW, con lo que tenemos varias instrucciones paralelizables en una misma lnea de cdigo), y luego las enva a su correspondiente unidad/es. El secuenciador es tambin el encargado de controlar el flujo de las instrucciones y monitorea los requerimientos de parada de los programas. Las operaciones que soporta el secuenciador incluyen:
Suministrar la direccin de la prxima palabra cudruple de instruccin para cargar el buffer de alineacin de instrucciones (IAB). Extraer la prxima lnea de instruccin a ser ejecutada del IAB. Controlar de flujo de las instrucciones, lo cul incluye:
Evaluar las condiciones. Mantener el buffer de destino de salto(BTB). Decrementar contadores de lazos.
Figura 7-1: Diagrama en bloques donde se identifica el secuenciador de programa y sus elementos internos.
El addres fetch y el PC, son elementos tpicos y conocidos, los que se vern en ms detalle son:
Buffer de destino de saltos (BTB). Realiza una cach de las direcciones de saltos para reducir el costo de pipeline que tiene los saltos predichos. Buffer de alineacin de instrucciones (IAB). Recibe la lnea de instruccin de 128-bits (palabra cudruple), la alinea de ser necesario y enva las instrucciones que contiene a los bloques de clculo, IALUs y secuenciador de programa. Pipeline de 8 o 10 etapas dependiendo el modelo de TigerSHARC.
7.2.Pipeline
7.2.1.Introduccin al pipeline
Para realizar una ejecucin ms rpida el TigerSHARC utiliza un pipeline de instrucciones de 8 o 10 etapas (El SHARC solo tena 3 etapas). El procesador busca una palabra cudruple de memoria (que consiste en 1 a 4 instrucciones), las analiza, decodifica y ejecuta. La figura 7-3 muestra el pipeline y como ste interacta con el BTB, el IAB y el pipeline de memoria.
Una lnea de instruccin requiere 8 o 10 ciclos para recorrer de principio a fin el pipeline. El rendimiento es de una ejecucin de una lnea de instruccin por cada ciclo de reloj (CCLK) del procesador. Como se
puede ver el pipeline de memoria trabaja paralelamente al pipeline de instrucciones, a tal punto que paradas en los ciclos de direccin o de registro ( address cycle y register cycle) provocan paradas en los correspondientes ciclos del pipeline de instrucciones (ms informacin en: Efectos sobre el pipeline de las dependencias y los recursos, seccin 7.2.2).
Ntese en la figura, el orden en que los resultados de una operacin estn disponibles. Puede verse que las operaciones con la IALU se ejecutan en la fase (pipe) Integer ALU, mientras que las operaciones con los bloque de procesamiento se ejecutan en la compute block, con lo que los resultados de la IALU pueden estar disponibles antes que los de los bloques de clculo, dependiendo del orden y tipo de funciones. Las primeras cuatro etapas del pipeline (F1, F2, F3 y F4) son llamadas fase fetch unit (llamaremos Fase a lo que en la figura llaman Pipe ). Los ciclos de bsqueda son los primeros del pipeline y estn vinculados a los accesos a memoria. Los progresos en esta etapa son manejados por la memoria y no por la instruccin. La unidad de bsqueda llena el IAB mientras este tenga menos de 4 palabras palabras cudruples. Dado que las unidades de ejecucin pueden leer instrucciones a una velocidad igual o inferior a la capacidad de bsqueda de 4 palabras por ciclo, es poco probable que el IAB se vace. El IAB se puede llenar con un mximo de 6 palabras cudruples. Cuando la bsqueda es en la memoria externa, el flujo es similar pero mucho ms lento. El mximo rendimiento de la bsqueda es una lnea de instruccin cada 2 ciclos SCLK y la latencia es de acuerdo con el diseo del sistema (profundidad del pipeline de memoria externa, ciclos de espera, etc.). Las siguientes 4 etapas del pipeline (predecode, decode, integer y access) se denominan fase Integer ALU. En el ciclo PreDecode, la siguiente lnea completa de instruccin es extrada de la IALU y las diferentes instrucciones son distribuidas a las unidades de ejecucin durante el ciclo Decode. Las unidades incluyen:
J-IALU or K-IALU - instrucciones con enteros, lectura/escritura y transferencias de registros. bloques de clculo X o Y o ambos - 2 instrucciones (el cambio entre bloques es realizado por el conjunto de registros. Secuenciador de programa saltos e instrucciones condicionales, y otros.
El IAB tambin calcula el PC de las lneas de instruccin secuenciales y de algunas no secuenciales. El IAB no realiza ninguna decodificacin. Luego de la etapa Decode, las instrucciones entran en la etapa Integer donde son ejecutadas las instrucciones que trabajan con las IALUs las cuales incluyen, clculo de datos o direccionamientos y, opcionalmente, acceso a memoria. Si una instruccin de ste tipo incluye un acceso a memoria, es el bloque de memoria el que lo solicita en la etapa Integer, lo cual retrasa la operacin hasta que el bloque est disponible para la IALU. El resultado de clculo de direcciones se obtiene en la etapa Integer. Dado que la ejecucin en la IALU puede ser abortada (ya sea a causa de un salto condicional o predicho), el operando es retornado al registro destino solo al final de EX2. El resultado pasa a travs del pipeline en la que puede extraerse por una nueva instruccin en caso de que se requiera como fuente para un operando. La dependencia entre los clculos de la IALU, normalmente no causa ningn retraso, pero existen excepciones. Los datos que estn cargados son ledos recin en la etapa EX2. La ltima fase del pipeline se denomina fase compute block. En la etapa Decode, el bloque de procesamiento toma la instruccin y la transfiere a la unidad de ejecucin que le corresponde. En la etapa Integer, la instruccin es decodificada en la unidad de ejecucin y se chequean las dependencias. En la etapa Access, los registros fuente son seleccionados en el archivo de registros interno del bloque. En las etapas EX1 y EX2, los resultados son calculados y las banderas son actualizadas en el bloque correspondiente. La ejecucin toma siempre 2 ciclos y el resultado se escribe en el registro destino en el flanco de subida del CCLK luego de la etapa EX2. Todos los resultados se escriben en el registro destino y todas las banderas se actualizan en la etapa EX2. Esta regla tiene solo 2 excepciones:
accesos a memoria externa, donde la demora la determina el sistema. Instruccin Multiplicar-Sumar, que escribe los registros MR y las sticky flags un ciclo despus de EX2 (Esta forma de escritura es til para mantener la coherencia en caso de que se quiebre del pipeline).
Una condicin de dependencia es causada cuando una instruccin requiere del resultado de una instruccin anterior. Por lo cul ambas instrucciones deben ejecutarse en tiempos distintos. Un conflicto de recursos puede darse cuando dos instrucciones intentan usar el mismo bus interno u otro recurso (DMA, etc.), cuyo nmero es limitado, al mismo tiempo. El secuenciador de programa al encontrarse con un problema de ste tipo responde colocando ciclos de espera stall en el pipeline. En la Programming Reference del TigerSHARC se encuentra una tabla de dependencias til para el programador.
destino (TARGET). En el campo de la etiqueta se almacena la direccin cudruple (recordemos que de la memoria se traen 4 palabras de instruccin simultneamente, y una o mas de ellas puede ser un salto) de la lnea de instruccin que contiene el salto. En el campo de destino se almacena la direccin a la que el secuenciador de programa deber ir, si se realiza el salto.
Como puede apreciarse en la figura 7-5, el BTB tiene, a parte de los 2 campos ya vistos, otros que tambin describiremos a continuacin:
Index: El ndice determina la entrada del BTB seleccionada. El mismo se encuentra en los bits 6-2 de la direccin de la instruccin de salto. Tag: La Etiqueta determina si la instruccin recientemente buscada es un salto ya almacenado o no en el BTB. Esto es resuelto luego de una comparacin entre ambas. La entrada Tag del BTB grava los bits 20-7 y 1-0 de la direccin de la ltima instruccin de salto, de la ltima lnea de instruccin. Target: El Destino, es la direccin destino del salto. Cuando se lee una instruccin de salto y el mismo est almacenado en el BTB, el PC busca la direccin a la cul saltar en la entrada Target del BTB. Valid: El bit de Validez indica cuando una entrada es vlida (1) o invlida (0). CJMP: Indica cuando el salto es un CJMP (salto computado [2.Pg. 8-19]) (1) o no (0). RTI: Indica cuando el salto es un RTI (retorno de interrupcin) (1) o no (0). ABS: Indica cuando el salto usa direccin absoluta (1) o relativa (0). Lock: Bloquea (1) o desbloquea (0) una entrada. LRU: Campo menos utilizado; indica que campo puede sobrescribirse en caso de tener todas las entradas llenas y se necesite agregar un nueva entrada.
El TigerSHARC puede ejecutar 1 a 4 instrucciones de 1 lnea de instruccin. As mientras que 4 son las instrucciones que se cargan en el ncleo, en cada ciclo, no necesariamente, se ejecutan en la misma lnea de instruccin. Para manejar esta situacin, las instrucciones se guardan en una FIFO de 5 palabras, llamada, buffer de alineacin de instrucciones (IAB). Es all donde se alinean, en la lnea de instruccin correspondiente como est definido en el cdigo fuente. Por ejemplo, considere la estructura de cdigo que se presenta a continuacin: Instr1;; Instr2; Instr3; Instr4; Instr5;; Instr6; Instr7;; Instr8;; En el primer ciclo se obtiene de memoria las instrucciones 1, 2, 3 y 4. La primera lnea de instruccin se puede ejecutar debido a que solo contienen la instruccin 1. La segunda lnea de instruccin debe esperar la prxima carga desde memoria, ya que necesita la instruccin 5. Las instrucciones 2,3,4 y 5 estn alineadas en una lnea de instruccin en el IAB. En la carga de la instruccin 5 se cargaron tambin la 6, 7 y 8, con lo que las prximas lneas de instruccin pueden ejecutarse sin problema. Una ves entendido esto se puede ver como es que el funcionamiento del BTB se ve afectado si se colocan ms de un salto en la misma lnea de instruccin. La direccin que se almacena en el campo TAG solo pede ser de 1 lnea de instruccin (un mltiplo de 4como: 0x0, 0x4, 0x8 ...). Por lo tanto si un salto ocurre en la instruccin 1, 2, 3 o 4; en TAG se almacena el valor 0x0, y si ocurre en la instruccin 5, 6, 7 u 8; en TAG se almacena el valor 0x4. Si la instruccin 1 y la 4 son salto el BTB no tiene la capacidad de discernir entre una y otra. El campo TAG almacena la direccin de la ltima palabra cudruple (lnea de instruccin) que contiene el salto. Por ejemplo: Instr1;; Instr2; Instr3; Branch(Instr4); Instr5;; Instr6;; Aqu el salto est en la instruccin 4, la misma est ubicada en la segunda lnea de cdigo; con lo que en el TAG se almacenar 0x4, aunque la direccin de dicha lnea de instruccin sea 0x0. Esto es as, porque el secuenciador de programa debe cargar todas las instrucciones que se ejecutan en paralelo en la misma lnea de instruccin (interna del secuenciador); entonces, como en el ejemplo las instrucciones 2, 3, 4 y 5 se ejecutan en paralelo, se debe traer de memoria la lnea de instruccin 0x4 que contiene la instruccin 5, con lo que es sta ltima direccin la que se carga en el campo TAG del BTB. Se ver a continuacin otro ejemplo de conflicto con el BTB: Branch(Instr2); Instr3; Instr4; Instr5;; Instr6; Branch(Instr7); En ste caso el compilador nos dir: warning detected two instruction lines with predicted jumps within 4 words. Esto es as porque la ltima instruccin de la primera lnea tiene direccin 0x4 que es la misma direccin de la instruccin 7 (5,6,7 y 8 estn en memoria en la misma lnea). Esto se puede resolver sin agregar cdigo extra, que retrase la operacin, de la siguiente manera: Branch(Instr2); Instr3; Instr4; Instr5;; Instr6; Branch(Instr7); Instr8; Instr9;; Ahora el campo TAG tendr cargado una salto en la direccin 0x4 y otro en la direccin 0x8 (que es la direccin de la lnea de instruccin que contiene la instruccin 9).
Hace las veces de buffer de entrada de la fase de bsqueda del pipeline. Mantiene la unidad de bsqueda independiente del resto del pipeline de instrucciones. Esta independencia le permite a la unidad de bsqueda continuar trabajando an cuando otras etapas del pipeline estn paradas. Alinea las entradas (palabras cudruples desalineadas) para preparar lneas completas de instruccin para su ejecucin. Esta alineacin garantiza que lneas completas de instruccin de 1 a 4 cuatro instrucciones se puedan ejecutar en paralelo. Las instrucciones son palabras de 32bits, que se almacenan en memoria sin tener en cuenta la alineacin de palabras cudruples (128-bits) o la longitud de la lnea de instruccin (1 a 4 instrucciones). Con lo que no hay desperdicio de espacio de memoria. Las instrucciones que se ejecutan en paralelo se determinan por el MSB del opcode de cada instruccin, el cul indica si termina o no, una lnea de instruccin. Distribuye las instrucciones de la lnea de instrucciones para su ejecucin en las distintas unidades IALUs, bloques de clculo, y secuenciador.
A travs de estos servicios, el IAB asegura la ejecucin de toda una lnea de instruccin sin tener que insertar ciclos de espera o tener que almacenar en memoria las lneas de instruccin alineadas.
Existe una clara diferencia en la manera en que una llamada es manejada por el secuenciador de programa de un SHARC y por el de un TigerSHARC; y a causa de que los TigerSHARC no poseen pila (stack). La direccin de retorno de la llamada (CALL),en cambio, se guarda en el registro CJMP. Por lo tanto, antes de realizar otra llamada (anidamiento), el registro deber guardarse en memoria para que la direccin de retorno de la llamada anterior no se pierda. Asimismo, el retorno de una llamada, se realiza usando la instruccin CJMP; dicha instruccin es para el TigerSHARC lo que la instruccin RTS para el SHARC. Una diferencia fundamental en los saltos, entre SHARC y TigerSHARC, es que el secuenciador de programa del TigerSHARC no admite los saltos demorados. Por lo tanto, para convertir un salto demorado (es decir, el CALL que tiene la etiqueta (db)), se mueven las 2 instrucciones que estn inmediatamente despus y se las coloca antes del salto. Sin embargo cuando se quiere convertir un salto condicional demorado (por ejemplo: IF EQ JUMP(PC, etiqueta) (db);), se copian las 2 instrucciones que estn inmediatamente despus del salto, y se coloca una copia de las mismas (sin borrar las mismas de su ubicacin original) al comienzo de la direccin de destino del salto. Esto puede verse claramente en el siguiente ejemplo. Ejemplo de salto demorado en SHARK y TigerSHARC: // SHARC (ADSP-21xxx) IF LT jump (PC, 0x15) (DB); r0 = dm(i1,m1); r1 = dm(i1,m1); .... r3 = r0+r1; //Jump destination // TigerSHARC (ADSP-TSxxx) IF XALT, jump 0x15 (NP);; xr0=[j5+=j13];; xr1=[j5+=j13];; .... xr0=[j5+=j13];; //Jump destination xr1=[j5+=j13];; xr3 = r0+r1;; // TigerSHARC preferred method IF XALT, jump label (NP);; xr0=[j5+=j13];; xr1=[j5+=j13];; .... label: xr0=[j5+=j13];; //Jump destination xr1=[j5+=j13];; xr3 = r0+r1;; En el ejemplo anterior puede observarse el reordenamiento de instrucciones. En este ejemplo se tom la decisin de no prever el salto. Ntese que la instruccin se reescribi de manera de seguir usando el salto relativo del PC (PC relative jump). Esto es muy probable que no funcione como se espera debido a las diferentes longitudes de lnea de instruccin que el TigerSHARC requiere. Por sta causa, se recomienda el uso de etiquetas para las direcciones relativas o absolutas en lugar del valor de PC, en toda instruccin que modifique el flujo del programa. Tanto los SHARC como los TigerSHARC soportan la ejecucin del bucle zero-overhead. El SHARC soporta el anidamiento de hasta 6 bucles usando los registros de soporte de bucle del secuenciador de programa. La configuracin de un bucle requiere un registro contador de bucles, una instruccin para disminuir el contador y una instruccin condicional para terminar el bucle en el tiempo requerido. La diferencia fundamental en la configuracin de un bucle, entre SHARC y TigerSHARC, es que los SHARC requieren el uso de una instruccin DO/UNTIL como la instruccin condicional. La instruccin que va inmediatamente despus del DO/UNTIL es la primera del bucle, y la ltima est indicada por la etiqueta. Ejemplo de bucle simple en SHARK y TigerSHARC: // SHARC (ADSP-21xxx) LCNTR=N, DO loop UNTIL LCE; F8=PASS F15, M8=I10; F9=PASS F15, F0=DM(I0,M1); loop: F12=F0*F5, F4=PM(I8,M8); xr4=[k4+=k12];; // TigerSHARC (ADSP-TSxxx) LC0=N;; loop: xfr8=PASS r15; k12=k6;; xfr9=PASS r15; xr0=[j4+=j13];; IF NLC0E,jump loop; xfr12=r0*r5;
Ejemplo de bucles anidados en SHARK y TigerSHARC: // SHARC (ADSP-21xxx) // TigerSHARC (ADSP-TSxxx) /******************************** Outerloop ***********************************/ lcntr=N, do outerloop until lce; k4 = k31 + N;; i4=r2; outerloop: j8 = xr2;; i3=r12; j7 = xr12;; r8=dm(m5,i4); xr8 = [j17+j8];; r4=dm(m5,i3); xr4 = [j17+j7];; r8=r8*r4, i4=r2; xr8 = r8*r4; j8 = xr2;; dm(m5,i1)=r8; [j17+j5] = xr8;; i3=dm(-4,i6); j7 = [j10 + -4];; /******************************** innerloop1 ***********************************/ lcntr=N, do innerloop1 until lce; LC0 = N;; r8=dm(m5,i1); innerloop1: xr8 = [j17+j5];; r4=dm(m5,i4); xr4 = [j17+j8];; r8=r8*r4, i5=i2; xr8 = r8*r4; j9 = xr2;; dm(m5,i3)=r8; [j17+j7] = xr8; /******************************** innerloop2 ***********************************/ lcntr=N, do innerloop2 until lce; LC1 = N;; r8=dm(m5,i0); innerloop2: xr8 = [j17+j4];; r4=dm(m5,i1); xr4 = [j17+j5];; r8=r8*r4; xr8 = r8*r4;; innerloop2: dm(i5,m6)=r8; if NLC1E,jump innerloop2;[j9+=j18] = xr8;; /******************************* end innerloop2 **********************************/ innerloop1: modify(i3,m6); if NLC0E, jump innerloop1; j7 = j7+j18;; /******************************* end innerloop1 **********************************/ r12=r12+1, xr12 = r12+0x1;; modify(i1,m6); j5 = j5+j18; k4 = k4-1;; outerloop: r2=r2+1; if NKEQ, jump outerloop; xr2 = r2+1;; /******************************* end outerloop **********************************/
7.6.Interrupciones
Existen diferencias significativas entre la forma en que se realizan las interrupciones en el SHARC y en el TigerSHARC. El primer punto a sealar es el lugar donde se ubica el vector de interrupciones; en el TigerSHARC no se ubica en la memoria interna o externa como en el SHARC. El TigerSHARC tiene en el controlador de interrupciones unos registros dedicados al almacenamiento del vector de direcciones de interrupcin. Este set de registros, conocido como tabla de vector de interrupciones ( IVT, del ingls), contiene 30 registros. En el SHARC sigue una secuencia de 5 pasos para procesar efectivamente una interrupcin suponiendo que las mismas estn habilitadas: 1. Salida de la direccin del vector de interrupciones. 2. Guardado del valor del PC actual en la pila de PC. 3. Dependiendo de la interrupcin que se halla producido, se guardan los registros ASTAT y MODE1 dentro de la pila de estado. 4. Seteo del bit correspondiente en IRPTL. 5. Modificacin de IMASKP para que refleje el estado de anidamiento de interrupcin actual. El TigerSHARC maneja las interrupciones de manera distinta, esto depende de que si la interrupcin es por hardware o una excepcin de software. Para las interrupciones por hardware, suponiendo que estn habilitadas: 1. 2. 3. 4. Seteo del bit correspondiente en ILATL/ILATH. Salida de la direccin de salto de la interrupcin de IVT. Guardado del PC para el retorno de interrupcin (RETI). A partir de la entrada en la rutina de servicio de interrupcin (ISR), setear los bit correspondientes de PMASKL / PMASKH y el bit 29 de PMASKH para bloquear todas las interrupciones por hardware del ADSP-TS101. Para el ADSP-TS20x en lugar del bit 29 de PMASKH, seteo del bit 21 de SQSTAT para bloquear todas las interrupciones por hardware.
Para las excepciones de software, asumiendo que estn habilitadas: 1. Para el ADSP-TS101, seteo del bit correspondiente en ILATH. Para el ADSP-TS20x, seteo del bit correspondiente en SQSTAT. 2. Salida de la direccin de salto del vector de interrupciones. 3. Guardado del PC actual para retornar (RETS).
Otra diferencia significativa entre las 2 arquitecturas es la forma en que se manejan las interrupciones anidadas. Como el TigerSHARC no tiene pila de PC y no salva los registros (no tiene pila de estado, status stack), stas acciones necesarias para poder llevar a cabo interrupciones anidadas, se deben realizar en la misma ISR. No hay un bit de activacin de anidamiento en el registro de control; por sta causa, todas las interrupciones son desactivadas cuando se entra en la ISR, para poder as, salvar todos los registros en memoria (o en la C run-time stack ). Esto incluye guardar los registros de retorno (RETI register). El hecho de no guardar el registro de retorno (RETI register) antes de permitir la anidacin o reutilizacin de interrupciones se traducir en una prdida de la direccin de retorno. Las interrupciones en el TigerSHARC son anidadas o reutilizadas por la ejecucin de instrucciones especiales. Para interrupciones anidadas se debe guardar el registro RETIB en memoria. Esta ltima accin trae aparejado lo siguiente: 1. Se salva el contenido de RETI en memoria. El actual contenido de RETI es la direccin de retorno de la interrupcin. 2. En el ADSP-TS101, el bit 29 de PMASKH es clareado para permitir que una interrupcin de mayor prioridad sea aceptada si ocurre. En el caso del ADSP-TS20x, es el bit 21 del registro SQSTAT el que es clareado. Si la rutina de servicio de interrupcin es para una interrupcin no-anidada, los registros que se salvan en la pila al comienzo de la ISR son restaurados cuando se ejecuta la instruccin RTI, lo cul vuelve el programa a su flujo normal. Si la interrupcin es anidada, se debe, antes de restaurar los registros, desactivar nuevamente todas las interrupciones a fin de que no se corrompa ningn dato por alguna inclusin inoportuna de una interrupcin de mayor prioridad en ese instante, y por consiguiente, que no se pierda la direccin de retorno. Esto se realiza trayendo el valor del registro RETIB del lugar de
memoria donde se halla guardado. Una vez que este registro es restaurado, no pueden ocurrir futuras interrupciones; esto permite la restauracin segura de los valores de todos los registros. Para salir de la ISR se utiliza la instruccin RTI. Las interrupciones reutilizables se habilitan en el TigerSHARC, usando la instruccin conversin a subrutina RDS [2] [10] (del ingls: reduce to subroutine ). RDS no equivale a la instruccin RTS del SHARC. De manera similar a las interrupciones anidadas, se debe salvar el estado y cualquier registro que se requiera a la pila, incluyendo el registro RETI, antes de ejecutar la instruccin RDS. Para tener la seguridad de que al final de la ISR (que se ha reducido a una subrutina) se podrn restaurar todos los registros, incluyendo la direccin de retorno, todas las interrupciones deben deshabilitarse. Esto puede lograrse mediante un mtodo similar al de las interrupciones anidadas, restaurando la direccin de retorno en el registro RETIB. Los registros de estado del procesador y cualquier otro registro guardado en la pila, puede ser recuperado de manera segura, antes del retorno de la ISR. Para retornar de una ISR que se ha reducido a nivel de subrutina, se debe ejecutar la instruccin RETI. Para ms detalles se recomienda ver la referencia de programa [2]; a continuacin se presentaran algunas comparaciones de cdigo entre el SHARK y el TigerSHARC, para distintos casos de interrupciones. Ejemplo de interrupcin por timer en SHARK y TigerSHARC; para mejorar la legibilidad del mismo se ha eliminado, para el caso del SHARC, gran parte de la tabla de vectores de interrupcin. Junto con la conversin del cdigo debe tambin recalcularse el TPERIOD para el TigerSHARC: //SHARC (ADSP-21160) .... // Vector for status stack/loop // stack overflow or PC stack full: ___lib_SOVFI: NOP; NOP; RTI; RTI; // Vector for high priority timer interrupt: ___lib_TMZHI: jump timerhi_isr; NOP; RTI; RTI; // Vectors for external interrupts: ___lib_VIRPTI: NOP; NOP; RTI; RTI; #include "def21160.h" .GLOBAL .GLOBAL start; timerhi_isr; seg_pmco; #include "defTS201.h" .GLOBAL .GLOBAL start; timerhi_isr; //TigerSHARC (ADSP-TS201)
.SECTION/PM start:
.SECTION program; start: /* Set up interrupt vector table */ j0 = timerhi_isr;; IVTIMER0HP = j0;; /*set to 0x1000 SOCCLK cycles*/ xr0 = 0x1000;; xr1 = 0x0;; TMRIN0L = xr0;; TMRIN0H = xr1;;
/******************** Enable high priority timer interrupt ***********************/ BIT SET IMASK 0x10; xr0 = IMASKH;; xr0 = bset r0 by INT_TIMER0H_P;; IMASKH = xr0;;
/************************* Set global interrupt enable ***************************/ BIT SET MODE1 0x1000; SQCTLST = SQCTL_GIE;; /********************************* Enable TIMER **********************************/ BIT SET MODE2 0x20; xr0 = INTCTL;; xr0 = bset r0 by INTCTL_TMR0RN_P;; INTCTL = xr0;; /********************************* Endless loop **********************************/ do_nothing: do_nothing: NOP; NOP;; NOP; NOP;; JUMP do_nothing; JUMP do_nothing;; start.END: start.END:
/**************************** Interrupt Service Routine **************************/ timerhi_isr: timerhi_isr: nop; nop;; nop; nop;; nop; nop;; nop; nop;; rti; rti(ABS)(NP);; Ejemplo de comparacin de cdigo entre SHARK y TigerSHARC; en el mismo se muestra como se reutiliza una interrupcin, el hecho de que la ISR ha sido reducida a una subrutina permite que puedan tenerse interrupciones de mayor y menor prioridad: // SHARC (ADSP-21160) .... ___lib_IRQ1I: NOP; NOP; RTI; RTI; // TigerSHARC (ADSP-TS201)
// The CI option allows for the interrupt to occur again while being serviced ___lib_IRQ0I: jump irq0_isr(CI); NOP; RTI; RTI; #include "def21160.h" #include "defTS201.h" .GLOBAL .GLOBAL start; irq0_isr; seg_pmco; .GLOBAL .GLOBAL .SECTION start: start; irq0_isr; program;
.SECTION/PM start:
/* Set up interrupt vector table */ j0 = irq0_isr;; IVIRQ0 = j0;; /************************* Set IRQ0 to edge sensitive ****************************/ BIT SET MODE2 0x1; xr0 = INTCTL;; xr0 = bclr r0 by INTCTL_IRQ0_EDGE_P;; IMASKH = xr0;; /**************************** Enable IRQ0 interrupt ******************************/ BIT SET IMASK 0x100; xr0 = IMASKH;; xr0 = bset r0 by INT_IRQ0_P;; IMASKH = xr0;; /************************* Set global interrupt enable ***************************/ BIT SET MODE1 0x1000; SQCTLST = SQCTL_GIE;; /********************************* Endless loop **********************************/
/**************************** Interrupt Service Routine **************************/ irq0_isr: irq0_isr: // Save any registers to stack // Perform any register saves to // stack first //Save return address to stack [j27+=-4] = RETI;; // Reduce to subroutine RDS;; // Perform required operation here // Perform required operation here // Disables all further interrupts and // restore return address from stack RETIB = [j27+0x4];; j27 = j27 + 4;; // Modify stack pointer // Restore any registers from stack // Restore any other registers that // were saved to the stack here // Return from interrupt and allow for // interrupts to occur again RETI (ABS)(NP); [j27+=j31] = RETIB;;
RTS(LR)
8.1.Cambio de contexto
El ADSP-TS201 tiene la habilidad de salvar y/o recuperar de una pila en 2 bloques de memoria interna, ms de 8 registros por ciclo de reloj. Esta capacidad de guardar/recuperar rpidamente, le permite al TigerSHARC atender de manera eficiente las interrupciones y realizar rpidos cambios de contexto (capacidad que habilita al TigerSHARC para soportar sistemas operativos multitarea)
8.3.Direccionamiento relativo
La mayora de las instrucciones del procesador TigerSHARC, soportan saltos relativos de PC con lo que el cdigo puede ser fcilmente reubicado. Adems, la mayora de las referencias de ubicacin de datos son relativas, lo que significa que cualquier programa puede acceder a un bloque de datos ubicado en una direccin relativa a un registro base.
9.Bibliografa y Agradecimientos
9.1.Bibliografa
1. ADSP-TS201 TigerSHARC Processor Hardware Reference. Analog Devices, Inc. 2. ADSP-TS201 TigerSHARC Processor Programming Reference. Analog Devices, Inc. 3. De Wikipedia, la enciclopedia libre. 4. Codificacin de Canal. Turbocodificacin. Matilde Snchez, Javier Ramos; Universidad Carlos III de Madrid. 5. Decodicador de Viterbi. Alberto Rodrguez Garca, Oscar Maroto Hernando. 5 de abril de 2003. 6. ADSP-TS20x TigerSHARC Processor Boot Loader Kernels Operation (EE-200), Analog Devices, Inc. 7. Considerations for porting code from the ADSP-TS101S TigerSHARC processor to the ADSP-TS201S TigerSHARC processor (EE-205), Analog Devices, Inc. 8. ADSP-TS201S TigerSHARC Embedded Processor Data Sheet. Analog Devices, Inc. 9. Explaining the Branch Target Buffer on the ADSP-TS101. Analog Devices, Inc. 10. SHARC DSPs to TigerSHARC Processors Code Porting Guide (EE-241). Analog Devices, Inc.
9.2.Agradecimientos
Al Altsimo Dios, Creador del cielo y de la tierra, fuente de toda sabidura y conocimento, y mi inspiracin. A mi profe de Tcnicas Digitales III, Guillermo Friedrich, por su gran paciencia y por su colaboracin para que este informe sea algo ms que un mero traducir hojas de datos y referencias de hardware y software. A todos muchas pero muchas GRACIAS!!!