Tengo un controlador DDR implementado en un FPGA usando Altera / Intel / Quartus, y estoy tratando de hacer que las restricciones sean correctas para el pin bidireccional DQS. Este pin es un pin estroboscópico de datos que el dispositivo DDR controla durante las lecturas, y que el FPGA controla durante la escritura. Las ventanas de datos válidos tienen tiempos de configuración y de retención relativos a este pin DQS, y cambian según las lecturas o escrituras.
Durante las escrituras, trato de centrar la ventana de datos válidos alrededor de la luz estroboscópica DQS registrando la salida de los pines de datos con un reloj de 0 grados, y registrando la salida del pin DQS con un reloj de 90 grados. Esto permite que los datos salgan mucho antes que el flash DQS.
Aquí está mi intento de restricción de tiempo SDC en la ruta de entrada:
create_clock -name CLK_ddr_ldqs_INPUT -period $DDR_CLK_PERIOD [get_ports ddr_ldqs_n]
set_multicycle_path 0 -from virt_clk -to CLK_ddr_ldqs_INPUT
set_input_delay -clock virt_clk $tDQSQ -max [get_ports $input_ports]
set_input_delay -clock virt_clk -$tQHmin -min [get_ports $input_ports]
set_input_delay -clock virt_clk $tDQSQ -max [get_ports $input_ports] -clock_fall -add_delay
set_input_delay -clock virt_clk -$tQHmin -min [get_ports $input_ports] -clock_fall -add_delay
Y aquí está mi intento en las rutas de salida:
set CLK_ddr_ldqs_n_OUTL CLK_ddr_ldqs_INPUT;
set_output_delay -clock $CLK_ddr_ldqs_n_OUTL $tDS -max [get_ports $input_ports]
set_output_delay -clock $CLK_ddr_ldqs_n_OUTL -$tDH -min [get_ports $input_ports]
set_output_delay -clock $CLK_ddr_ldqs_n_OUTL $tDS -max [get_ports $input_ports] -clock_fall -add_delay
set_output_delay -clock $CLK_ddr_ldqs_n_OUTL -$tDH -min [get_ports $input_ports] -clock_fall -add_delay
Sin embargo, el problema que tengo es que cuando veo las rutas de salida en el analizador TimeQuest, muestra que el reloj de inicio es el reloj de 0 grados, pero el reloj de enganche también es un reloj de 0 grados. El reloj de seguridad debe ser una versión de 90 grados.
El TimeQuest parece etiquetar los relojes correctamente: Launch Clock = pll1 | clk [0] (este es el reloj de 0 grados), y Latch Clock = CLK_ddr_ldqs_INPUT.
Estoy bastante seguro de que esto es probablemente solo una peculiaridad con la forma en que estoy definiendo las restricciones, así que probé algunos otros ejemplos que encontré en línea, reemplazando el conjunto CLK_ddr_ldqs_n_OUTL CLK_ddr_ldqs_INPUT; declaración con:
create_generated_clock -name CLK_ddr_ldqs_n_OUTL -source { inst5|altpll_component|auto_generated|pll1|clk[3] } [get_ports ddr_ldqs_n]
pll1 | clk [3] es la versión de 90 grados.
Pero recibo una advertencia que dice "ddr_ldqs_n ya tiene un reloj asociado, usa el indicador -add para reutilizar los pines" y luego la compilación finaliza con un error que dice "No se puede encontrar el reloj CLK_ddr_ldqs_n_OUT". Intenté hacer lo que decía y poner un "-add" en el comando. Al hacer esto, eliminé la advertencia, pero sigo recibiendo el error.
¿Alguien puede detectar el problema en cómo estoy haciendo esto?