Esta página pertenece a una serie de páginas sobre temporización (timing). Las páginas anteriores explicaron la teoría de los cálculos de temporización, mostraron cómo escribir varias restricciones de temporización (timing constraints) y analizaron los principios del cierre de temporización (timing closure). Esta página da comienzo al análisis de las restricciones de temporización de E/S.
Introducción
Hasta este punto, toda la discusión sobre restricciones de temporización se ha referido a los caminos (paths) internos de la FPGA. Por fin es momento de hablar de las restricciones que controlan la temporización de los puertos de E/S de la FPGA.
Pero antes de hablar de las restricciones de temporización, es necesario conocer los distintos métodos de sincronización entre la FPGA y el componente externo. Unas restricciones escritas sin tener en cuenta este tema pueden no servir de nada. Además, la lógica responsable de la interfaz de E/S puede estar mal escrita. En casos extremos, la placa de circuito impreso (PCB) puede carecer del cableado necesario para permitir una E/S con funcionamiento garantizado.
Con el conocimiento necesario sobre la sincronización con el componente externo, es posible elegir los comandos correctos para las restricciones de temporización. Los aspectos prácticos sobre esto se explican en la página siguiente.
En esta página supongo que estás familiarizado con los registros IOB (IOB registers).
Distribución del reloj
Mientras los caminos estaban dentro de la FPGA, no hacía falta preocuparse por la desviación del reloj (clock skew) entre los dos lados del camino: las herramientas eran responsables de la distribución del reloj, y los cálculos de temporización tenían en cuenta esa desviación.
Con las restricciones de temporización de E/S es distinto: un lado del camino es un componente externo, fuera de la FPGA. Para sincronizarse con las señales de datos, ese componente depende del reloj que recibe en uno de sus pines. ¿Y con qué está sincronizado ese reloj?
La estrategia suele ser una de estas dos:
- Reloj síncrono del sistema (system synchronous clock): el componente externo está conectado a la misma señal de reloj que el pin de entrada de reloj de la FPGA. Esta estrategia también se denomina reloj común (common clock).
- Reloj síncrono de fuente (source-synchronous clock): se suministra una señal de reloj especial junto con las señales de datos. Normalmente las señales de datos cambian de valor a la vez que el reloj: ya sea con el flanco de subida o con el flanco de bajada.
Estas dos estrategias se discuten con más detalle a continuación. En cuanto al reloj síncrono de fuente, hay una diferencia importante si las señales de datos son entradas o salidas. Por eso estos escenarios se tratan por separado.
Reloj síncrono del sistema
El método más sencillo para sincronizar varios componentes en una PCB es conectarlos todos a un único reloj. Esto se denomina reloj síncrono del sistema (system synchronous clock; en inglés también common clock).
La ventaja de este método es que los parámetros de temporización de todos los componentes son relativos a una única señal de reloj. Por tanto, para el cálculo de tiempos, el reloj es el mismo a ambos lados. Así, para una señal de datos que se propaga entre dos componentes de la PCB, el cálculo es similar al de un camino interno de la FPGA: el camino comienza con un retardo de reloj a salida (clock-to-output) relativo al primer flanco de reloj. Al final del camino, el tsu es relativo al segundo flanco. El método del reloj síncrono del sistema implica que esos dos flancos pertenecen al mismo reloj.
Por tanto, trabajar con un reloj síncrono del sistema es sencillo; sin embargo, este método solo es adecuado para frecuencias relativamente bajas. Recuerda de la introducción a los cálculos de temporización que el periodo mínimo del reloj es la suma de varios parámetros: el retardo de reloj a salida del primer flip-flop, el retardo de propagación (propagation delay) y el tsu del segundo. Para un puerto de salida, el retardo de reloj a salida es relativamente grande, porque es el tiempo que tarda el cable de la PCB en alcanzar la tensión requerida. Pero no termina ahí: también hay que sumar la desviación del reloj (clock skew) y otras incertidumbres relacionadas con el reloj. Con todos los valores sumados, el periodo mínimo del reloj puede no ser impresionante.
Como regla general, un reloj síncrono del sistema no es adecuado para una E/S con una velocidad de datos superior a 100 MHz. Pero esto depende mucho de los componentes implicados. De hecho, algunos componentes electrónicos tienen requisitos de temporización muy difíciles de cumplir con un reloj síncrono del sistema, incluso a frecuencias mucho menores. Esos componentes son una de las razones por las que es importante planificar la temporización de la E/S antes de fabricar la PCB.
set_input_delay y set_output_delay (que se explican en la página siguiente) son las restricciones de temporización más adecuadas para usar junto con un reloj síncrono del sistema.
Reloj síncrono de fuente
Con bastante frecuencia, la interfaz entre dos componentes en una PCB se basa en un reloj suministrado por uno de esos componentes. Naturalmente, hay diferencia si el reloj lo genera la FPGA o el componente externo.
Por tanto, hay cuatro escenarios relevantes:
- Los datos y el reloj son salidas generadas por la FPGA. Este escenario relativamente sencillo se trata por separado en la página sobre salidas síncronas de fuente (source-synchronous outputs).

- Los datos y el reloj los genera el componente externo; por tanto, la FPGA los recibe como señales de entrada. Hay una página dedicada a este escenario: entradas síncronas de fuente (source-synchronous inputs).

- El reloj lo genera la FPGA, pero los datos son bidireccionales (o entradas). Es un caso especial de entradas síncronas de fuente. El hecho de que la FPGA genere el reloj no supone una gran diferencia: las entradas de datos se sincronizan con el reloj en la PCB. Ese reloj tiene un retardo con respecto al reloj interno de la FPGA. Ver la página sobre salidas síncronas de fuente para más información sobre este escenario.

- El reloj lo genera el componente externo y los datos son bidireccionales. En cuanto a las entradas de la FPGA, este escenario es similar a cuando los datos los genera el componente externo (reloj síncrono de fuente). En cuanto a las salidas de la FPGA, se comportan como cualquier salida síncrona con un reloj externo. Por tanto, esas salidas se tratan como si fueran síncronas del sistema.
Entradas asíncronas
Algunas entradas no están asociadas a ningún reloj. Por ejemplo, los pulsadores, I2C, RS232 y varias señales de estado procedentes de componentes externos no están sincronizadas con un reloj. Estas señales suelen ser mucho más lentas que el reloj interno de la FPGA. La solución habitual es, por tanto, muestrear (sampling) estas señales con flip-flops (preferiblemente registros IOB) y continuar con las técnicas habituales de diseño lógico.
Estas entradas no están sincronizadas con el reloj utilizado para el muestreo. Por tanto, el registro IOB (o el flip-flop conectado al puerto) cumple la función de una protección contra la metaestabilidad. Por eso debería usarse un segundo registro para cada puerto, como en un cruce de dominios de reloj (clock domain crossing) entre relojes no relacionados (unrelated clocks). De lo contrario, existe el riesgo de comportamientos impredecibles y extraños, aunque las señales de entrada sean lentas y el diseño parezca funcionar correctamente en ese momento.
Las restricciones de temporización deben escribirse para garantizar un comportamiento repetible: deben seguirse las mismas pautas que para los registros IOB, incluso si los flip-flops no están colocados dentro del IOB. Para mayor seguridad, conviene añadir también una restricción de temporización específica relacionada con su papel como protección contra la metaestabilidad (esto se explica en una página aparte).
Caminos falsos
Los caminos falsos (false paths) para puertos de E/S son en principio lo mismo que para los caminos internos de la FPGA: se usa el comando set_false_path para pedir que no se apliquen requisitos de temporización a puertos concretos.
Los caminos falsos ya se han comentado respecto a los caminos internos de la FPGA. Basándose en la misma lógica, la motivación para usar caminos falsos en puertos de E/S es principalmente mantener vacía la lista de caminos sin restricciones. Esa lista debe estar vacía para facilitar la detección de cuándo un puerto carece de restricciones de temporización por error.
Los caminos falsos solo deben usarse cuando la temporización del puerto carece por completo de significado. Por ejemplo, con LED e interruptores DIP.
Ejemplos de restricciones SDC:
set_false_path -to [get_ports led_0] set_false_path -from [get_ports dip_switch_0]
Resumen
Esta página ha esbozado algunas estrategias para sincronizar la FPGA con el componente externo. La estrategia elegida influye tanto en el diseño lógico como en las restricciones de temporización.
Con este conocimiento, es el momento de ver cómo escribir las restricciones de temporización de E/S.
