Forum Discussion
I noticed that the clock skew and data delay are quite large in the failing timing.
Also, why is most of the logic placed in the center in the Chip Planner? It seems congested.
Could there be a location assignment set that might cause this?
If so, try disabling it, as this might limit the fitter's capability to place and route the design in order to meet timing.
Regards,
Richard Tan
All ports location are pcb driven, no chance to modify them.
Other than these, I didn't find other relevant assignments that could upset the fitter:
set_global_assignment -name CYCLONEIII_CONFIGURATION_SCHEME "PASSIVE SERIAL" set_global_assignment -name GENERATE_RBF_FILE ON set_global_assignment -name RESERVE_DATA1_AFTER_CONFIGURATION "USE AS REGULAR IO" set_global_assignment -name RESERVE_FLASH_NCE_AFTER_CONFIGURATION "USE AS REGULAR IO" set_global_assignment -name SIMULATION_MODE FUNCTIONAL set_global_assignment -name POWER_USE_TA_VALUE 50 set_global_assignment -name PHYSICAL_SYNTHESIS_COMBO_LOGIC OFF set_global_assignment -name PHYSICAL_SYNTHESIS_REGISTER_RETIMING ON set_global_assignment -name CYCLONEII_OPTIMIZATION_TECHNIQUE SPEED set_global_assignment -name TIMING_ANALYZER_DO_REPORT_TIMING ON set_global_assignment -name TIMING_ANALYZER_DO_CCPP_REMOVAL OFF set_global_assignment -name SYNCHRONIZER_IDENTIFICATION "FORCED IF ASYNCHRONOUS" set_global_assignment -name PHYSICAL_SYNTHESIS_REGISTER_DUPLICATION ON set_global_assignment -name ROUTER_LCELL_INSERTION_AND_LOGIC_DUPLICATION ON set_global_assignment -name ROUTER_TIMING_OPTIMIZATION_LEVEL NORMAL set_global_assignment -name QII_AUTO_PACKED_REGISTERS AUTO set_global_assignment -name FITTER_EFFORT "AUTO FIT" set_global_assignment -name ROUTER_CLOCKING_TOPOLOGY_ANALYSIS OFF set_global_assignment -name FLOW_ENABLE_RTL_VIEWER ON set_global_assignment -name PHYSICAL_SYNTHESIS_EFFORT NORMAL set_global_assignment -name TIMING_ANALYZER_REPORT_SCRIPT_INCLUDE_DEFAULT_ANALYSIS OFF set_global_assignment -name ADV_NETLIST_OPT_SYNTH_WYSIWYG_REMAP ON set_global_assignment -name POST_FLOW_SCRIPT_FILE "quartus_sh:post_build.tcl" set_global_assignment -name OPTIMIZATION_MODE BALANCED set_global_assignment -name OPTIMIZE_HOLD_TIMING "ALL PATHS" set_global_assignment -name PHYSICAL_SYNTHESIS_ASYNCHRONOUS_SIGNAL_PIPELINING ON set_global_assignment -name OPTIMIZE_POWER_DURING_SYNTHESIS "NORMAL COMPILATION" set_global_assignment -name HDL_MESSAGE_LEVEL LEVEL3 set_global_assignment -name FITTER_AGGRESSIVE_ROUTABILITY_OPTIMIZATION AUTOMATICALLY set_global_assignment -name AUTO_DELAY_CHAINS_FOR_HIGH_FANOUT_INPUT_PINS ON set_global_assignment -name MUX_RESTRUCTURE OFF set_global_assignment -name STATE_MACHINE_PROCESSING AUTO set_global_assignment -name NUM_PARALLEL_PROCESSORS ALL set_global_assignment -name PLACEMENT_EFFORT_MULTIPLIER 1 set_global_assignment -name ENABLE_OCT_DONE OFF set_global_assignment -name ENABLE_CONFIGURATION_PINS OFF set_global_assignment -name ENABLE_BOOT_SEL_PIN OFF set_global_assignment -name STRATIXV_CONFIGURATION_SCHEME "PASSIVE SERIAL" set_global_assignment -name CYCLONEII_RESERVE_NCEO_AFTER_CONFIGURATION "USE AS REGULAR IO" set_global_assignment -name SAFE_STATE_MACHINE ON set_global_assignment -name SYNTH_PROTECT_SDC_CONSTRAINT ON set_global_assignment -name AUTO_SHIFT_REGISTER_RECOGNITION OFF set_global_assignment -name REMOVE_REDUNDANT_LOGIC_CELLS ON set_global_assignment -name ALLOW_ANY_ROM_SIZE_FOR_RECOGNITION ON set_global_assignment -name ALLOW_ANY_RAM_SIZE_FOR_RECOGNITION ON set_global_assignment -name ALLOW_ANY_SHIFT_REGISTER_SIZE_FOR_RECOGNITION ON set_global_assignment -name ALLOW_SHIFT_REGISTER_MERGING_ACROSS_HIERARCHIES ALWAYS set_global_assignment -name PHYSICAL_SYNTHESIS_COMBO_LOGIC_FOR_AREA OFF set_global_assignment -name PHYSICAL_SYNTHESIS_MAP_LOGIC_TO_MEMORY_FOR_AREA ON set_global_assignment -name AUTO_RAM_RECOGNITION OFF set_global_assignment -name OPTIMIZE_TIMING "NORMAL COMPILATION" set_global_assignment -name FINAL_PLACEMENT_OPTIMIZATION NEVER
I've relaxed the fitter effort and this result in ~100ps of slack improvement, not a big deal yet.
Chip planner still shows this scenario; the blocks in red contain the adc interface logic with failing paths:
The first of failing paths looks like this in technology map viewer:
Going down the rabbit hole in property editor I can see "Input pin to Input Register Delay" set to 5:
Does this ring a bell? The value is the same for all the failing paths, both for rising and falling clock edges (adc behaves like-ish a ddr device, odd bits can be lathed during rising edge of adc clk, even can be lathed during falling edge).
In assignment editor I specified that adc_clk should be a fast output register and adc_data a fast input register:
This result in actual DDIOOUTCELL usage for clock out, but a regular register for input:
No ignored assignment message in compilation report, but fitter decided not to accept the suggestion and use a regular register.
Could this be the issue?
This is how I (tried to) constrain the input timings, bearing the ddr-ish behavior:
#input delay constraints (ddr) set_input_delay -clock { ad9266_clk } -max $ad9266_dco_delay_max [get_ports {rf_in_adc_dco}] set_input_delay -clock { ad9266_clk } -min $ad9266_dco_delay_min [get_ports {rf_in_adc_dco}] set_input_delay -clock { ad9266_clk } -clock_fall -max $ad9266_dco_delay_max [get_ports {rf_in_adc_dco}] -add_delay set_input_delay -clock { ad9266_clk } -clock_fall -min $ad9266_dco_delay_min [get_ports {rf_in_adc_dco}] -add_delay set_input_delay -clock { ad9266_clk } -max $ad9266_data_delay_max [get_ports {rf_in_adc_data[*]}] set_input_delay -clock { ad9266_clk } -min $ad9266_data_delay_min [get_ports {rf_in_adc_data[*]}] set_input_delay -clock { ad9266_clk } -clock_fall -max $ad9266_data_delay_max [get_ports {rf_in_adc_data[*]}] -add_delay set_input_delay -clock { ad9266_clk } -clock_fall -min $ad9266_data_delay_min [get_ports {rf_in_adc_data[*]}] -add_delay
Is something wrong?