<<

SoftCAM: una memoria direccionable por contenido para dispositivos de lógica programable

Danilo Andrés Mendivelso Pardo

Directores: Francisco Viveros Moreno y Jose Luis Uribe Aponte

Pontificia Universidad Javeriana Facultad de Ingeniería Departamento de Electrónica Bogotá, mayo de 201

Tabla de contenido 1 Introducción ...... 5 1.1 Justificación ...... 6 1.2 Convenciones tipográficas ...... 6 2 Marco teórico ...... 7 2.1 Memoria Direccionable por Contenido (CAM) ...... 7 2.1.1 Enrutamiento en redes de paquetes ...... 7 2.1.2 Caché de procesadores ...... 7 2.2 Componentes IP (IP cores) ...... 8 3 Objetivo del proyecto ...... 9 4 Desarrollo ...... 10 4.1 Definiciones previas ...... 10 4.2 Herramientas de desarrollo ...... 10 4.3 Primera iteración ...... 12 4.3.1 Concepción ...... 12 4.3.2 Diseño ...... 12 4.3.3 Limitaciones y conclusión del funcionamiento...... 12 4.4 Segunda iteración ...... 13 4.4.1 Concepción ...... 13 4.4.2 Diseño ...... 13 4.4.3 Conclusión del funcionamiento ...... 14 4.5 Solución final ...... 14 4.6 Arquitectura ...... 14 4.6.1 Diagrama de bloques ...... 15 4.6.2 Espacio de direcciones ...... 18 4.6.3 Descripción al nivel de transferencia de registros...... 19 4.7 Implementación ...... 21 4.7.1 Descripción en VHDL y síntesis ...... 21 4.8 Operación ...... 24 4.8.1 Uso de en un proyecto ...... 24 4.8.2 Operación del dispositivo ...... 25 5 Protocolo de pruebas ...... 27 5.1 Simulación ...... 27 5.1.1 SearchLogic ...... 27 5.1.2 Control ...... 28 5.1.3 SoftCAM ...... 29 5.2 Pruebas de la interfaz de lectura y escritura en FPGA ...... 30 5.2.1 Caso: Escritura de una posición de memoria ...... 30 5.2.2 Caso: Lectura de una posición de memoria ...... 30 5.3 Pruebas en FPGA de las operaciones de búsqueda ...... 30 5.3.1 Caso: Búsqueda de una clave que se conoce no se encuentra almacenada...... 31 5.3.2 Caso: Búsqueda de una clave que se conoce está almacenada...... 33 6 Resultados, conclusiones y recomendaciones...... 34 6.1 Oportunidades de crecimiento de SoftCAM ...... 34 7 Bibliografía ...... 36

Lista de figuras Figura 1. Uso de Microsoft Visual Studio Team Services...... 11 Figura 2. Vista web del repositorio del código VHDL en Team Foundation Server online...... 11 Figura 3. Arquitectura de comparación directa...... 12 Figura 4. Diagrama de la segunda idea...... 14 Figura 5. Vista general de entradas y salidas...... 15 Figura 6. Bloques internos del sistema...... 16 Figura 7. Lógica de búsqueda (SearchLogic)...... 17 Figura 8. Contenido de un RAMSet...... 18 Figura 9. Direcciones externas...... 18 Figura 10. Proceso de búsqueda...... 19 Figura 11. Respuesta esperada ante una operación de búsqueda con acierto...... 20 Figura 12. Comportamiento esperado en caso de no encontrar acierto...... 20 Figura 13. Estructura de archivos y carpetas...... 22 Figura 14. Vista del resultado de síntesis del nivel más alto...... 23 Figura 15. Vista interior de SearchLogic como resultado de síntesis...... 24 Figura 16.Contenido de un RAMSet en el resultado de síntesis...... 24 Figura 17. Resultados de simulación de una escritura en SearchLogic. Este continúa en la siguiente figura...... 28 Figura 18. Resultados de simulación de una búsqueda de un dato anteriormente escrito en SearchLogic. Continuación del diagrama de tiempos anterior...... 28 Figura 19. Resultados de simulación de la prueba de escritura y búsqueda de la unidad de control...... 29 Figura 20. Resultado de la simulación de la prueba de búsqueda sin acierto...... 29 Figura 21. Escritura de tres posiciones y búsqueda de la clave CAFEh con su respuesta...... 29 Figura 22. Prueba de dos aciertos y un no acierto...... 30 Figura 23. Contenido de la memoria durante las pruebas...... 31 Figura 24. Resultado de una búsqueda sin acierto. Parte 1 de 4...... 32 Figura 25. Resultado de una búsqueda sin acierto. Repeticiones 2 a 4 del proceso de búsqueda. Parte 2 de 4...... 32 Figura 26. Resultado de una búsqueda sin acierto. Repeticiones 4 a 6 del proceso de búsqueda. Parte 3 de 4...... 32 Figura 27. Resultado de una búsqueda sin acierto. Repeticiones 7 a 8 del proceso de búsqueda. Parte 4 de 4...... 33 Figura 28. Resultado en el caso del acierto de la clave CAFEh que se relaciona con C0h ...... 33

Lista de tablas Tabla 1. Puertos del dispositivo...... 15 Tabla 2. Códigos de los modos de operación...... 16 Tabla 3. Parámetros globales en SoftCAMDefinitions...... 21 Tabla 4. Parámetros de la entidad SoftCAM...... 21 Tabla 5. Uso de recursos en la FPGA vs tamaño de la memoria con claves de 16 bit y valores de 8 bit. ... 24 Tabla 6. Funciones de los puertos en modo lectura o escritura...... 25 Tabla 7. Puertos involucrados en una búsqueda CAM...... 25 Tabla 8. Valores esperados...... 31 Tabla 9. Valores esperados...... 33

Danilo A. Mendivelso P.

1 Introducción Las memorias de semiconductor son dispositivos que permiten almacenar información binaria de forma organizada. Los sistemas digitales que requieren persistencia de datos o estados, demandan el uso de memorias. La información es organizada de manera semejante a una lista numerada donde cada entrada se identifica con un valor único correspondiente a una secuencia lineal. Estos dispositivos pueden ofrecer un solo puerto de datos donde se escriben o leen los contenidos, una señal de control para indicar la operación a realizar, y una entrada llamada dirección donde se indica la posición a leer o escribir. A este tipo de memoria se le llamará en este documento memoria de un puerto direccionada por identificador único. En el nombre, la denominación de un puerto se debe a que también existen memorias con dos puertos de datos, y dos de direcciones que permiten lectura y escritura simultánea en posiciones diferentes, caso en el cual el nombre cambia a memoria de dos puertos direccionada por identificador único. Uno de los sistemas más usados en la vida moderna, es el procesador digital de propósito general, el cual para su funcionamiento requiere usar memorias que le proporcionen las instrucciones a ejecutar y el espacio para almacenar y leer resultados según lo que el programa indique. A la fecha, sistemas que usen uno o más procesadores para realizar su función son parte de la vida cotidiana del hogar, la oficina y la industria. Los programas que se ejecutan en estos equipos, en algunos casos, deben hacer búsquedas de contenido tabular. Ejemplo de esto son los enrutadores y switches cuyos procesadores hacen uso de memorias como las ya descritas, las cuales presentan limitantes de tiempo. Lo anterior debido a que, como parte fundamental de su operación, deben hacer búsquedas en tablas de enrutamiento almacenadas. Los tiempos de búsqueda son proporcionales al tamaño de esta y a la ubicación de lo buscado. Es aquí donde la memoria direccionable por contenido (CAM por sus siglas en inglés, provenientes de Content Addressable Memory) ofrece una mejora en el desempeño con tiempos de búsqueda independientes del tamaño y posición. En memorias de un puerto direccionadas por identificador único, la búsqueda de un dato debe realizarse en forma iterativa, haciendo de este un proceso intensivo en cantidad de operaciones secuenciales. En caso de que lo buscado no resida en la memoria, el sistema detectará esto sólo hasta el final del proceso, siendo los pasos anteriores desperdiciados para el sistema que busca. Una memoria direccionable por contenido es un sistema digital, que al igual que las memorias anteriormente descritas, permite almacenar información binaria. Sin embargo, su propósito es encontrar la ubicación de un dato suministrado como entrada dentro del arreglo de memoria en un lapso de tiempo independiente de la posición del dato buscado, y en caso de no estar luego de un intervalo de similar duración, notificar la situación. Asimismo, las tablas de búsqueda, como las de enrutamiento, sugieren una estructura asociativa de dos elementos donde uno identifica al otro. En este documento el identificador se denominará clave y el dato asociado se llamará valor. Otra aplicación de este tipo de memoria se encuentra en un computador, donde a causa de la diferencia de velocidad entre la memoria principal y el procesador, se incluye una de menor capacidad denominada caché, más rápida que la principal. Ésta se encarga de almacenar datos e instrucciones frecuentemente usados, junto con la dirección correspondiente en el almacenamiento principal. El procesador al acceder a la memoria, primero revisa en la caché si la dirección solicitada se encuentra en esta, en caso negativo debe recurrir a la memoria principal. Una CAM asociativa puede usarse como caché si las claves son las direcciones referenciadas de la memoria principal, y los valores son los datos recuperados desde la dirección correspondiente a la clave. Las ventajas anteriormente mencionadas mejoran el tiempo de acceso frente a una implementación no CAM. Teniendo en cuenta todo lo anteriormente descrito, es de importancia resaltar que con el presente proyecto se busca diseñar, implementar y verificar la arquitectura de una memoria asociativa direccionable por contenido en un dispositivo de lógica programable.

SoftCAM 5 Danilo A. Mendivelso P. 1.1 Justificación En memorias de un puerto, direccionadas por identificador único, la búsqueda de un dato debe realizarse en forma iterativa, haciendo de este un proceso intensivo en cantidad de operaciones secuenciales. En caso de que lo buscado no resida en la memoria, el sistema detectará esto sólo hasta el final del proceso, siendo los pasos anteriores desperdiciados para el sistema que busca. Debido a los costos que implica un diseño en ASIC (siglas en inglés de: circuito integrado de aplicación específica) se usará una FPGA (Field Programmable Gate Array) con la cual los costos serán mucho menores y donde es posible corregir errores encontrados durante el desarrollo. Esto último se debe a que en ASIC las características de tiempos de propagación y consumo de energía pueden modificarse en el proceso de diseño, ofreciendo resultados. Por esta razón se llegará a una arquitectura de memoria CAM donde se puedan mostrar los beneficios del funcionamiento desde la escala de tiempos que la tecnología de prototipado permite.

1.2 Convenciones tipográficas A lo largo del texto se hará referencia a diferentes elementos por sus nombres. Algunos de estos serán diferenciados mediante el formato del texto, según el tipo al que pertenezcan. En primer lugar, los nombres de los puertos y estados de control se escribirán en mayúsculas itálicas, al igual que extranjerismos y nombres de bloques en el texto. Por ejemplo, el puerto DATA. Por otro lado, los extractos de código fuente se presentan en letra monoespaciada y en negrilla las palabras reservadas. Por ejemplo, una expresión de asignación en VHDL register_a <= input_a and register_a. De igual forma, en los diagramas de bloques las señales de más de un bit tienen un grosor mayor a aquellas de uno solo, de igual manera cuentan con un indicador de cantidad de bits esquematizado como una línea oblicua al cable. Finalmente, los bloques sincrónicos cuentan con un triángulo en el costado izquierdo del símbolo. Ahora bien, con miras a la internacionalización del diseño, los nombres de los componentes están en inglés, lo cual puede verse en los diferentes diagramas y consecuentemente en las menciones de los mismos en el texto.

SoftCAM 6 Danilo A. Mendivelso P. 2 Marco teórico 2.1 Memoria Direccionable por Contenido (CAM) Una memoria direccionable por contenido es un dispositivo que almacena información y permite buscar en sus contenidos. Idealmente ofreciendo resultados en un tiempo correspondiente a un ciclo del reloj de operación, independiente de la posición, los datos y si están o no [1]. Al contrario de las memorias usadas ampliamente en equipos electrónicos que requieran almacenar información, donde se le proporciona una dirección, es decir un identificador de ubicación y esta entrega el contenido alojado en el espacio correspondiente que se identifica de manera única por esta dirección, una memoria CAM recibe un dato potencialmente contenido, no una ubicación y entrega como resultado una ubicación o la notificación que lo ingresado no existe en el espacio de almacenamiento. La pregunta que responde RAM es ¿Qué hay ahí en ese lugar? Una memoria CAM por su lado responde ¿Está en algún lado? y ¿dónde está ubicado ese elemento? Información relacionada de alguna manera puede ser almacenada en una CAM asociativa, permitiendo obtener respuesta de la ubicación de un elemento y de su dato asociado. Este sistema permite buscar a partir de un elemento aquel que se relacione con este. Una analogía que ilustra esto se basa en un diccionario español a inglés, donde cada palabra se le asigna otra. Al traducir una palabra desde el español, esta se busca en la margen izquierda de la columna y cuando se encuentra, se toma aquella a la derecha de esta. En caso de no existir se da a conocer la situación. 2.1.1 Enrutamiento en redes de comunicaciones Las redes de comunicaciones basadas en Ethernet usan dispositivos que permiten conformarlas y conectar varias, estos son los switches y enrutadores, a través de estos se direcciona la información en la red con el objetivo que los mensajes lleguen a su destino. Los dispositivos mencionados cuentan con más de un puerto de entrada y salida, en cada uno de estos puede conectarse un dispositivo que requiera hacer uso de la red recibiendo o enviando información a otros allí vinculados. Cuando un equipo es conectado a un switch, este lo identifica con su dirección MAC y relaciona esta con el puerto físico al que se encuentra vinculado, ya que cuando llega un mensaje por algún puerto, este contiene información de origen y destino en términos de este identificador MAC, por lo que el switch debe traducir esto en el número de puerto físico por el cual debe enviar la comunicación [2]. En equipos de escala empresarial donde en una misma red pueden estar más de cien aparatos vinculados a una misma red, e incluso conectados al mismo switch soportando velocidades cercanas a 1 Gbps. Este tipo de escenarios requieren que la información que llega por un puerto sea rápidamente enviada por otro, según la información de destino que la comunicación indique y una regla de envío en el dispositivo, establezca la relación de puertos. Esta regla de envíos es almacenada en memorias CAM asociativas capaces de entregar una rápida respuesta de cuál puerto tiene asociada una dirección MAC específica. 2.1.2 Caché de procesadores Debido a la diferencia de velocidad entre la memoria principal y el procesador de un computador moderno, la lectura de datos e instrucciones desde la primera hacia la segunda y viceversa hace que el sistema lleve a cabo cada una de sus operaciones residentes en memoria tan rápido como esta pueda entregarle nuevas instrucciones y datos del programa en ejecución. Debido a esto una de las técnicas usadas para mitigar este inconveniente es el uso de una memoria más rápida, más costosa y por lo tanto más pequeña, entre el procesador y la memoria principal, usada especialmente cuando hay porciones de programa que se repiten o datos frecuentemente usados, evitando consultar el lento almacenamiento una y otra vez. Esta funciona como un espejo de algunas secciones en RAM Cuando el procesador pregunta por una ubicación de memoria, esta es buscada en la caché, en caso que no esté allí debe buscarse en la principal, pero en caso de ser encontrado, esta pequeña memoria entrega los contenidos que se reflejaron en esta desde la RAM. Esto implica que la caché relaciona la dirección original en la memoria principal y el contenido allí disponible. Con la finalidad de lograr lo anterior las cachés se implementan usando una CAM asociativa.

SoftCAM 7 Danilo A. Mendivelso P. 2.2 Componentes IP (IP cores) Un componente de propiedad intelectual (en inglés Intellectual Property y de ahí IP) es el conjunto de objetos y código fuente que describen, configuran e implementan un cierto diseño de manera que pueda ser reutilizado [3]. Este es al hardware lo que las bibliotecas (libraries) son al software.

SoftCAM 8 Danilo A. Mendivelso P. 3 Objetivo del proyecto Diseñar, implementar y verificar la arquitectura de una memoria asociativa direccionable por contenido, en un dispositivo de lógica programable. Se parte de la premisa que los datos no están ordenados ni se busca que lo estén ya que esto implicaría un proceso de diseño que puede tomar las dimensiones de otro trabajo de grado.

SoftCAM 9 Danilo A. Mendivelso P. 4 Desarrollo El proceso desde la concepción de las ideas hasta la obtención del resultado final, comprende actividades y acciones susceptibles de ser reiniciadas en caso que el resultado parcial no se alinee con el objetivo. Durante la realización del presente proyecto, fue necesario revisar la arquitectura planteada en una primera iteración, ya que el resultado se veía afectado por la implementación, específicamente por el comportamiento real frente al teórico. Debido a lo anterior, se descartó esta primera arquitectura y se comenzó de nuevo el proceso, buscando una idea nueva. En síntesis, se realizaron dos iteraciones, cada una con un momento de concepción de la idea y uno de diseño. Finalmente se llegó a una solución, la cual es desarrollada e implementada. 4.1 Definiciones previas Durante el desarrollo del proyecto, los elementos y acciones recibieron un nombre que permite sean identificados de manera unívoca a lo largo del proceso de diseño. El dato a buscar se llamará referencia. El par de elementos asociados será una clave y un valor denotados como clave:valor. Por ejemplo, la clave 0xCAFE que se relaciona con el valor 0x18 se denota como 0xCAFE:0x18. Un acierto de búsqueda es referido en los diagramas como hit y un no acierto como miss. El nombre del proyecto está basado en la forma en la que se referencian los sistemas descritos mediante algún HDL e implementados en un dispositivo lógico programable. Estos diseños, especialmente procesadores [3], son nombrados anteponiendo la palabra inglesa soft o softcore en contraposición a un sistema implementado como ASIC, donde el prefijo es hard, cuando puede darse lugar a confusiones. 4.2 Herramientas de desarrollo La implementación del diseño final se hizo en una FPGA presente en un sistema de desarrollo, este cuenta con diferentes periféricos conectados al dispositivo, al igual que con los conectores para estos y algunos puertos. El sistema seleccionado fue Terasic DE2-115, principalmente por tener una FPGA Altera Cyclone IV, la cual cuenta con gran cantidad de elementos lógicos, recursos de memoria dedicada al interior del dispositivo y hardware de comunicación JTAG para el usuario. También se seleccionó DE2-115 por tener un sistema USB Blaster y un dispositivo de configuración que almacena el bytestream de manera no volátil. Estos se conectan a la FPGA sobre la placa de circuito impreso ayudando a simplificar el proceso operativo de despliegue de las pruebas y la solución final. En función del dispositivo Cyclone IV, se utilizó Altera Quartus que es un entorno integrado de desarrollo de hardware, que acompaña el proceso de diseño y permite el despliegue en los dispositivos de este fabricante. Esta se encarga de ofrecer una herramienta de síntesis que convierte diseños expresados en lenguajes de descripción, en información de configuración de la FPGA con un alto nivel de detalle en la arquitectura de la misma. Este ofrece, junto con algunas IP de Altera, herramientas de depuración dentro del circuito en tiempo de operación. Ejemplo de esto es el analizador lógico SignalTap. La descripción del hardware se hizo en VHDL de forma estructural y comportamental. Las simulaciones se realizaron mediante bancos de pruebas (testbench en inglés) escritos en VHDL. La ejecución de estos se realizó en Modelsim- Altera, un simulador de la empresa Mentor Graphics. Con el objetivo de mantener organizado el avance del proyecto y del código fuente, se usó Microsoft Visual Studio Team Services, el cual es una herramienta de manejo de proyectos de software que permitió llevar la organización de las tareas a realizar mediante una interfaz web que muestra en tableros de Kanban el estado del proyecto, estos son mostrados en la Figura 1. De igual manera este ofrece un servicio de Team Foundation Server en la nube que permite el control de cambios y versiones de código fuente en grupos de trabajo, esto permitió trabajar en diferentes ambientes y tener disponible cada cambio y su revisión. Esta utilidad que es necesaria algunas veces donde cambios del diseño requerían revertir cambios, ya que ofrece un repositorio siempre disponible en caso de perder la información local. La vista web se muestra en la Figura 2.

SoftCAM 10 Danilo A. Mendivelso P.

Figura 1. Uso de Microsoft Visual Studio Team Services.

Figura 2. Vista web del repositorio del código VHDL en Team Foundation Server online.

SoftCAM 11 Danilo A. Mendivelso P. 4.3 Primera iteración 4.3.1 Concepción Si se compara en paralelo cada elemento de la memoria con el valor a buscar, se puede obtener una respuesta idealmente de manera inmediata, conociendo así, si lo buscado se encuentra almacenado y codificando el resultado de la comparación, en cual posición. 4.3.2 Diseño Se requiere acceso paralelo a cada bit almacenado ya que cada bit será comparado según su posición con la referencia de búsqueda, teniendo así un resultado por cada palabra en la memoria, que debe ser codificado para obtener la dirección en la que se encuentra almacenada y obtener una confirmación de acierto en caso que alguno de los comparadores lo informe.

Figura 3. Arquitectura de comparación directa.

El componente combinatorio de este diseño, ofrece un límite de tamaño e incertidumbres, haciéndolo altamente dependiente de las características físicas del circuito y no de la función principal de los componentes lógicos. En la Figura 3 se muestra la arquitectura resultante de este primer proceso. Los bloques Claves y Valores son memorias de lectura y escritura donde se puede acceder a cada bit almacenado de manera paralela. Comparador es un circuito combinatorio que cuenta con tantas entradas de longitud de una palabra de memoria, como posiciones tenga esta última; de igual manera tiene tantas salidas como entradas, pero de un solo bit, indicando con un valor alto si la referencia es igual a alguno de contenidos de la memoria. Seguidamente el bloque Priorizador elimina múltiples aciertos y los convierte en uno sólo, siendo este único el ocurrido en la dirección más baja. Todos los demás bloques son combinatorios. Para lograr hacer un sistema de almacenamiento se pensó en usar los flip-flop presentes en los elementos lógicos del dispositivo programable, sin embargo, esto consumiría recursos que pueden ser utilizados en los bloques de comparación y codificación que guardan proporción en tamaño con el del almacenamiento. Con el objetivo de no usar elementos lógicos por la razón ya expuesta se estudian los recursos de memoria dedicada disponibles en las FPGA de Altera ya que se debe buscar la forma de tener acceso a cada bit de la memoria al mismo tiempo o si hay alguna forma de construir la matriz de memoria usando estos recursos. 4.3.3 Limitaciones y conclusión del funcionamiento Debido al tamaño de las redes combinatorias ya la forma que se implementan en un dispositivo FPGA, la acumulación de retardos limitaría el tamaño máximo práctico, haciendo que la propagación desde la entrada hasta la salida pueda ser mayor al período del reloj principal y aun usando uno a menor frecuencia, encontrar

SoftCAM 12 Danilo A. Mendivelso P. el valor adecuado se convierte en una tarea específica por cada dispositivo a nivel del funcionamiento interno que busca ser abstraído a nivel de compuertas como máximo. 4.4 Segunda iteración 4.4.1 Concepción Pueden usarse varias memorias RAM de pequeño tamaño, que son leídas de manera paralela. En este caso se debe iterar como máximo la cantidad de posiciones que almacene una sola de estas. Disminuyendo así la cantidad de elementos a comparar, codificar y colectar, permitiendo disminuir la complejidad de las redes combinatorias y el fan-in de los componentes. La relación entre cantidad de memorias y el tamaño de estas se relaciona con el tiempo máximo de búsqueda y la complejidad de los circuitos. El resultado de cada comparador se colecta en una cola, con el objetivo de saber si lo buscado se encuentra almacenado, donde en caso que ocurra un acierto, este se introducirá en el lugar que ocurra a la cadena de propagación. Esta arquitectura permite acercar un acierto a la salida, aún si no está entre las primeras memorias, es decir si el acierto encontrado está en el comienzo del almacenamiento debe recorrer toda la cola para llegar al final e informar de un acierto, pero si existiera otro acierto hacia las últimas memorias este se encuentra más cercano a la salida por lo que se tomaría menos tiempo en llegar al final. Esta recolección en forma serial busca disminuir dramáticamente el fan-in requerido para tomar las salidas de los comparadores y notificar a través de un puerto de salida el acierto; que de otra forma un operador disyunción debería realizar. Esta misma aproximación se toma para la dirección de acierto. 4.4.2 Diseño La construcción de memorias en el sistema puede hacerse usando flip-flop junto a los elementos respectivos de decodificación, sin embargo, esto usa recursos de lógica que se requieren para implementar los sistemas combinatorios y secuenciales de la unidad de control y del camino de datos. Con la intención que el diseño pueda crecer y el desarrollo se pueda enfocar en la arquitectura del sistema de búsqueda, se decide hacer uso de los recursos dedicados de memoria ofrecidos dentro de la FPGA, los cuales eliminan la necesidad de diseñar la lógica de decodificación de filas y también el sistema que colecta los datos seleccionados como un solo puerto de salida. Los elementos de memoria pueden configurarse como RAM de diferentes tamaños de palabra y capacidad de almacenamiento, sin usar elementos lógicos [4]. Cada pequeña memoria RAM es direccionada desde un registro común que lleva la cuenta de la posición de lectura, que es la misma para todas en un mismo instante, los datos leídos de cada memoria son comparados, preguntando por una igualdad, cada uno con la palabra a buscar, estos resultados son codificados con prioridad de menor dirección, es decir en caso de dos o más aciertos, el valor codificado es el de la menor dirección, descartando los otros. La secuencia de direcciones comienza con la primera palabra de la primera memoria, luego la segunda posición de esta misma, hasta llegar a la última de la última memoria. Un diagrama de bloques de esta idea se muestra en la Figura 4.

SoftCAM 13 Danilo A. Mendivelso P.

Figura 4. Diagrama de la segunda idea. 4.4.3 Conclusión del funcionamiento Este sistema permite una disminución de la complejidad de los circuitos combinatorios, pero no logra obtener una respuesta independiente de posición y en una sola operación debido al uso de pequeñas búsquedas. Aunque el sistema de propagación serial de resultados, es ventajoso en términos de conexiones y número de entradas requeridas por elemento de la cadena, el tiempo que toma desplazar el peor caso limita el crecimiento del tamaño de la capacidad de almacenamiento ya que aumenta el tiempo de respuesta y la necesidad de sistemas de sincronización que manejen adecuadamente la cadena de propagación. 4.5 Solución final A partir del concepto de la segunda iteración, este se modifica eliminando el sistema de propagación de aciertos y únicamente codificando los aciertos por memoria para obtener una parte de la dirección. La codificación genera los bits más significativos del acierto y el contador de direcciones aporta el menos significativo. Con la elección de este, se comienza a detallar la arquitectura y el funcionamiento con la finalidad de obtener un diseño completo que pueda ser implementado y probado en el sistema de desarrollo elegido. 4.6 Arquitectura El almacenamiento se divide en dos grandes secciones: claves y valores. La primera está hecha a partir de varias memorias RAM cada una del mismo tamaño, hechas usando elementos dedicados de memoria de la FPGA. La segunda es una sola memoria de este mismo tipo, del tamaño de todas las anteriores sumado. Un registro de direcciones, llamado ACC, lleva la cuenta de la dirección que se está leyendo, la cual es la misma para todas las memorias RAM. Cada pequeña memoria se encapsula junto a un comparador, en bloques llamados RAMSet.

SoftCAM 14 Danilo A. Mendivelso P. El sistema puede operar en tres modos: lectura, escritura y CAM. Los primeros dos permiten manejar la memoria de manera similar a una RAM, el último permite hacer búsquedas en los contenidos previamente escritos. 4.6.1 Diagrama de bloques 4.6.1.1 Puertos Los puertos de entrada y salida se clasifican en dos categorías, la interfaz que permite la lectura y escritura de los contenidos y aquella que ofrece la funcionalidad de búsqueda. A la primera pertenecen: la dirección de lectura/escritura, la clave y el valor a escribir y la clave y el valor leídos. A la segunda pertenecen: la entrada de disparo de búsqueda, la dirección de acierto, la bandera indicadora de acierto y la de ocupado. La interfaz de control consta de una entrada que selecciona el modo de operación y al ser un sistema síncrono, cuenta con una señal de reloj y una de reinicio. La vista de caja negra puede verse en la Figura 5.

Figura 5. Vista general de entradas y salidas.

La Tabla 1 detalla las características de la interfaz de entradas y salidas. Tabla 1. Puertos del dispositivo.

Nombre Sentido Rango Longitud Descripción

Configura el modo a usar según los valores mostrados en la MODE entrada [1...0] 2 bit Tabla 2.

Indica que el sistema está ocupado en una operación de BUSY salida 1 bit búsqueda

Los valores de acierto HIT y la dirección HTADDR son VALID salida 1 bit conclusivos de una operación de búsqueda

Establece la dirección en la cual se escribirá o leerá en modo WRADDRESS entrada [$ADDRMAX-1 … 0] $ADDRMAX bits lectura o escritura respectivamente

Clave a escribir en modo escritura. Clave a buscar en la KEY entrada [$KSIZE-1 … 0] $KSIZE bits memoria en modo CAM

Valor asociado a la clave en el puerto KEY a escribir en WRVALUE entrada [$VSIZE-1 … 0] $VSIZE bits memoria, en los modos lectura y escritura

RDKEY salida [$KSIZE-1 … 0] $KSIZE bits Clave leída en modo lectura

Valor leído en modo lectura. Valor asociado a la clave VALUE salida [$VSIZE-1 … 0] $VAMAX bits buscada cuando hay un acierto en modo CAM

SoftCAM 15 Danilo A. Mendivelso P. Los códigos en la Tabla 2 configuran el funcionamiento a través del puerto del modo de operación. Tabla 2. Códigos de los modos de operación.

Modo Valor

CAM 0b00

Lectura 0b01

Escritura 0b10

No operación 0b11

4.6.1.2 Vista interna de primer nivel En un primer nivel se encuentran tres grandes bloques, dos responsables del almacenamiento y la unidad de control. El núcleo operativo es el bloque con la lógica de búsqueda, llamado SearchLogic, que almacena las claves y luego de una secuencia comandada por el bloque Control, entrega a la salida la notificación de si hubo un acierto en la búsqueda y en cual dirección. Con la dirección de acierto se direcciona una RAM que contiene los valores, relacionados uno a uno con la posición de las claves. La interconexión entre estos bloques y los puertos se muestran en la Figura 6.

Figura 6. Bloques internos del sistema.

4.6.1.3 SearchLogic En este bloque se almacenan las claves en pequeñas memorias dentro de los RAMSet que informan de un acierto por cada una de estas. El registro contador de direcciones ACC mantiene la cuenta del proceso de búsqueda. Todos los resultados de la salida de acierto HIT presentan esta información de manera que en conjunto se tienen unos y ceros donde la posición en el grupo corresponde al índice del RAMSet que informa el acierto, por lo cual un codificador de prioridad es usado con la finalidad de obtener el número codificado en binario que identifica al bloque que reporta. Al existir la posibilidad de que se obtengan varios aciertos al mismo tiempo, la salida no es one-hot completamente, así que la prioridad que se le asigna al codificador ya mencionado es la de menor dirección.

SoftCAM 16 Danilo A. Mendivelso P. Uno de los mínimos funcionales del dispositivo es ofrecer la forma de leer y escribir contenido de estas memorias, por lo que se incluye un sistema de lectura y escritura que permite seleccionar un RAMSet según la dirección proporcionada por el usuario, una señal habilitadora de escritura y un sistema que selecciona la salida de datos de los bloques de almacenamiento, con la finalidad de entregar en un solo puerto aquel seleccionado por la dirección de entrada. En la Figura 7 se muestran en gris los elementos que conforman el sistema de lectura y escritura. Los demás en azul conforman el sistema de búsqueda.

Figura 7. Lógica de búsqueda (SearchLogic).

4.6.1.4 RAMSet Este es el elemento mínimo de comparación. Se compone de un comparador que informa en caso de igualdad con un uno a su salida. A este último se conecta la señal correspondiente a la clave a buscar y la salida de una pequeña memoria RAM.

SoftCAM 17 Danilo A. Mendivelso P.

Figura 8. Contenido de un RAMSet.

4.6.2 Espacio de direcciones El almacenamiento internamente se divide en secciones, sin embargo, el sistema se muestra como una única memoria plana al mundo exterior. En la Figura 9 se muestra una configuración de cuatro RAMSet, cada uno con capacidad de cuatro datos. En esta se ilustra la relación de las direcciones usadas internamente con las disponibles externamente.

Figura 9. Direcciones externas.

La dirección global se compone de dos partes: número del RAMSet y posición dentro de este. Siendo los bits menos significativos la segunda parte y los más significativos la primera. Sin embargo, esto es transparente para el usuario, pero es importante para el examen interno del sistema.

SoftCAM 18 Danilo A. Mendivelso P. 4.6.3 Descripción al nivel de transferencia de registros La búsqueda comienza revisando las primeras posiciones de las memorias de cada RAMSet, luego las segundas y así sucesivamente, incrementando el registro ACC que contiene la dirección que está siendo leída, hasta que se encuentre un acierto o se llegue al número máximo de palabras por RAM, condiciones en las cuales se detiene la búsqueda y se informa del resultado definitivo mediante los puertos VALID y HIT. Donde el primero indica un resultado estable y el segundo si hubo o no un acierto. Un diagrama de flujo que ilustra el proceso se muestra en la Figura 10.

Figura 10. Proceso de búsqueda.

El procedimiento de lectura y escritura se da mediante la configuración de varios selectores de datos que toman desde la fuente adecuada direcciones y datos. En modo lectura o escritura la dirección que llega a los RAMSet ha de ser la parte menos significativa de la dirección global, indicando la posición en la RAM interna. La más significativa indica desde cuál RAMSet leer o escribir respectivamente. En el segundo modo a partir de esta misma parte de la dirección se selecciona el dato entregado por un solo RAMSet De manera similar el procedimiento de búsqueda debe configurar el selector de direcciones, de forma que todos los RAMSet tomen el registro contador ACC y no la dirección proporcionada por el usuario.

4.6.3.1 Diagrama de tiempos El comportamiento esperado del sistema, es presentado en diagramas de tiempo que muestran la evolución de las entradas y salidas junto al reloj del sistema. En la Figura 11 se muestra una operación de búsqueda CAM que obtiene como resultado un acierto de una clave REF_KEY_0 y la relaciona a un valor Value_0. El tiempo de espera desde la solicitud de la operación hasta la obtención de una respuesta válida se omite para ilustrar primero la configuración de la salida.

SoftCAM 19 Danilo A. Mendivelso P.

Figura 11. Respuesta esperada ante una operación de búsqueda con acierto.

Cuando una clave REF_KEY_0 no es encontrada en el almacenamiento, la señal de acierto es conclusiva sólo hasta que VALID toma un valor de ‘1’. Este caso es mostrado en la Figura 12, omitiendo el tiempo de respuesta por la misma razón del diagrama anterior.

Figura 12. Comportamiento esperado en caso de no encontrar acierto.

4.6.3.2 Secuencia AHPL Una valiosa ayuda del diseño es organizar el comportamiento del sistema en una secuencia que muestre la transferencia entre registros y cómo esto depende del estado en que se encuentre el sistema. AHPL expresa esto en forma de una secuencia de pasos numerados. En este caso se ha escrito tomando como base la sintaxis presentada por sus creadores [5], agregando y modificando algunos elementos. Se adiciona el operador de pregunta de igualdad (‘==’) y si complemento desigualdad (‘!=’). Valores genéricos constantes son identificadores antecedidos del signo pesos (‘$’), el operador negación (‘!’), el acceso a cada elemento de manera paralela en un arreglo de memoria usando dos puntos (‘[:]’) y las etiquetas de paso que permiten darle nombre a los pasos, el cual se encuentra después del número entre los signos de menor y mayor que (‘’). 0. → (MODE==$MDCAM x 1) + (MODE==$MDRW x 5)

1. MATCH = 0; BUSY = 0; VALID = 0; ADDRC <- 0; → (!START x 1) + (START x 2) + (MODE!=$MDCAM x 0)

2. BUSY = 1; ADDRC <- inc(ADDRC); → ( ADDRC==$MAX_RAM | keys[ADDRC][:]==KEY x 3 ) + ( ADDRC!=$MAX_RAM | keys[ADDRC][:]!=KEY x 2 )

3. BUSY = 1; VALID = 0; → (START x 3) + (!START x 4)

SoftCAM 20 Danilo A. Mendivelso P.

4. VALID = 1; BUSY = 0; → ( MODE==$MDNONE x 4 ) + (MODE!=$MDNONE x 0)

5. → (0) 4.7 Implementación 4.7.1 Descripción en VHDL y síntesis La arquitectura y funcionamiento anteriormente descritos se implementaron con VHDL usando algunas características de la versión 2008. Con la intención de hacer flexible el diseño en términos de longitud de palabras y cantidad máxima de posiciones de almacenamiento, todas las entidades correspondientes a los bloques del sistema son parametrizables, es decir en tiempo de elaboración y síntesis las características mencionadas toman un valor dado por el usuario. Los valores globales de estos parámetros se usan de manera consistente en todos los bloques, y están en una biblioteca llamada SoftCAMDefinitions. Es allí donde se deben modificar si se quieren configurar diferentes a los establecidos por defecto, ya que desde estos se configuran los valores por defecto de los bloques internos y los usados al crear las instancias de las entidades. Con la finalidad que tengan sentido aquellos que se complementen, algunos otros son calculados a partir de estos, por ejemplo: la longitud de la dirección global depende de la cantidad de RAMSet y la capacidad de cada uno de estos. En la Tabla 3 y la Tabla 4 se muestran los parámetros globales y los de la entidad principal. Tabla 3. Parámetros globales en SoftCAMDefinitions.

Valor por Nombre Descripción defecto

GLOBAL_KSIZE 16 Longitud de una clave.

GLOBAL_VSIZE 8 Longitud de un valor

RAMSET_COUNT 16 Cantidad de RAMSet.

RAMSET_SIZE 8 Capacidad de un RAMSet

Longitud del puerto de dirección de un RAMSet. No configurar RAMSET_ADDR_SIZE Calculado directamente. ⌈log2 푅퐴푀푆퐸푇_푆퐼푍퐸⌉

Longitud de la señal que selecciona el RAMSet activo. No configurar RAMSET_BLOCK_ADDR_SIZE Calculado directamente. ⌈log2 (푅퐴푀푆퐸푇_퐶푂푈푁푇)⌉

Longitud del puerto de dirección al que el usuario tiene acceso, es decir GLOBAL_ADDR_SIZE Calculado el de la entidad de primer nivel SoftCAM. No configurar directamente. ⌈log2 (푅퐴푀푆퐸푇_퐶푂푈푁푇 ∗ 푅퐴푀푆퐸푇_푆퐼푍퐸)⌉

Tabla 4. Parámetros de la entidad SoftCAM.

Nombre Valor por defecto Descripción

KSIZE GLOBAL_KSIZE (16) Longitud de una clave.

VSIZE GLOBAL_VSIZE (8) Longitud de un valor

ADDR_SIZE RAMSET_SIZE (8) Longitud del puerto de direcciones.

El bloque de control se describió como una máquina de estados síncrona con reinicio asíncrono de manera comportamental [6]. La entidad RAMSet se describe de manera estructural. La entidad SearchLogic se describe de manera estructural a excepción del registro ACC que se hace de manera comportamental. SoftCAM 21 Danilo A. Mendivelso P. Parte de la estructura se interconecta con señales del tipo personalizado std_logic_matrix, que no hace parte del estándar VHDL por lo tanto sus bibliotecas no lo incluyen. Este es un arreglo que contiene en cada posición un std_logic_vector. Este se declara en la biblioteca SoftCAMDefinitions. La definición de este tipo permite descripciones más concisas facilitando declaraciones estructurales repetitivas con la instrucción generate. El uso de este tipo de dato está soportado únicamente desde la revisión 2008 del estándar IEEE 1076. 4.7.1.1 Componentes IP usados La memoria RAM dentro de los RAMSet se encuentra en la entidad RAMBlock generada a través de la herramienta MegaWizard Add-in Manager de Quartus. El resultado de esta no es parametrizable ni ofrece opciones para generar algo parecido, por lo cual se debió editar el código fuente VHDL generado agregando esta característica. Al interior de este bloque se encuentra una instancia de la entidad alt_syncram, un diseño de Altera que permite usar los recursos de memoria dedicada como RAM. También puede incluirse un sistema de edición de memoria en tiempo de funcionamiento que permite ver y modificar los contenidos de esta a través de una conexión JTAG desde una interfaz gráfica en Quartus. 4.7.1.2 Estructura de archivos El código fuente presentado como uno de los resultados del presente proyecto se organiza en dos grandes secciones: código fuente y pruebas, cada uno contenido en una carpeta. La primera sección contiene las descripciones VHDL del diseño y la biblioteca de definiciones, con un archivo por cada entidad (con su respectiva arquitectura) si no se compone de otros bloques, en el caso que esto ocurra habrá una carpeta con el nombre de la entidad con este archivo al interior y una carpeta llamada ‘components’ donde se encuentran los bloques contenidos en este usando la misma convención que se acaba de enunciar. La segunda sección contiene dos carpetas una llamada ‘testbench’ y la otra ‘hardware’ donde se encuentran, en una los testbench y los proyectos de Quartus que permiten simular en Modelsim-Altera estos bancos de pruebas y en la otra también proyectos de esta herramienta, pero usados para configurar la FPGA del sistema de desarrollo y la entidad principal que encapsula SoftCAM en una descripción del sistema DE2-115. El nombre de los archivos VHDL debe ser exactamente igual al de la entidad definida en su interior.

Figura 13. Estructura de archivos y carpetas.

4.7.1.3 Implementación en DE2-115 La implementación en el sistema de desarrollo se hace describiendo este de manera que la conexión entre una instancia de SoftCAM y los elementos disponibles conectados a la FPGA sea explícita en el código fuente. También permite conectar dispositivos de prueba y generadores de estímulos, manteniendo la independencia del diseño bajo prueba aparte del sistema donde se implementa. Con la ayuda de la herramienta DE2-115 System Builder proporcionada por Terasic, se generaron los proyectos de Quartus a usar en el sistema objetivo. Estos proyectos cuentan con un archivo .qpf que contiene

SoftCAM 22 Danilo A. Mendivelso P. la información básica del proyecto y otro .qsf que contiene comandos en TCL1 que relacionan el nombre que se presenta en el manual con el pin correspondiente en la FPGA de cada periférico conectado al dispositivo programable, de manera que si la entidad principal usa estos nombres como puertos, al momento de la elaboración serán asignados a los pines adecuados. Esto permite una mayor legibilidad de la descripción y menos pasos de configuración que lleven el diseño al sistema de desarrollo.

4.7.1.4 Resultados de síntesis Al finalizar el proceso de compilación completa del diseño, Quartus permite ver la estructura de bloques resultante. El resultado obtenido sigue el planteado desde los diagramas de bloques. Los resultados presentados a continuación corresponden a una configuración de cuatro RAMSet, cada uno con una RAM de cuatro posiciones. La Figura 14 muestra el contenido de la entidad principal SoftCAM.

Figura 14. Vista del resultado de síntesis del nivel más alto.

En la vista interior del bloque SearchLogic se muestran algunos multiplexores generados al sintetizar expresiones comportamentales en VHDL.

1 TCL es un lenguaje de scripting usado por Quartus para automatizar tareas como simulación, compilación y depuración. SoftCAM 23 Danilo A. Mendivelso P.

Figura 15. Vista interior de SearchLogic como resultado de síntesis.

Figura 16.Contenido de un RAMSet en el resultado de síntesis.

Debido a que los recursos de implementación son finitos, es importante tener un estimado del total de recursos usados en el dispositivo con respecto al tamaño del almacenamiento. Tabla 5. Uso de recursos en la FPGA vs tamaño de la memoria con claves de 16 bit y valores de 8 bit.

Tamaño Uso de FPGA

RAM RAMSet Total %LE %MEM 8 16 128 < 1 < 1 16 32 512 4 < 1 32 64 2,048 9 1 64 128 8,192 18 5 128 256 32,768 6 20 4.8 Operación 4.8.1 Uso de SoftCAM en un proyecto Esta sección ilustra el procedimiento para incluir la IP en un diseño que usará SoftCAM. Se deben incluir todos los archivos que se encuentran en la carpeta llamada ‘src’. Modificar SoftCAMDefinitions.vhd al tamaño deseado. Asegurarse de usar compatibilidad con VHDL 2008 al menos en la compilación de estos archivos fuente.

SoftCAM 24 Danilo A. Mendivelso P. 4.8.2 Operación del dispositivo 4.8.2.1 Lectura y escritura Las funciones de los puertos involucrados son: Tabla 6. Funciones de los puertos en modo lectura o escritura.

Nombre Sentido Modo Función

BUSY salida No se usa No cambia en lectura ni escritura, se lee ‘0’. No proporciona información del proceso.

VALID salida No se usa No cambia en lectura ni escritura, se lee ‘0’. No proporciona información del proceso.

WRADDRESS entrada Lectura y Escritura Establece la dirección en la cual se escribirá o leerá.

KEY entrada Escritura Clave a escribir.

WRVALUE entrada Escritura Valor a escribir en memoria asociado a la clave en el puerto KEY.

RDKEY salida Lectura Clave leída.

VALUE salida Lectura Valor leído en modo lectura.

La escritura de pares clave:valor se hace siguiendo los pasos mostrados a continuación. 1. Establecer dirección de escritura en el puerto WRADDR, clave en KEY y valor a escribir en WRVALUE. 2. Seleccionar modo CAM configurando adecuadamente el puerto MODE. 3. Esperar al menos un ciclo de reloj. 4. Cambiar a otro modo. Importante: No modificar ni dejar inestables las entradas WRADDR, KEY y WRVALUE luego de una operación de escritura deseada mientras el modo escritura está seleccionado, ya que mientras se encuentre en este, se está escribiendo constantemente en la memoria, provocando así cambios no deseados en los contenidos. Antes de modificar estas señales se debe cambiar de modo. 4.8.2.2 Búsqueda CAM Las funciones de los puertos involucrados se ven en la Tabla 7. Tabla 7. Puertos involucrados en una búsqueda CAM.

Nombre Sentido Rango Longitud Descripción

MODE entrada [1...0] 2 bit Debe configurarse en modo CAM.

Indica que el sistema está ocupado en una operación de BUSY salida 1 bit búsqueda

Los valores de acierto HIT y la dirección HTADDR son VALID salida 1 bit conclusivos de una operación de búsqueda.

Clave a escribir en modo escritura. Clave a buscar en la KEY entrada [$KSIZE-1 … 0] $KSIZE bits memoria en modo CAM

VALUE salida [$VSIZE-1 … 0] $VSIZE bits Valor asociado a la clave buscada si hay acierto.

Una búsqueda se realiza siguiendo los pasos mostrados a continuación. 1. Estando en modo de no operación, establecer la clave a buscar. 2. Configurar el puerto MODE con el valor adecuado. Esperar al menos un ciclo de reloj. 3. Cambiar el valor de la señal SEARCH a ‘1’.

SoftCAM 25 Danilo A. Mendivelso P. 4. Esperar a que la señal VALID cambie de ‘0’ a ‘1’. Mientras sea cero lo leído en la respuesta no es conclusivo, por lo tanto, no válido. 5. Manteniendo SEARCH en ‘1’ se mantiene la respuesta obtenida tanto como dure esta primera en valor alto. El resultado puede ser leído como válido. 6. Cambiar SEARCH a ‘0’ para continuar

SoftCAM 26 Danilo A. Mendivelso P. 5 Protocolo de pruebas Se establecieron los casos contemplados de uso del sistema, estos se simularon a partir de la generación de estímulos mediante testbench y algunos de estos casos se llevaron a la implementación física usando herramientas de prueba en tiempo de funcionamiento ofrecidas por Altera al interior del dispositivo programable (on-). El sistema bajo prueba en las simulaciones y en el sistema de desarrollo, cuenta con dieciséis RAMSet, cada uno con ocho posiciones de memoria. Y los procedimientos y sus resultados son descritos y mostrados en diagramas de tiempos. El procedimiento de validación del funcionamiento se basa en tres pasos. El primero es la configuración con datos conocidos, de manera que puedan ser consultados y correctamente aprobados. Luego a través del generador de estímulos se produce la secuencia de configuración adecuada con lo que finalmente se captura el resultado que es comparado contra el esperado. 5.1 Simulación Cada bloque fue probado a medida que se describía en VHDL escribiendo un testbench que validara en simulación el comportamiento esperado. Cuando no se obtenían los resultados esperados, inmediatamente se buscaban las causas, se modificaba a partir de revisar el diseño, la implementación y los resultados, de manera que se modificase aquello que por diferentes razones difería de lo buscado, por ejemplo, conexiones o detalles de sincronización como cuando por error no se considerara un ciclo de respuesta que desplazaba el resultado buscado un periodo. Luego de corregir se volvía a simular y no se avanzaba hasta llegar al resultado buscado, con lo que muchos errores fueron corregidos gracias a este procedimiento, antes de ser implementado el resultado en el sistema real. Cada uno de estos bancos de pruebas genera un reloj y una señal de reinicio global que consta de un pulso de valor ‘1’ de corta duración, luego del cual una secuencia generadora de estímulos permite configurar las entradas y modificar el flujo de la secuencia en función de las salidas, por ejemplo, detenerla hasta que haya un cambio en una salida que indique resultados válidos del sistema bajo prueba. Se presentarán a continuación algunos resultados de simulación de los bloques que conforman el sistema, omitiendo los básicos de operaciones lógicas como comparadores y codificadores (cuyos testbench están junto al código fuente) e incluyendo los que definen el comportamiento y son cercanos al primer nivel de la jerarquía. 5.1.1 SearchLogic Se prueba la funcionalidad de escritura y luego la de búsqueda, se hace en este orden con el objetivo de encontrar lo que se conoce se escribió y validar también un no acierto buscando algo que se sabe no se encuentra almacenado. El testbench (contenido en el archivo SearchLogic_TB.vhd) genera primero las condiciones que permiten una escritura, esto configurando la señal de control ADDRMODE_t de manera que seleccione la dirección desde el puerto RWADDR hacia los RAMSet y no desde el registro contador de direcciones ACC. Luego se habilita la escritura y se establecen los valores de dirección y dato a escribir. Las señales ACCMODE_t y ADDRMODE_t corresponden al modo de operación del contador de direcciones y la selección de dirección de lectura/escritura respectivamente. De igual manera WREN_t cambia a ‘1’ con el fin de permitir la escritura del dato en la dirección ya establecida. Todo lo anterior ocurre sin el uso de un bloque de control ya que en la generación de estímulo se producen las señales de control necesarias también. En la Figura 17 puede verse el procedimiento de escritura del dato ‘4’ en la posición ‘10’ (en el instante 60 ns) y del dato ‘255’ en la posición ‘15’ (en el instante 160 ns). Se comprueba que se ha escrito debido a que el puerto de lectura cambia su valor por el escrito.

SoftCAM 27 Danilo A. Mendivelso P.

Figura 17. Resultados de simulación de una escritura en SearchLogic. Este continúa en la siguiente figura.

Seguidamente en este mismo testbench se genera una secuencia de búsqueda del dato ‘4’, previamente escrito y se configura el registro ACC en modo incremental, lo que permite que cada ciclo de reloj este aumente su valor en una unidad. Se verifica que se llegue al final de la cuenta o se produzca un acierto, en este caso y según lo mostrado en la Figura 18, ocurre lo segundo (en el instante 380 ns) y al mismo tiempo el valor de dirección de acierto HIT_ADDR_t cambia, validando que la respuesta es la esperada ya que el dato ‘4’ se encuentra en la dirección ‘10’ como se estableció en la parte inicial de la simulación. Con este acierto se da por finalizada la simulación (en el instante 400 ns).

Figura 18. Resultados de simulación de una búsqueda de un dato anteriormente escrito en SearchLogic. Continuación del diagrama de tiempos anterior. 5.1.2 Control La unidad de control se implementa de acuerdo a la secuencia AHPL del diseño y de las señales de control de los bloques de datos. Dos casos son de interés notable, la búsqueda con acierto y sin acierto. En la Figura 19 se comienza en modo de escritura, el cual activa la señal de control de escritura (en el instante 20 ns) luego se cambia al modo de no operación por dos ciclos, donde luego del primero, la escritura se deshabilita (en el instante 40 ns). El modo de operación fue cambiado durante un flanco de subida, lo que hace que no se tome en cuenta sino hasta el siguiente cambio ascendente del reloj. Luego se inicia una búsqueda llevando la señal START_t de ‘0’ a ‘1’ durante un ciclo de reloj (después del instante 240 ns). Se obtiene el comportamiento esperado: BUSY_t cambia a ‘1’, luego se simula un acierto haciendo HIT_t ‘1’, con lo que se BUSY_t cambia a ‘0’ y VALID_t cambia a ‘1’ únicamente durante un ciclo de reloj ya que START_t es ‘0’ en este momento del proceso. Las señales de control del registro ACC y el selector de dirección cambian adecuadamente según el modo y momento de operación.

SoftCAM 28 Danilo A. Mendivelso P.

Figura 19. Resultados de simulación de la prueba de escritura y búsqueda de la unidad de control.

Continuando la simulación, en la Figura 20 se muestra el inicio de una operación de búsqueda (en el instante 730 ns) y se simula un caso en el cual se llega al valor máximo del registro haciendo que ACC_OVF_t sea ‘1’ (en el instante 1040 ns) con lo que la respuesta obtenida es la señal de VALID_t en ‘1’ y el cambio de ‘1’ a ‘0’ de BUSY_t.

Figura 20. Resultado de la simulación de la prueba de búsqueda sin acierto. 5.1.3 SoftCAM El sistema se prueba validando el funcionamiento de la escritura, seguido de dos procedimientos de búsqueda, uno que se conoce devolverá acierto y otro que se conoce informará un no acierto. En la Figura 21 se muestra la escritura de 0020h:7Fh en la posición 04, CAFEh:64h en la posición 12 y 0021h:80h en 32. Seguidamente se establece el modo búsqueda y se cambia la señal de inicio de ‘0’ a ‘1’ preguntando por la clave CAFEh, con lo que el proceso comienza, haciendo que la señal BUSY cambie de ‘0’ a’1’ (en el instante 140 ns). Luego de siete ciclos de reloj la indicación de ocupado cambia de nuevo a ‘0’ y la señal VALID toma un valor de ‘1’ indicando que hay una respuesta (en el instante 280 ns) que informa de un acierto en la dirección 12h, con un valor asociado de 64h.

Figura 21. Escritura de tres posiciones y búsqueda de la clave CAFEh con su respuesta.

En la Figura 22 se muestra la escritura de los mismos datos de la prueba anterior, pero en este caso se pregunta por la clave CAFEh, luego por 21h, con las cuales se obtiene acierto en 12 y 32 respectivamente. De manera seguida se pregunta por F1F0h, el cual no se encuentra almacenado, respondiendo adecuadamente esto con HIT en ‘0’ y valid en ‘1’ (en el instante 1220 ns).

SoftCAM 29 Danilo A. Mendivelso P.

Figura 22. Prueba de dos aciertos y un no acierto. 5.2 Pruebas de la interfaz de lectura y escritura en FPGA Estas pruebas requieren el llenado previo de la memoria mediante la utilidad In-system memory editor. 5.2.1 Caso: Escritura de una posición de memoria 5.2.1.1 Resultado esperado Valor escrito al leer la posición donde se escribió (ver caso de lectura). 5.2.1.2 Procedimiento 1. Establecer la dirección deseada y el dato a escribir allí. 2. Seleccionar el modo de escritura y permanecer con esta configuración al menos un ciclo de reloj que incluya flanco de subida. 3. Cambiar modo de operación. a. Primero cambiar modo de operación ya que, si se cambia dirección o dato, mientras se esté en el modo de escritura la memoria continuamente modifica su contenido hasta que se cambie de modo. 4. Probar caso de lectura esperando el valor escrito. 5.2.2 Caso: Lectura de una posición de memoria 5.2.2.1 Resultado esperado Un par clave:valor conocido desde la precarga mediante el editor de memoria o luego de un proceso de escritura. 5.2.2.2 Procedimiento 1. Seleccionar el modo lectura y establecer la dirección deseada 2. Luego de un ciclo del reloj principal revisar el par clave:valor de salida. a. Esta salida se debe mantener mientras el modo ni la dirección cambien. 5.3 Pruebas en FPGA de las operaciones de búsqueda Se cargan de manera previa contenidos conocidos mediante la utilidad In-system memory editor. Las pruebas mostradas a continuación se hacen con los contenidos mostrados en la Figura 23, allí las instancias 0 a la 15 corresponden cada una a un RAMSet, la instancia 16 es la memoria de valores.

SoftCAM 30 Danilo A. Mendivelso P.

Figura 23. Contenido de la memoria durante las pruebas. 5.3.1 Caso: Búsqueda de una clave que se conoce no se encuentra almacenada. 5.3.1.1 Resultado esperado Luego del tiempo correspondiente y al cambiar VALID de ‘0’ a ‘1’, se deben obtener los siguientes valores en los puertos de estado. Tabla 8. Valores esperados.

Puerto Valor

VALID ‘1’

BUSY ‘0’

HIT ‘0’ 5.3.1.2 Procedimiento: 1. Seleccionar modo CAM. SEARCH debe ser ‘0’. Establecer valor de clave a buscar en KEY. 2. Hacer la señal SEARCH ‘1’. 3. Esperar a que VALID cambie de ‘0’ a ‘1’, sin cambiar SEARCH. 4. Verificar la dirección de respuesta y el valor asociado. Mantener SEARCH en ‘1’ si se quiere mantener el resultado a la salida. 5. Bajar a ‘0’ la señal SEARCH. A continuación, se muestra el resultado de una prueba usando el analizador SignalTap, el cual ofrece una interfaz gráfica desde Quartus que permite configurarlo y manipularlo. Este funciona a través de la conexión JTAG existente entre la FPGA, el USB Blaster y el PC. La Figura 24 muestra el momento en el que la señal de comienzo de búsqueda START pasa de ‘0’ a ‘1’ y produce un cambio de estado en el bloque de control, avanzando de CAMIdle a SearchLoop junto con la subida de la señal BUSY. Desde este momento se repetirán tres estados que hacen parte del proceso de búsqueda. En esta misma figura se puede ver el primer ciclo de búsqueda.

SoftCAM 31 Danilo A. Mendivelso P.

Figura 24. Resultado de una búsqueda sin acierto. Parte 1 de 4.

Seguidamente en la Figura 25 se ven tres repeticiones, lo cual lleva la cuenta a cuatro ciclos hasta el momento, con las demás señales sin cambiar.

Figura 25. Resultado de una búsqueda sin acierto. Repeticiones 2 a 4 del proceso de búsqueda. Parte 2 de 4.

En la Figura 26 pueden verse dos más, llegando a una cuenta de seis repeticiones.

Figura 26. Resultado de una búsqueda sin acierto. Repeticiones 4 a 6 del proceso de búsqueda. Parte 3 de 4.

Finalmente, en la Figura 27 se muestra una última iteración que termina en el estado SearchLoop en el cual se identifica que se ha llegado al final del proceso y puede darse una respuesta, de lo cual se encarga el estado ResultPresentation en donde VALID toma un valor de ‘1’ al tiempo que BSY muestra ‘0’.

SoftCAM 32 Danilo A. Mendivelso P.

Figura 27. Resultado de una búsqueda sin acierto. Repeticiones 7 a 8 del proceso de búsqueda. Parte 4 de 4.

5.3.2 Caso: Búsqueda de una clave que se conoce está almacenada. 5.3.2.1 Resultado esperado Luego del tiempo correspondiente y al cambiar VALID de ‘0’ a ‘1’, se deben obtener los siguientes valores en los puertos de estado. Tabla 9. Valores esperados.

Puerto Valor

VALID ‘1’

BUSY ‘0’

HIT ‘1’

De igual manera RDVALUE y HTADDR deben corresponder al valor asociado conocido durante la escritura y la posición en la cual fue guardada en la memoria respectivamente. 5.3.2.2 Procedimiento El mismo usado en el caso que se conoce no está almacenada la clave buscada. El resultado obtenido puede verse en la Figura 28. En este caso luego de modificar SEARCH de ‘0’ a ‘1’ el estado cambia a SearchLoop y la señal BUSY cambia a ‘1’. El proceso toma una repetición de la secuencia de búsqueda y encuentra un acierto en el segundo SearchLoop, estado que valida la existencia del mismo, mostrando esto en la señal de HIT, la dirección de acierto en HITADDR y confirmando que este resultado es válido desde este momento. De igual manera estas salidas se mantienen en su valor ya que SEARCH permanece en ‘1’.

Figura 28. Resultado en el caso del acierto de la clave CAFEh que se relaciona con C0h

SoftCAM 33 Danilo A. Mendivelso P. 6 Resultados, conclusiones y recomendaciones El diseño de memorias CAM es un tema que en el mundo moderno cobra especial importancia gracias a que sus aplicaciones están presentes en cada vez más en la vida diaria del hogar, la oficina y la industria. En contextos como el de las cosas (IoT) y el movimiento de la computación hacia la nube, presenta escenarios que promueven la investigación y desarrollo de tecnologías y equipos que den respuesta a la creciente demanda. Se presentó una arquitectura que, si bien no cumple con el ideal CAM de obtener una respuesta en un ciclo del reloj de operación, ofrece una reducción significativa del tiempo de búsqueda cuando la información no está ordenada, esto con respecto a una búsqueda iterativa en una sola memoria RAM de un puerto. De igual manera al ser descrita en VHDL permite ser fácilmente integrada en otros diseños que requieran el uso de este tipo de dispositivos a bajos costos y flexibilidad de tamaño. También puede modificarse rápidamente para ser mejorada. El funcionamiento de esta asigna prioridad a las claves alojadas en las primeras direcciones de cada RAMSet. La respuesta es proporcional a la posición en el RAMSet, por lo que una configuración que tenga estos de pequeño tamaño, pero una gran cantidad tendrá una buena relación tiempo de respuesta frente a capacidad de almacenamiento. Sin embargo, estos tamaños tienen un límite práctico, establecido principalmente por el codificador de aciertos. El peor caso en tiempo, corresponde a buscar algo que no se encuentre alojado en el almacenamiento, el siguiente más crítico es cuando se busca algo almacenado en la última posición de algún RAMSet. El tiempo que le toma al sistema encontrar un dato almacenado en una posición dada, se muestra en la Ecuación 1

푡푙표표푘푢푝 = 푃푅푆 ⋅ 3 ⋅ 푇푐푙푘 Ecuación 1.

Donde PRS es la posición en el RAMSet y Tclk es el periodo del reloj de operación. El factor tres se debe a que el proceso de búsqueda toma esta cantidad de ciclos de reloj. En el caso de no acierto, el tiempo que toma llegar a una conclusión es el mostrado en la Ecuación 2 donde RSsize es el tamaño de un RAMSet.

푡푚푖푠푠 = 푅푆푠푖푧푒 ⋅ 3 ⋅ 푇푐푙푘 Ecuación 2.

Comparando con una búsqueda iterativa en una RAM con datos no ordenados, el tiempo en concluir que lo buscado no se encuentra almacenado corresponde al producto del periodo del reloj por el tamaño de la memoria. La relación de tiempos de búsqueda permite cuantificar la ventaja obtenida en tiempo frente al uso de una memoria RAM del mismo tamaño. En la Ecuación 3 se muestra esta relación, donde RScount es la cantidad de RAMSet del sistema. 푐푎푚 푡푚푖푠푠 푅푆푠푖푧푒 ⋅ 3 ⋅ 푇푐푙푘 3 푟푎푚 = = 푡푚푖푠푠 푅푆푠푖푧푒 ⋅ 푅푆푐표푢푛푡 ⋅ 푇푐푙푘 푅푆푐표푢푛푡 Ecuación 3

Esto se busca sea menor a uno, es decir tome menor tiempo que una búsqueda iterativa en una memoria RAM con la misma capacidad de almacenamiento. De esta expresión se concluye que a mayor cantidad de RAMSet, más ventaja se ofrece frente a un sistema puramente iterativo y que dentro del proceso el tamaño de cada uno de estos elementos debe ser menor ya que al aumentar la cantidad de estos, se debe disminuir la capacidad de los mismos con el objetivo de mantener constante el tamaño total de almacenamiento que se está comparando. 6.1 Oportunidades de crecimiento de SoftCAM Este diseño puede continuar mejorando agregando más memorias RAM por cada RAMSet con codificadores adecuados en su interior aumentando un grado de libertad en los parámetros de configuración, lo cual permita cambiar las relaciones de tamaños entre cantidad de RAM en RAMSet, el tamaño de cada una de

SoftCAM 34 Danilo A. Mendivelso P. estas y la cantidad de estos bloques. De la misma manera ofrecer que la prioridad sea programable es una característica que aumentaría la flexibilidad al momento de uso. Por otro lado, convertir este diseño en uno que pueda preguntar por información ternaria, es decir la referencia de entrada no sólo se compone de ‘1’ y ‘0’ sino también de ‘x’ el cual indica que en una posición de una palabra de cierta cantidad de bits puede ser cualquiera de los dos anteriores. Lo anterior permite buscar rangos en la secuencia numérica binaria. Por ejemplo, una búsqueda del dato “1XX” se refiere a los números entre “100” y “111”. Esto presenta una aplicación más relevante aún en equipos de redes modernos que sean usados en redes definidas por software (SDN), según [2]. Un estudio más detallado del comportamiento del sistema ofrecería información valiosa para el usuario final, especialmente al implementarlo a otras velocidades y tamaños. En el presente documento se muestran únicamente pruebas funcionales que validan el correcto funcionamiento. Sin embargo, pruebas de rendimiento no fueron realizadas, por lo cual serían una muy buena referencia para medir y mejorar el diseño en este aspecto.

SoftCAM 35 Danilo A. Mendivelso P. 7 Bibliografía

[1] K. Pagiamtzis y A. Sheikholeslami, «Content-addressable memory (CAM) circuits and architectures: a tutorial and survey,» IEEE Journal of Solid-State Circuits, vol. 41, nº 3, pp. 712-727, 2006.

[2] . Tiwari, «CAM, TCAM and OpenFlow,» de SDN and OpenFlow for beginners with hands on labs, 2013.

[3] R. Camposano y D. MacMillen, «Design Technology for Systems-on-Chip,» de SOC Design Methodologies, Montpellier, Springer, 2001, pp. 87-96.

[4] J. G. Tong, I. D. L. Anderson y M. A. S. Khalid, «Soft-Core Processors for Embedded Systems,» de 2006 International Conference on Microelectronics, Dhahran, 2006.

[5] Altera Corporation, «Cyclone IV Device Handbook,» 2016.

[6] F. J. Hill y G. R. Peterson, Digital Systems: Hardware Organization and Design, 1987.

[7] Altera Corporation, «VHDL State Machines,» de Quartus II Handbook Volume 1: Design and Synthesis, 2015, pp. 12-50 - 12-51.

SoftCAM 36