El problema que encontré está en la interfaz de diseño entre Xilinx FPGA y DAC. El diseño está bajo Xilinx Vivado 2017.1.
El bloque del sistema se ve así.
EsunaconexiónLVDSentreDACyFPGA.YelrelojdedatosDDRfuncionaa200MHz.ElrelojylosdatosestáncontroladosporODDR+BUFDSapinesdiferencialesdeFPGA.EldiseñodelainterfazdesalidaLVDSenFPGAseveacontinuación.
Debidoaqueesteesundiseñosincrónicodeorigen,elrelojvaconlosdatosaldac(concasilamismalongituddetrazadecobre),puseelretardodepropagaciónencero.YelDACtieneuntiempodeconfiguraciónde~0.2ns,yuntiempodeesperade0.6ns.Porlotanto,misecuenciadecomandosderestricciónpareceserlasiguiente.
create_generated_clock-namedac_clk_A-source[get_pinsbase_microblaze_design_i/inst/i_if/i_serdes_out_clk/g_data[0].i_oddr/C]-divide_by1[get_portsAclk_out_p]set_output_delay-clock[get_clocksdac_clk_A]-max0.200[get_ports-regexp-filter{NAME=~".*Adata_out_p.*" && DIRECTION == "OUT" }]
set_output_delay -clock [get_clocks dac_clk_A] -max 0.200 [get_ports -regexp -filter { NAME =~ ".*Adata_out_p.*" && DIRECTION == "OUT" }] -clock_fall -add_delay
set_output_delay -clock [get_clocks dac_clk_A] -min -0.600 [get_ports -regexp -filter { NAME =~ ".*Adata_out_p.*" && DIRECTION == "OUT" }]
set_output_delay -clock [get_clocks dac_clk_A] -min -0.600 [get_ports -regexp -filter { NAME =~ ".*Adata_out_p.*" && DIRECTION == "OUT" }] -clock_fall -add_delay
El problema ahora es que el diseño falla en la restricción de tiempo de espera. Es una restricción entre relojes entre el reloj (que controla ODDR) y el reloj DAC de salida. Supongo que create_generated_clock trata el reloj DAC de salida como un dominio de reloj separado.
Podría ver que la herramienta infiere una restricción entre los relojes entre el reloj que controla los ODDR (que es generado por MMCM) y el reloj de salida ( dac_clk_A
), requiere un tiempo de retención cero para el puerto de datos, que falla. No pude entender por qué Vivado infiere esta restricción. Debido a que dac_clk_A
solo se usa para el puerto de salida, la herramienta solo debe mantener la alineación de retardo entre el reloj y el puerto de datos.
¿Cómo soluciono el error? ¿Cómo se deben diseñar adecuadamente los dominios, buffers y restricciones de reloj?