Ruta crítica para bloque combinacional

Estoy tratando de sintetizar un bloque lógico combinacional en verilog usando Xilinx Vivado. Estoy tratando de reducir la cantidad de luts y aún trato de encontrar la ruta crítica del circuito.

Muchas soluciones dicen que el análisis de tiempo se realiza de registro a registro. Sin embargo, si la salida se realiza como registros, el área de mi diseño aumenta.

¿Hay alguna forma de encontrar la ruta crítica del diseño de comportamiento sin usar registros de salida?

Respuestas (2)

¿Cómo restringir los caminos sin registros?

Sí, hay una manera. Las rutas de tiempo no tienen que ser de registro a registro. Un puerto también puede ser un punto de inicio o un punto final. Si su bloque es completamente combinacional, todas las rutas serán desde los puertos de entrada a los puertos de salida.

Lo más importante aquí es definir un reloj virtual y retrasos de entrada/salida en un archivo XDC. Luego debe agregar el archivo al proyecto Vivado.

create_clock -name VCLK -period 10.0 -waveform {0 5.0}

set_input_delay  1.0 -clock [get_clocks VCLK] [get_ports IN1]
set_output_delay 2.0 -clock [get_clocks VCLK] [get_ports OUT1]

El ejemplo anterior dice que IN1la señal llega al bloque 1ns después de VCLKlas subidas. Además, OUT1tiene que ser fijado 2ns antes de VCLKsubidas. Dado que nuestro período de reloj es de 10 ns, la ruta desde IN1hasta OUT1tiene 7 ns (10-1-2) para finalizar la operación.

¿Cómo ver la ruta crítica en Vivado?

Una vez completada la implementación, haga clic en " Informes " en la parte inferior de la GUI de Vivado. A continuación, haga clic en " Informe de resumen de tiempo " en " Diseño de ruta ". Como alternativa, también puede buscar el archivo blabla_timing_summary_routed.rpt en el directorio del proyecto.

Este informe muestra las rutas críticas para todos los dominios de reloj. Como solo tiene un dominio de reloj, debería ver algo como a continuación.

From Clock:  VCLK
  To Clock:  VCLK

Luego busque la sección " Rutas máximas de retardo ". Verá la ruta crítica debajo de ella.

Este enfoque me permitirá verificar si el diseño se ejecuta durante un período de tiempo predeterminado, pero no me dará un tiempo de retraso de ruta crítica (que es lo que estoy buscando).
@AdityaPradeep Agregué la información para ver la ruta crítica.
Gracias, este método funciona. Sin embargo, lo que quise preguntar en mi comentario anterior fue sobre el tiempo de la ruta crítica. (Por lo que entendí, este método me permite verificar si el diseño funciona para una frecuencia determinada. Necesito encontrar la frecuencia máxima para la que el diseño aún funciona).
@AdityaPradeep Xilinx ISE estaba dando un valor de estimación para la frecuencia máxima, sin embargo, la estimación no era muy precisa. No sé si Vivado también hace esto. Puede definir un período de reloj ajustado y luego restarle la holgura después de la síntesis. Este método tiene una precisión moderada según mi experiencia. La forma más precisa es ejecutar la síntesis de forma iterativa. Si solo tiene un bloque, creo que puede hacerlo incluso manualmente.

No estoy usando Xilinx, pero los comandos parecen familiares con una herramienta que usé en el pasado.

Con un poco de suerte, el script "reportCriticalPaths" en la página 25 en Vivado Scripting Documentation es de ayuda. Básicamente, utiliza la salida de "get_timing_paths -delay_type $delayType -max_paths 50 -nworst 1" para enumerar las rutas en un archivo CSV.

Para obtener rutas críticas, probablemente necesite restricciones en sus rutas. En mi humilde opinión, puede usar "set_max_delay" para hacerlo. Establezca el retraso máximo en un número pequeño desde sus entradas combinatorias hasta las salidas combinatorias (para el análisis de tiempo) y probablemente obtendrá las peores rutas reportadas como infractoras. Por lo que recuerdo, ese es el tipo de truco que apliqué para estas cosas.