Implementación simple de CAM pequeño en FPGA

Introduccion


Una vez que necesitaba implementar un pequeño bloque de CAM (memoria asociativa). Después de leer cómo Xilinx hace esto en BRAM (bloques de memoria estática) o en SRL16 (registros de desplazamiento de 16 bits), me entristeció un poco, ya que sus implementaciones ocuparon mucho espacio. Decidí intentar hacerlo yo mismo. La primera opción era la implementación de la frente. Mirando hacia el futuro, se me ocurrió casi de inmediato y, bueno, la frecuencia objetivo para el diseño fue de solo 125 MHz.


Arquitectura


Para comenzar, considere la declaración del problema. Entonces, necesitamos una CAM pequeña con un ancho de palabra de 8-64 bits y una profundidad de 16-1024 palabras. Necesitaba una búsqueda binaria en CAM, pero más tarde resultó que hacer TCAM (memoria asociativa ternaria) es bastante barato en términos de recursos y afecta ligeramente el tiempo. El límite inferior de frecuencia es de 125 MHz en la familia Kintex7 . ¡Empecemos! Nuestro CAM estará compuesto por estas líneas, cada una de las cuales corresponderá a una dirección y almacenará una palabra:


Cam_line


Figura 1. La estructura de una línea de CAM


En la Fig. 1, D es un disparador D normal para almacenar datos; el número de estos disparadores en la línea corresponde al ancho de la palabra de datos de entrada en CAM. VÁLIDO - D-trigger, que almacena '1' si los datos en la línea son relevantes. CMP es un comparador que compara el valor del bit de bus de clave de búsqueda correspondiente si VALID = '1'. escribir datos : escribir bus de datos , conectado en bits a la D correspondiente (ancho de palabra N - CAM), nosotros - escribir bandera, borrar - restablecer VÁLIDO (invalidación de la línea de datos). AND - lógico AND de N salidas de los comparadores, el marcador de coincidencia se convierte en '1' si la búsqueda en esta línea es exitosa.


Entonces, tenemos una línea en la que podemos buscar. Ahora combínalos:


Cam_structure


Figura 2. Estructura CAM


En la Fig. 2, CAM_line es la línea CAM real de la Fig. 1, MUX es el multiplexor de dirección de entrada, MATCH REGISTER es un registro que almacena los valores de los marcadores de coincidencia, ENCODER es un decodificador que convierte el bus de coincidencias en la dirección de coincidencia más baja encontrada. FSM es una máquina controladora de estados finitos, que es anterior. match elimina de MATCH REGISTER el bit correspondiente a la dirección enviada para que ENCODER cambie a la siguiente dirección encontrada. La interfaz de nuestra CAM será la siguiente:


LíneaDirecciónCita
addrIniciar sesiónEscribir / borrar dirección
datosIniciar sesiónRegistro / Datos clave
nosotrosIniciar sesiónBandera de registro
comprobarIniciar sesiónIndicador de búsqueda clave
claroIniciar sesiónMarcar línea de discapacidad en
addr_oSalirDirección encontrada por clave
partido_oSalirIndicador de éxito de búsqueda clave

Tabla 1. Interfaz CAM


A continuación, en la Fig. 3, hay un diagrama de tiempo del funcionamiento de esta interfaz, que muestra primero la grabación de tres palabras en CAM, luego una búsqueda exitosa, borrado y búsqueda nuevamente:


Cam_diagramm
Figura 3. Diagrama de tiempos de la interfaz a la CAM


Entonces, tenemos una descripción de CAM, pasemos a la síntesis.


Síntesis


Sintetizaremos en Xilinx ISE para comparar los resultados con los obtenidos en XAPP1151 .


W8v5


Figura 4. Dependencia de frecuencia después de XST (sintetizador como parte de ISE) en la profundidad CAM para el ancho del bus de datos de 8 bits


W32v5


Figura 5. Frecuencia después de XST versus profundidad CAM para el ancho del bus de datos de 32 bits


W64v5


Figura 6. Frecuencia después de XST versus profundidad CAM para el ancho del bus de datos de 64 bits


En la Fig. 6, no hay datos para Virtex5 , ya que CAM de este tamaño no se ajustaba a la BRAM existente. También observamos que para un ancho de 64 bits y una profundidad de 1024, nuestro resultado fue ligeramente peor que el de la implementación en SRL16. Ahora pasemos a la síntesis de Vivado para el XC7K325T . Los resultados son los siguientes:


W32k7


Figura 7. Dependencia de frecuencia después de PnR (colocación de bloques en el chip y seguimiento de señal) en la profundidad CAM para un ancho de bus de datos de 32 bits


K7res


Figura 8. Utilización de recursos para varias profundidades CAM para un ancho de datos de 32 bits en%


Es importante tener en cuenta que los resultados en Vivado se obtuvieron después de PnR, lo que significa que el diseño no tiene dificultades con el trazado.


TCAM


Como se mencionó anteriormente, obtener este enfoque de CAM TCAM no fue un problema particular. Es suficiente agregar un bus de enmascaramiento de datos para bits de datos y distribuirlo poco a poco en los comparadores para que al comparar datos con una clave, tengan en cuenta su valor. Tal cambio no condujo a una caída en la frecuencia o un aumento serio en los recursos consumidos, por lo que obtuvimos TCAM de forma gratuita.


Conclusiones


Entonces, pudimos completar la tarea. El diseño resultante permite que la séptima familia Xilinx FPGA reciba CAM suficientemente grande con una frecuencia por encima del objetivo de 125 MHz. El resultado de la comparación con XAPP1151 resultó inesperado para mí, supuse que la implementación en BRAM, aunque es muy costosa en términos de recursos, superará la implementación frontal en frecuencia. Sin embargo, no celebre la victoria tan temprano, este documento describe el núcleo Xilinx CAM IP, que permite, por ejemplo, obtener CAM con una profundidad de celdas de 32K y una frecuencia de 155 MHz, basada en BRAM. Este resultado probablemente se pueda lograr en la versión propuesta en el artículo, ya sea agregando las etapas de la tubería o recolectando CAM grandes de los pequeños, pero no puedo predecir de inmediato si encajará en el chip. En el futuro intentaré implementar algo similar en BRAM, pero por ahora, gracias por su atención.

Source: https://habr.com/ru/post/470892/


All Articles