Altera_Forum
Honored Contributor
13 years agoCyclone V GX Dev Board DDR3 Timing Violations
I have been having "Hold Violations" in my Qsys soft DDR3 controller for the Cyclone 5 GX development board.
I get a negative error slack value on the *|pll0|pll2_phy~PLL_OUPUT_COUNTER|divclk There are 4 others that also give negative slack (*|pll0|pll ... PLL_OUTPUT_COUNTER|divclk) I set all the clock global clocks with the assignments editor (inst|ddr3|pll0* Gloabl ... ) with no success. I set multi-corner analysis on. -no change What finally made the hold violations go away was "set_min_delay" commands in the .sdc file. Here is a list of the commands I used: set_min_delay -to [get_clocks {inst|c5gxfc7_fpga_bup_qsys_inst|ddr3|pll0|pll1~PLL_OUTPUT_COUNTER|divclk}] -2.000 set_min_delay -to [get_clocks {inst|c5gxfc7_fpga_bup_qsys_inst|ddr3|pll0|pll1_phy~PLL_OUTPUT_COUNTER|divclk}] -4.000 set_min_delay -to [get_clocks {inst|c5gxfc7_fpga_bup_qsys_inst|ddr3|pll0|pll2_phy~PLL_OUTPUT_COUNTER|divclk}] -4.000 set_min_delay -to [get_clocks {inst|c5gxfc7_fpga_bup_qsys_inst|ddr3|pll0|pll6~PLL_OUTPUT_COUNTER|divclk}] -3.000 set_min_delay -to [get_clocks {inst|c5gxfc7_fpga_bup_qsys_inst|ddr3|pll0|pll7~PLL_OUTPUT_COUNTER|divclk}] -3.000 set_min_delay -to [get_clocks {clkin_50}] -1.000 As another experiment, I could also use the "set_false_paths" to make the Hold violations go away... set_false_path -to [get_clocks {inst|c5gxfc7_fpga_bup_qsys_inst|ddr3|pll0|pll1_phy~PLL_OUTPUT_COUNTER|divclk} ] My testing procedure was as follows: 1. Do an "Analysis and Synthesis" in Quartus 2. Pull up the TimeQuest Timing analyzer 3. Create the Timing netlist with Post-map checked 4. Read the SDC File and Update Timing netlist 5. Check the Report Hold Summary and other summaries 6. Make changes to my sdc files, Reset the Design, Read the SDC File, Update Timing Netlist, then check my Reports again until I got the results I think I wanted. I am new to FPGA design, and I was hoping somebody could explain to me what I did and what might the concequences be of doing what I did. I was also wondering if the settings apply to the real hardware, or just simulation results? I hope my experiments help others, and any expert analysis of my procedures would be greatly appreciated. Thanks, Ed set_instance_assignment -name GLOBAL_SIGNAL "GLOBAL CLOCK" -to *ddr3|pll0|pll* set_instance_assignment -name GLOBAL_SIGNAL "GLOBAL CLOCK" -to ddr3_clk_n set_instance_assignment -name GLOBAL_SIGNAL "GLOBAL CLOCK" -to ddr3_clk_p set_instance_assignment -name GLOBAL_SIGNAL "GLOBAL CLOCK" -to ddr3_dqs_n[0]_OUT set_instance_assignment -name GLOBAL_SIGNAL "GLOBAL CLOCK" -to ddr3_dqs_n[1]_OUT set_instance_assignment -name GLOBAL_SIGNAL "GLOBAL CLOCK" -to ddr3_dqs_p[0]_OUT set_instance_assignment -name GLOBAL_SIGNAL "GLOBAL CLOCK" -to ddr3_dqs_p[1]_OUT set_instance_assignment -name GLOBAL_SIGNAL "GLOBAL CLOCK" -to ddr3_dqs_p[0]_IN set_instance_assignment -name GLOBAL_SIGNAL "GLOBAL CLOCK" -to ddr3_dqs_p[1]_IN set_instance_assignment -name ENABLE_BENEFICIAL_SKEW_OPTIMIZATION_FOR_NON_GLOBAL_CLOCKS ON -to inst|c5gxfc7_fpga_bup_qsys_inst|ddr3 set_global_assignment -name OPTIMIZE_MULTI_CORNER_TIMING ON