Aprenda sobre Vivado HLS en un artículo

El siguiente contenido está tomado de Puntualidad: "Navigator ZYNQ HLS Development Guide"

Para llevar nuevos productos al mercado lo antes posible, los diseñadores de sistemas digitales deben considerar cómo acelerar el ciclo de diseño y desarrollo. La aceleración del diseño se puede considerar principalmente desde dos aspectos: "reutilización del diseño" y "mejora del nivel de abstracción". La herramienta Vivado HLS de Xilinx puede usar directamente C, C ++ o System C para programar FPGA de la serie Xilinx, aumentando así el nivel de abstracción y reduciendo en gran medida el tiempo requerido para el desarrollo de FPGA utilizando descripciones RTL tradicionales.

1. Introducción integral de alto nivel

Inserte la descripción de la imagen aquí
Como se muestra en la Figura 1.1.1, hay cuatro niveles de abstracción de abajo hacia arriba en el diseño de FPGA, en orden: estructural, RTL, conductual y de alto nivel. El nivel más bajo de abstracción (estructural) implica la instanciación directa de las unidades de hardware subyacentes, como puertas lógicas e incluso LUT o flip-flops de nivel inferior. Los diseñadores se utilizan más comúnmente para diseñar en el "nivel de transferencia de registro (Nivel de transferencia de registro, RTL)". Este nivel de abstracción oculta los detalles subyacentes y describe las operaciones que se pueden realizar entre registros y registros. La descripción "conductual" de nivel superior es la descripción algorítmica del circuito, es decir, que describe qué tipo de función (comportamiento) exhibe el circuito, en lugar de describir cómo se debe operar cada registro.

Los varios niveles de abstracción introducidos anteriormente están diseñados utilizando el lenguaje de descripción de hardware HDL Se puede ver que a medida que aumenta el nivel de abstracción, los detalles de la implementación final del hardware del diseño se debilitan gradualmente. El método de diseño de "alto nivel" en el que se centra este capítulo utiliza directamente lenguajes de alto nivel como C / C ++ para el diseño, luego el compilador Vivado HLS sintetiza el código C en descripciones HDL y finalmente realiza la síntesis lógica para obtener la netlist Esta netlist finalmente se asignará al dispositivo FPGA específico.

Al igual que el lenguaje C u otros lenguajes de alto nivel tienen diferentes compiladores para diferentes arquitecturas de procesador, la herramienta Xilinx Vivado High-Level Synthesis (HLS) también es una especie de compilador, pero se usa para convertir C o C ++ El programa está implementado en la FPGA en lugar de en el procesador tradicional.

Se pueden utilizar tres lenguajes para el diseño y desarrollo en Vivado HLS, a saber, C, C ++ y SystemC.

2. Proceso de diseño de HLS

La función de Vivado HLS es simplemente convertir el diseño C, C ++ o SystemC en implementación RTL, y luego se puede sintetizar e implementar en la lógica programable de Xilinx FPGA o chip Zynq. Cabe señalar que el diseño realizado en C / C ++ es completamente diferente del código de software que se ejecuta en el procesador (procesador ARM en ZYNQ o procesador de núcleo suave MicroBlaze). En HLS, todos los diseños de C deben implementarse en lógica programable, es decir, todavía estamos haciendo diseño de hardware, pero ya no estamos usando un lenguaje de descripción de hardware.

El proceso de diseño con Vivado HLS se muestra en la siguiente figura:
Inserte la descripción de la imagen aquí
La entrada principal del diseño HLS es un diseño C / C ++ / SystemC y un conjunto de pruebas basado en C (TestBench). Primero debemos saber que la esencia del lenguaje C es una función, luego este conjunto de prueba se usa para verificar las funciones en el diseño C, y el proceso de verificación requiere una "referencia de oro". Esta "referencia de oro" es similar a una respuesta estándar y se utiliza para comparar la salida producida por la función en el diseño C.

Antes de sintetizar el diseño de la HLS, primero debemos realizar la "verificación funcional", es decir, la simulación en C, cuyo propósito es verificar el correcto funcionamiento del código C ingresado por la HLS. La forma de verificarlo es llamar a la función diseñada en C en TestBench y luego comparar su salida con la "referencia dorada". Si hay una diferencia con la referencia dorada, primero debe modificar y depurar el diseño C.

El siguiente paso es la síntesis de alto nivel del diseño, el proceso HLS en sí. Este proceso implica analizar y procesar código basado en C, además de instrucciones y restricciones dadas por el usuario para crear una descripción RTL. Después de la síntesis de alto nivel, se generará un conjunto de archivos de salida, incluidos los archivos de diseño RTL escritos en lenguaje Veilog o VHDL.

El modelo RTL obtenido una vez finalizado el proceso de síntesis se puede utilizar para la co-simulación C / RTL en Vivado HLS para verificar aún más la exactitud del diseño RTL sintetizado. En este proceso, Vivao HLS generará automáticamente un conjunto de prueba para proporcionar información para el diseño RTL y luego comparará su salida con el valor esperado. La diferencia entre la verificación funcional C y la co-simulación C / RTL se muestra en la siguiente figura:

Inserte la descripción de la imagen aquí
En la verificación funcional (simulación C) en el lado izquierdo de la Figura 1.2.2, el conjunto de prueba original es el archivo de prueba TestBench introducido por el usuario. El equipo de prueba RTL requerido para la co-simulación C / RTL a la derecha es generado automáticamente por Vivado HLS, por lo que no se requiere creación manual. El equipo de prueba generado incluye el equipo de prueba original y el módulo RTL bajo prueba. Transferencia de datos.

Además de verificar la función, también evaluamos la implementación y el desempeño del diseño RTL. Por ejemplo, si la cantidad de recursos necesarios en la FPGA, el retraso del diseño y la frecuencia de reloj más alta admitida cumplen los requisitos. Si no se cumplen los requisitos, el diseñador debe modificar las instrucciones y restricciones, y luego realizar una síntesis de alto nivel nuevamente, como se muestra en el ciclo derecho en la Figura 1.2.1. Un diseño puede requerir múltiples iteraciones de diseño de HLS para encontrar la "mejor" solución. Si es necesario, el diseñador también puede volver atrás y modificar el código de diseño C y luego volver a verificar el diseño desde el principio.

Una vez que se verifica el diseño y la realización también cumple con los objetivos de diseño deseados, se puede integrar en un sistema más grande. Podemos usar directamente el archivo RTL (es decir, el código VHDL o Verilog) generado por el proceso HLS Es más conveniente usar la función de empaquetado IP de Vivado HLS. Empaquetar la salida generada por Vivado HLS significa que los diseños de HLS pueden introducirse en otras herramientas de Xilinx en forma de núcleos IP, como el integrador IP en Vivado. Estos dos tipos de salida se muestran en la siguiente figura:
Inserte la descripción de la imagen aquí

Tres, integración de interfaz

Al realizar HLS, el diseñador debe analizar dos aspectos principales del diseño:

  • La interfaz diseñada, es decir, su conexión de nivel superior;
  • La función del diseño, es decir, el algoritmo que implementa;

Damos un diagrama conceptual de interfaces y funciones en el diseño de HLS, como se muestra en la Figura 1.3.1.
Inserte la descripción de la imagen aquí
En la figura anterior, las áreas verdes en ambos extremos representan las interfaces de entrada y salida del diseño, que muestran algunos tipos de interfaz, como la interfaz RAM, la interfaz FIFO y la interfaz de tipo de bus. La herramienta puede obtener estas interfaces a partir del código a través de Interface Synthesis, o el diseñador puede especificar manualmente el tipo de interfaz específico.

El área amarilla en el medio de la figura representa las funciones específicas que puede lograr el diseño HLS. Para diferentes aplicaciones, sus funciones también son diferentes. En el diseño de Vivado HLS, las funciones se obtienen del código de entrada a través del proceso de síntesis de algoritmos.

Aquí primero presentamos brevemente la síntesis de la interfaz. Como su nombre lo indica, Interface Synthesis se refiere a la síntesis de interfaces en el diseño de HLS. La interfaz sintetizada puede comunicarse con otros módulos en el sistema y también puede necesitar comunicarse con el procesador en el sistema.

El concepto de interfaz aquí incluye tanto el puerto como el protocolo utilizado. Todos los detalles del puerto (como el tipo, el ancho de bits y la dirección) se infieren de los parámetros y valores de retorno de la función de nivel superior en el archivo C / C ++; el protocolo se infiere del rendimiento (comportamiento) del puerto. Por ejemplo, la interfaz más simple puede ser un cable de 1 bit, mientras que la interfaz más compleja puede usar una interfaz de bus o RAM. Los tipos de interfaz que se pueden inferir mediante la síntesis de interfaz incluyen: líneas, registros, señales de enlace unidireccional y bidireccional, FIFO, memoria y bus.

A continuación, proporcionamos una función simple de nivel superior diseñada en C, la función se denomina find_average_of_best_X (), y sus parámetros se muestran en la siguiente figura:

Inserte la descripción de la imagen aquí
Los detalles del funcionamiento interno de la función en la Figura 1.3.2 no son importantes, pero la operación de lectura / escritura de cada parámetro determinará la dirección del puerto sintetizado. Esta definición de función contiene tres parámetros, la matriz "muestra" y el entero "X" son la entrada de la función y el promedio es la salida de la función. Por lo tanto, en términos simples, HLS debe convertir estos tres parámetros de función en dos interfaces de entrada y una interfaz de salida, como se muestra en la siguiente figura:
Inserte la descripción de la imagen aquí

Cabe señalar que la Figura 1.3.3 es solo un diagrama de interfaz simplificado. Según el protocolo utilizado, estas interfaces pueden incluir entradas o salidas de control distintas del puerto de datos en sí, como se muestra en la siguiente figura: La
Inserte la descripción de la imagen aquí
figura 1.3.4 es el diagrama de interfaz de un módulo RTL completo sintetizado por la función find_average_of_best_X () a través de HLS . Se puede ver en la figura que las interfaces sintetizadas por los tres parámetros de la función tienen sus propios protocolos, como el protocolo ap_memory, el protocolo ap_none y el protocolo ap_vld. Al mismo tiempo, el módulo también tiene algunos puertos más, como ap_clk y ap_rst, que usan el protocolo ap_ctrl_hs. Estos protocolos determinan cómo la interfaz correspondiente interactúa con otros módulos del sistema, en cuanto al significado específico de cada protocolo y cómo elegir su protocolo para la interfaz, lo presentaremos en capítulos posteriores.

Cuatro, síntesis de algoritmos

La síntesis de algoritmos se centra en la función del diseño, es decir, el comportamiento deseado del diseño, que se describe mediante el diseño de entrada C. La síntesis de algoritmos deduce varias operaciones aritméticas del código y luego las convierte en un conjunto de declaraciones RTL.

La síntesis de algoritmos incluye tres etapas principales, en orden:

  1. Analizar la ruta de datos y el circuito de control;
  2. Programación y encuadernación;
  3. mejoramiento;

Analizar la ruta de datos y el circuito de control.

La primera etapa de HLS es analizar el código C / C ++ / SystemC y explicar las funciones requeridas. Vivado HLS analiza programas desde los siguientes aspectos: operaciones lógicas y de algoritmos, sentencias y ramas condicionales, operaciones de matrices y bucles, etc.

La implementación resultante tendrá un elemento de ruta de datos y generalmente un elemento de control. Lo que debe aclararse es que el procesamiento de la "ruta de datos" aquí se refiere a las operaciones realizadas en las muestras de datos, y el "control" es el circuito que debe coordinarse con el procesamiento del flujo de datos. La esencia del algoritmo define la ruta de datos y los elementos de control, y el diseñador puede tomar pasos especiales en HLS para minimizar la complejidad de los elementos de control.

Programación y encuadernación

HLS se compone de dos procesos principales: Programación y Vinculación. Se llevan a cabo alternativamente y se influyen entre sí, como se muestra en la siguiente figura:
Inserte la descripción de la imagen aquí

  • La programación es la traducción de las declaraciones RTL obtenidas mediante la interpretación del código C en un conjunto de operaciones, y cada operación está asociada con un cierto tiempo de ejecución, en unidades de ciclos de reloj. Las decisiones tomadas en esta etapa se ven afectadas por la frecuencia y la incertidumbre del reloj, la tecnología del chip objetivo y las instrucciones impuestas por el usuario.

  • La vinculación es el proceso de vincular la operación programada con los recursos reales en el chip de destino. Las funciones y características de tiempo de estos recursos pueden afectar la programación, por lo que la información vinculante se retroalimentará al proceso de programación. Por ejemplo, el uso de recursos DSP48x indica que la ruta crítica es más corta que la solución que usa recursos lógicos.

mejoramiento

  • Restricciones: el diseñador puede imponer restricciones a ciertos indicadores del diseño. Por ejemplo, puede especificar el período de reloj más bajo. Esto garantizará que los resultados de la implementación cumplan con los requisitos del sistema que se integrará. De manera similar, el diseñador puede optar por restringir la utilización de recursos u otros indicadores para optimizar el diseño de la aplicación.

  • Instrucciones: El diseñador puede ejercer una influencia más específica sobre los parámetros de implementación de RTL a través de instrucciones. Hay varios tipos de instrucciones que se asignan a ciertas características del código. Por ejemplo, el diseñador puede especificar cómo el motor HLS maneja el bucle o matriz identificada en el código C, o el retraso de una operación específica. Esto puede provocar un gran cambio en la salida RTL. Por tanto, con el conocimiento de las instrucciones, el diseñador puede realizar optimizaciones según las necesidades de la aplicación.

Cinco, biblioteca HLS

Vivado HLS contiene una serie de bibliotecas C (incluidas C y C ++), que es conveniente para modelar algunas estructuras o funciones de hardware de uso común usando C / C ++, y se puede integrar en RTL. La biblioteca C proporcionada en Vivado HLS tiene los siguientes tipos:

1. Biblioteca de tipos de datos de precisión arbitraria
2, biblioteca HLS Stream
3, biblioteca matemática HLS
4, biblioteca de videos HLS
5, biblioteca IP HLS 6, biblioteca de álgebra lineal HLS

Llamar a funciones en la biblioteca en el diseño de HLS puede mejorar enormemente la eficiencia del desarrollo.

Supongo que te gusta

Origin blog.csdn.net/qq_39507748/article/details/114411155
Recomendado
Clasificación