Vivado
Vivado
La síntesis
de alto nivel es esencial para mantener la productividad del diseño para
diseños grandes.
Síntesis de alto nivel: HLS
Se utiliza el mismo hardware para cada iteración Se utiliza hardware diferente para cada iteración Se ejecutan diferentes iteraciones
del bucle: del bucle: simultáneamente:
Área pequeña Zona más alta Zona más alta
Latencia larga Latencia corta Latencia corta
Bajo rendimiento Mejor rendimiento Mejor rendimiento
Introducción a la síntesis de alto nivel
La subfunción se puede implementar para ejecutarse simultáneamente con el nivel superior y otras subfunciones
void
voidfirfir(( Finite State Machine (FSM)
data_t
data_t*y, *y, states
coef_t
coef_tc[4],c[4],
data_t
data_txx
)){{ Function Start
static
staticdata_t
data_tshift_reg[4];
shift_reg[4];
acc_t acc;
acc_t acc;
int
0
inti;i;
acc=0;
acc=0;
loop:
loop:for for(i=3;i>=0;i--)
(i=3;i>=0;i--){{ For-Loop Start
ifif(i==0)
(i==0){{
acc+=x*c[0];
acc+=x*c[0]; 1
shift_reg[0]=x;
shift_reg[0]=x;
}}else
else{{
shift_reg[i]=shift_reg[i-1];
shift_reg[i]=shift_reg[i-1];
acc+=shift_reg[i]*c[i];
acc+=shift_reg[i]*c[i];
}}
}} For-Loop End
*y=acc;
}}
*y=acc; 2
Function End
De cualquier ejemplo de Los bucles en el código C correlacionados Este comportamiento se extrae en un equipo
código C .. con estados de comportamiento de estado de hardware
HLS: Control y extracción de rutas de datos
void
voidfirfir(( Finite State Machine (FSM) Control Dataflow
data_t
data_t*y, *y, states
coef_t
coef_tc[4],c[4],
data_t RDx
data_txx
)){{
RDc
static
staticdata_t
data_tshift_reg[4];
shift_reg[4];
acc_t acc;
acc_t acc; >= 0
int
inti;i; RDx RDc
-
acc=0; >= -
acc=0;
loop:
loop:for for(i=3;i>=0;i--)
(i=3;i>=0;i--){{ == == -
ifif(i==0)
(i==0){{
acc+=x*c[0];
acc+=x*c[0]; + 1 + *
shift_reg[0]=x;
shift_reg[0]=x;
}}else
else{{ * + *
shift_reg[i]=shift_reg[i-1];
shift_reg[i]=shift_reg[i-1];
acc+=shift_reg[i]*c[i];
acc+=shift_reg[i]*c[i]; +
}}
}} *
*y=acc;
}}
*y=acc;
WRy
2 WRy
Scheduling Binding
User RTL
(Verilog, VHDL, SystemC)
Directives
Planificación
Las operaciones en el gráfico de flujo de control se asignan en ciclos de reloj
void foo ( a
… *
t1 = a * b;
b
+
t2 = c + t1; c
t3 = d * t2; d *
out = t3 – e;
} e - out
Schedule 1
* + * -
Schedule 2 * + * -
* + * -
Decisión vinculante: compartir
Teniendo en cuenta este cronograma:
El enlace debe usar 2 multiplicadores, ya que ambos están en el mismo ciclo
Puede decidir usar un sumador y un subtractor o compartir un addub
* + * -
Decisión vinculante: o no compartir
Teniendo en cuenta este cronograma:
Binding puede decidir compartir los multiplicadores (cada uno se utiliza en un ciclo diferente)
O puede decidir que el costo de compartir (muxing) afectaría el tiempo y puede decidir no compartirlos.
También puede tomar esta misma decisión en el primer ejemplo anterior.
Introducción a la síntesis de alto nivel
Síntesis de alto nivel con Vivado HLS
Flujo de validación
RTL vs Lenguaje de Alto Nivel
Beneficios de Vivado HLS
Productividad
– Verificación
• Funcional Video Design Example
Portabilidad
– Procesadores y FPGA
– Migración de tecnología
– Reducción de costes
– Reducción de potencia
RTL
RTL
RTL
RTL
RTL
Beneficios de Vivado HLS
Permutabilidad Untimed
Untimed C C
Specification
Specification
– Exploración de arquitectura
Area
• Timing
– Parallelization
RTL
– Pipelining
• Resources
– Sharing
eess
ssoouurrcc
– Mejor QoR
reRRee
SShhaare
RTL
RTL
rt Pipe
Insert
Inse liness
Pipeline
s
opps
RTL ll LLooo
RTL oll
nrro
Un
U
rtitio
Parti
Pa n Ar
tion rays
Arra ys
Timed RTL
Architectures
Performance
La rápida exploración de diseño ofrece QoR que rivaliza con RTL
codificado a mano
Entendiendo la síntesis de Vivado HLS
Vivado HLS
Determina en qué operaciones de ciclo deben realizarse (programación)
Determina qué unidades de hardware utilizar para cada operación (enlace)
– Realiza síntesis de alto nivel mediante:
– Obedecer los valores predeterminados integrados
– Obedecer las directivas y restricciones del usuario para anular los valores predeterminados
• Cálculo de retrasos y área utilizando la tecnología/dispositivo especificado
• Prioridad de las directivas en Vivado HLS
Conozca el rendimiento (clock & throughput)
Vivado HLS permitirá que una ruta de reloj local falle si esto es necesario para cumplir con el rendimiento
A menudo es posible que el tiempo se pueda cumplir después de la síntesis lógica
A continuación, minimice la latencia
A continuación, minimice el área
Los atributos clave del código C
De cualquier ejemplo de Las operaciones se Los tipos C definen el tamaño del hardware utilizado:
código C ... extraen... manejado automáticamente
Loops
+
a[N]
– Los bucles se pueden desenrollar si sus índices son estáticamente determinables en el momento de la elaboración
• No cuando el número de iteraciones es variable
• Los bucles no enrollados dan como resultado más elementos para programar, pero una mayor movilidad del operador
– Veamos un ejemplo....
Data Dependencies: Good
if (i==0) { - - + - - + - - + - +
acc+=x*c[0]; RDc RDc RDc RDx RDc
RDc RDc RDc RDx RDc
shift_reg[0]=x;
} else {
shift_reg[i]=shift_reg[i-1]; Iteration 1 Iteration 2 Iteration 3 Iteration 4
acc+=shift_reg[i]*c[i];
}
}
La operación read X tiene
*y=acc;
} buena movilidad
if (i==0) { - - + - - + - - + - RDx
RDx
+
acc+=x*c[0]; RDc RDc RDc RDc
RDc RDc RDc RDc
shift_reg[0]=x;
} else {
shift_reg[i]=shift_reg[i-1]; Iteration 1 Iteration 2 Iteration 3 Iteration 4
acc+=shift_reg[i]*c[i];
}
}
Agregar está muy
*y=acc;
restringido
} Ejemplo de mala movilidad
La suma final debe ocurrir antes de la escritura final y después de la última multiplicación y la suma anterior
Podría ocurrir en el mismo ciclo si el tiempo lo permite
Los bucles se enrollan de forma predeterminada
Cada iteración no puede comenzar hasta que se complete la iteración anterior
La adición final (en la iteración 4) debe esperar a que se completen las iteraciones anteriores
La estructura del código está forzando una programación particular
Hay poca movilidad para la mayoría de las operaciones
Las optimizaciones permiten desenrollar los bucles dando mayor libertad
Programación después de la optimización del bucle
RDc
RDc RDc
RDc
Las operaciones ahora pueden ocurrir en paralelo
RDx
RDx
Si las dependencias de datos lo permiten * *
Si el tiempo del operador lo permite * *
+ +
El diseño terminó más rápido pero utiliza más operadores
+
2 multiplicadores y 2 sumadores WRy
WRy
Los puertos (Dirección, CE activo alto, etc.) y el funcionamiento secuencial (relojes desde la dirección hasta la salida de
datos) están definidos por el modelo de biblioteca
Los arreglos de discos se pueden combinar con otros arreglos de discos y reconfigurarlos
{
Por ejemplo, particionado en puertos separados para cada elemento de la matriz
void foo_top( int A[3*N] , int x) DPRAMB
foo_top DIN0 DOUT0
L1: for (i = 0; i < N; i++)
A[i+x] = A[i] + i;
Synthesis ADDR0
++
}
CE0
WE0
CE1
WE1
RDc
Con el puerto C particionado en (4) puertos separados RDc
RDc
RDc
Todas las lecturas y mults pueden ocurrir en un ciclo RDc
RDc
RDc
Si el tiempo lo permite RDc
RDx
RDx
Las adiciones también pueden ocurrir en el mismo ciclo.
*
La escritura se puede realizar en los mismos ciclos *
Opcionalmente, las lecturas y escrituras del puerto podrían registrarse *
*
+
+
+
WRy
WRy
Operadores
Los tamaños de los operadores se definen por el tipo
El tipo de variable define el tamaño del operador
De forma predeterminada, Vivado HLS buscará minimizar el área después de que se satisfagan las restricciones.
El usuario puede establecer límites y objetivos específicos para los recursos utilizados
La asignación se puede controlar
Se puede establecer un límite superior en el número de operadores o núcleos asignados para el diseño: esto se puede usar para forzar el intercambio
Por ejemplo, limitar el número de multiplicadores a 1 obligará a Vivado HLS a compartir
Validación C Validate C
Una GRAN razón por la que los usuarios quieren usar HLS
Verificación rápida y gratuita
Validar que el algoritmo es correcto antes de la síntesis
Siga los consejos del banco de pruebas dados sobre
Verify RTL
Verificación RTL
– Vivado HLS puede co-simular el RTL con el banco de pruebas original
Vivado Design Suite
Vivado es la nueva herramienta que solo es compatible con la serie 7 FPGA, UltraScale y
todas las familias más recientes.
Los algoritmos para Vivado se implementan teniendo en cuenta el tamaño cada vez
mayor de las FPGA.
Todos los pasos tienen la misma visión sobre una estructura de datos global
ISE
http://zedboard.org/support/documentation/1521
Elaboración del diseño: Planificación de E/S
Elaboración de diseño
Síntesis y diseño sintetizado
Implementación y diseño implementado
Informes
Generación de flujo de bits
Administrador de hardware: destino abierto
Administrador de hardware: destino abierto
Administrador de hardware: dispositivo de programa