No quiero un texto introductorio sobre restricciones de tiempo, ni una nota de aplicación, un manual del usuario, un seminario web. Los leí todos, ya, muchas veces. El concepto detrás de las restricciones de tiempo es muy fácil. Aún así, cuando tengo que codificarlos en un archivo sdc no puedo hacerlo. Tengo que pasar varios días intentando que el software Quartus acepte mi diseño. Y estoy seguro de que muchos otros diseñadores de FPGA están sufriendo como yo.
¡Alguien, por favor, detén esta agonía!
Probemos con un ejemplo. Considere la siguiente entidad superior:
entity top is
generic (
W : positive := 8
) port (
ser_data_in : in std_logic; -- Serial data in
ser_bclk_in : in std_logic; -- Bit clock in
ser_fclk_in : in std_logic; -- Frame clock in
par_data_in : in std_logic_vector(W-1 downto 0); -- Parallel data in
par_wclk_in : in std_logic; -- Word clock in
ser_data_out : out std_logic; -- Serial data out
ser_bclk_out : out std_logic; -- Bit clock out
ser_fclk_out : out std_logic; -- Frame clock out
par_data_out : out std_logic_vector(W-1 downto 0); -- Parallel data out
par_wclk_out : out std_logic -- Word clock out
);
end entity;
Los datos en serie se transmiten en DDR, sincronizados por el reloj de bits (frecuencia = F), que está alineado en el centro. Los datos en serie también vienen con un reloj de cuadro, que está alineado por el borde con el primer bit en serie (frecuencia = F / W). Los datos paralelos son SDR, sincronizados por el reloj de palabra (frecuencia = F / W), que está alineado por el borde.
No entraré en los detalles de SERDES. Imaginemos que tengo un registro de desplazamiento simple que cambia con ser_bclk_in y transfiere sus datos a otro registro en cada flanco ascendente de ser_fclk_in. Los datos deserializados operan de alguna manera con datos de entrada paralelos y el resultado se envía a ser_data_out y par_data_out. Naturalmente, los SERDES en la salida son especulares a la entrada.
Mi pregunta es: para un sesgo máximo dado entre datos y relojes, ¿cómo puedo restringir un diseño de este tipo? Como ya tengo todos los relojes que necesito, ¿puedo restringir con éxito este diseño sin usar los PLL? ¿Es necesario declarar las rutas multiciclo? Si es así, ¿por qué?
P.S. Todavía estoy dispuesto a leer más sobre el tema, por lo tanto, si conoces algún texto inusualmente claro acerca de las restricciones de tiempo, por favor compártelo también :)