3.1 Introduction to the chapter
3.5. Research Methods: Primary Data Gathering
3.5.2. Phase Two (Part A) Inductive enquiry through semi-structured interviews
El hecho de tener una memoria de datos y otra de instrucciones corresponde a una arquitectura Harvard, donde se busca tener una memoria con dos puertos. En este caso la memoria de datos maneja 72 bits de entrada para almacenar y 72 bits de salida (lectura). Este tamaño de palabra es para almacenar o leer el equivalente a tres registros. Para poder leer una dirección de memoria se consideran una entrada de 24 bits. En la Figura 4.3 se muestra la memoria de datos.
4.4 Memoria de Instrucciones
Los formatos de la instrucción son todos de un tamaño de 24 bits. Los desplazamientos hechos para los accesos de memoria y las operaciones que ocupan valores inmediatos hacen uso de un corrimiento o extensión de signo. Los desplazamientos para saltos absolutos requieren 12 bits y la dirección de salto absoluta es calculada por la concatenación del PC con los doce bits del desplazamiento. En la Tabla 4.1 se muestra un listado de las operaciones que se pueden realizar en la ALU y la forma de construir las instrucciones para la unidad. La Figura 4.4 muestra el esquemático RTL de la Memoria de instrucciones.
Tabla 4.1 Listado de instrucciones
Op Rs Rt Ru Rd Instrucciones Operaciones
4 bits 5 bits 5 bits 5 bits 5 bits
add Rd, Rs, Rt Rd = Rs + Rt 2 0-15 0-15 0-15 0-15 sub Rd, Rs, Rt Rd = Rs – Rt 6 0-15 0-15 0-15 0-15 Nop No operation 0 0 0 0 0 and Rd, Rs, Rt Rd = Rs and Rt 1 0-15 0-15 0-15 0-15 or Rd, Rs, Rt Rd = Rs or Rt 9 0-15 0-15 0-15 0-15 nor Rd, Rs, Rt Rd = Rs nor Rt 3 0-15 0-15 0-15 0-15 xor Rd, Rs, Rt Rd = Rs xor Rt 4 0-15 0-15 0-15 0-15 not Rd, Rs Rd = not Rs 5 0-15 0 0 0-15 slt Rd, Rs, Rt if(Rs<Rt) Rd=1; else Rd=0; 7 0-15 0-15 0-15 0-15 Lw Rt, offset(Rs) Rt = Mem[offset + Rs] 8 0-15 0-15 0-15 0-15 St Rt,
offset(Rs) Rt = Mem[o ffset + Rs] A 0-15 0-15 0-15 0-15
Pi Rd,Rs,Rt Inicializar Rd1=Rs1sumcorrRt1 Rd2=Rs2sumcorrRt2 Rd3=Rs3sumcorrRt3 B 0-15 0-15 0-15 0-15 D Rd,Rs,Rt,Ru Recursión Rd1=max(Rs1sumcorr Ru1-3)sumcorrRt1 Rd2=max(Rs2sumcorr Ru4-6)sumcorrRt2 Rd3=max(Rs3sumcorr Ru7-9)sumcorrRt3 C 0-15 0-15 0-15 0-15 Ln Rd,Rs Logaritmo D 0-15 0-15 0-15 0-15 beq Rs, Rt,offset If(Rs<Rt) pc<- pc+offset+4 E 0-15 0-15 0-15 0-15 jmp
Figura 4.4 Unidad de Memoria de Instrucciones
4.5 Unidad ALU
La Unidad Aritmético Lógica se encuentra formada por otras subunidades que dependiendo de la operación a realizar es la que se ocupa, ya que se encuentra formada por módulos que operan sobre dos (operaciones lógicas, saltos, suma o resta), tres (logaritmo), seis (Inicializar el algoritmo) o quince (iteraciones del algoritmo) datos de entrada, entregando 72 bits o 24 bits dependiendo de la operación realizada. En la Figura 4.5 se muestra el bloque de la ALU combinada.
La unidad ALU es la encargada de operar sobre dos registros nada más, esto es para operaciones lógicas y para calcular direcciones de salto. Cuenta de una bandera de zero y solo opera sobre los 22 bits menos significativos de la operación. Se muestra en la Figura 4.6.
Figura 4.6 ALU
El módulo usado para sacar logaritmos es parte de [4], y usa 13,392 bits para las tablas. Todas las pruebas de su librería incluían diseños sin segmentación, proveyendo un amplio rango de opciones para diseños segmentados. La aritmética LNS debe tener su caso del peor error relativo menor que el caso del peor error relativo de punto flotante con redondeo correcto. Reportan que sus operadores pueden operar en una arquitectura Virtex II hasta una velocidad de 100 MHz, esto se comprobó sintetizando el circuito y se encontró que puede operar a 138 MHz. A continuación se muestra la unidad de logaritmo:
Figura 4.7 Unidad de Logaritmo
El módulo utilizado para inicializar el algoritmo constaba de seis registros de entrada, en este caso los valores de nB son los de la matriz de símbolos y nI son los de las condiciones iniciales. Para este bloque se obtienen resultados cada ciclo.
M U L
Figura 4.8 Unidad para Inicializar el algoritmo
Corrimiento M U X A δ
El módulo usado para las iteraciones de Viterbi, a comparación del de condiciones iniciales este requiere 15 datos de entrada. Y es el encargado de evaluar las mejores secuencias. Hace uso de unidades de multiplicación en el dominio logarítmico, comparadores y una unidad encargada de ponerle banderas para poder seguir la mejor ruta. En la Figura 4.9 se muestra sólo un módulo, ya que son tres módulos iguales al que se muestra los que conforman la unidad implementada para la recursión del algoritmo de Viterbi.
M U L
Figura 4.9 Unidad de Viterbi Recursiva
Comparador y banderas B Corrimiento M U L M U X A δ Corrimiento M U L M U X A δ Corrimiento M U X A δ M U L Corrimiento M U X
En la Tabla 4.2 se muestran las banderas ocupadas (a la izquierda) para hacer la búsqueda de la mejor secuencia (traceback). Esto es parte del diseño para interpretar los
resultados de los comparadores (a la derecha). Así los bits 000 representan el resultado de comparar el primer número con el segundo número (primer bit), luego el segundo bit es el resultado de comparar el primer número con el tercer número y el último bit representa la comparación del segundo número con el tercer número.
Tabla 4.2 Banderas para el traceback
000 El mayor es 3 asigna 10 001 El mayor es 2 asgina 01 010 El mayor es 1 asigna 00 011 El mayor es 2 asigna 01 100 El mayor es 3 asigna 10 101 El mayor es 1 asigna 00 110 El mayor es 1 asigna 00 111 El mayor es 1 asigna 00
La unidad de control sigue la siguiente lógica y se encuentra basada en [25], esta unidad es la encargada de enviar las señales correctas para activar o desactivar funciones en las diferentes unidades del procesador:
Tabla 4.3 Formato para las instrucciones de control
Instrucción RegDst ALUSrc Reg Write Read Write Branch Delay
R-Format 1 0 0 1 0 0 0 0 Load 0 1 1 1 1 0 0 0 Store X 1 X 0 0 1 0 0 BEQ X 0 X 0 0 0 1 0 Recursión 1 0 0 1 0 0 0 1
4.6 Unidad de Forward
Es muy común encontrar errores que limitan el desempeño de la segmentación, debido a la dependencia de los datos con las instrucciones anteriores, para un detalle más amplio sobre estos errores consultar [25]. Esta unidad es la encargada de enviar los datos necesarios para evitar retrasos por dependencia de datos lo cual es muy conveniente, ya que todo el algoritmo es recursivo, lo que quiere decir que la instrucción actual depende de datos producidos en la operación anterior. En la Figura 4.10 se muestra la unidad de Forward usada para poder mejorar el desempeño de la segmentación y no recurrir a parar las unidades, o al menos hacerlo el menor número de veces.
Figura 4.10 Unidad de Forward
4.7 Comparación de Instrucciones
Las instrucciones que se han incluido en la ALU, realizan más de una operación por instrucción, buscando explotar el paralelismo y la ventaja de transformar los datos de una manera específica. Por ejemplo la instrucción de Inicialización ó Pi involucra en este diseño tres sumas más tres corrimientos en un procesador MIPS[25], esto equivaldría a seis ciclos de reloj, que dan un tiempo de 28.04 ns. En este caso no es tan notorio el uso de esta unidad, sin embargo al usar la recursión ó D su uso se hace evidente.
La instrucción D equivale a realizar nueve sumas en paralelo más nueve corrimientos más nueve comparaciones y eso en serie con tres sumas y tres corrimientos. Son 33 operaciones las que se realizan, esto le tomaría al procesador MIPS 33 ciclos de reloj, es importante notar que este procesador puede operar a 214 MHz en un FPGA, para realizar esta operación se requieren 154.21 ns.
Las operaciones de store y load, en el MIPS sólo cargan un dato a la vez mientras que
con la arquitectura que se propone se pueden hacer tres loads ó tres stores a la vez.
Aunque esto se ve compensado por la velocidad a la que puede operar el MIPS.
La operación de logaritmo en un procesador como el Itanium tiene una latencia de 52 ciclos en precisión doble[32], operando a 1GHz, o sea que se requieren 52 ns para obtener un logaritmo. Mientras que con el paralelismo qué se implemento en este procesador se obtienen tres logaritmos en 13.871 ns. La operación de la exponencial ocupa 60 ciclos de reloj en el Itanium y esta operación puede ser necesaria para que los datos se encuentren en la misma base y no haya conflictos. Mientras operaciones como la división en precisión sencilla llegan a tener una latencia de 24 ciclos[33].
En el set de instrucciones del Intel Itanium las operaciones incluidas para punto flotante tienen suma y comparación que son parte de las instrucciones necesarias para realizar una recursión de Viterbi, suponiendo que con las operaciones de floating point compare y
floating point add [34] se necesitarían 12 sumas y 9 comparaciones. La latencia de las
sumas y comparaciones en punto flotante es de 4 ciclos [25], es importante mencionar que este procesador es 25% mejor en cuanto a desempeño que el Pentium 4 al hacer las pruebas de SPECFP2000 [33]. Este procesador puede explotar paralelismo, sin embargo solo cuenta con 2 unidades de punto flotante, por lo que estaría consumiendo 20 ciclos de reloj aproximadamente debido a que hay dependencia entre algunas sumas y comparaciones, que operando a una frecuencia de 1 GHz, tardaría 20 ns.
Capítulo 5. Resultados
En este capítulo se tratarán las herramientas de hardware y software utilizadas en el diseño del procesador y lo obtenido con cada herramienta, así como la comparación con el ejemplo dado en el capítulo 3 del algoritmo de Viterbi para ver el funcionamiento de la implementación. Los diagramas de tiempo de la simulación de PVit se encuentran en el Apéndice B.
5.1. Contexto experimental
Hay una gran variedad de dispositivos programables, y cada uno ofrece diferentes ventajas, se eligió usar un FPGA debido a la capacidad de lógica que se puede implementar con compuertas, y a la flexibilidad que ofrecen para explotar paralelismo.
5.1.1 Software / Descripción de los programas utilizados.
• Xilinx ISE (Integrated Software Environment) es el software de diseño de Xilinx
que permite tomar el diseño en VHDL o Verilog hacia algún dispositivo programable. El navegador de proyecto administra y procesa el diseño a través de los pasos de que exigen el flujo de diseño.
o Diseño de entrada: Hacer un archivo top-level de diseño usando un
Lenguaje de Descripción de Hardware (HDL).
o Síntesis: Después de simular el diseño de entrada, éste se convierte en archivos de listas de redes (matrices) que son aceptados como entradas para la implementación.
o Implementación: En este paso se convierte la lógica de diseño en un archivo físico que se puede bajar al dispositivo seleccionado.
o Verificación: Se puede hacer en cada una de las etapas pero también trae herramientas para verificar los retardos y la potencia de la implementación.
o Configuración del dispositivo: Después de generar el archivo programador se puede configurar el dispositivo.
• FPGA Advantage: Es una plataforma de diseño que permite trabajar en
dispositivos de Silicio como PLD, FPGA, ASIC y SOC’s, así como diferentes lenguajes a parte de los HDL como C/C++, PSL y SVA. Similar al ISE, pero con una interfaz gráfica muy sencilla para hacer diagramas a bloques.
• Mentor Graphics ModelSim: es una herramienta para simular y depurar diseños en HDL. Permite el análisis de los circuitos mediante diagramas de tiempo. Así como de la información de registros y memorias.
• XPower: Permite analizar de manera interactiva y automática el consumo de potencia para dispositivos FPGA de Xilinx. También se puede salvar una simulación VCD de ModelSim para analizar estimación con ciertos estímulos.
• ChipScope: Integra componentes en hardware que permiten analizar la lógica de diseño dentro del dispositivo FPGA de Xilinx (similar a un analizador de señales).