Source Synchronous Centre Aligned DDR timing constraints don't work
Hello,
I am attempting to constrain an SLVS Source Synchronous Centre Aligned DDR Rx interface for a Cyclone V SX series device, using Quartus 18.1.
Aside from some aspects of the set_input_delay constraints that's been confusing me, I've been having various issues with getting the basic constraints to work.
When I run a setup report, I am getting a failing path between the virtual (launch) clock and clock output from my PLL (in source synchronous mode).
Part of the reason for this failure is because the tool seems to think that the virtual (launch) clock should only be launching on the rising edge, even if the particular path latches on the falling edge.
I have attempted to use "set_false_path" .sdc commands to tell it that data launched on the rising edge shouldn't be latched on the falling edge, however, all this does is set this to a false path; the tool still doesn't know that the launch clock can launch on either edge. I am able to verify this using the clock transfers report.
The other avenue I tried was to create 2 virtual clocks; one that launched on the rising edge and another that also launched on its rising edge, but that is 180 degrees out of phase.
This did not solve the issue however.
I am not sure what I am doing wrong; this aspect is not mentioned in any of the apps notes (e.g. AN433) or other Intel documents on this topic of constraining DDR source synchronous interfaces.
For reference, my constraints are as follows:
create_clock -name CLK_FPGA -period 50Mhz [get_ports {CLK_FPGA}]
derive_pll_clocks -use_net_name
create_clock -name CLK_SENSOR -period 3.367 -waveform {0.84175 2.52525} [get_ports {CLK_SENSOR}]
derive_pll_clocks -use_net_name
create_clock -name CLK_SENSOR_EXT -period 3.367
set_input_delay -clock { CLK_SENSOR_EXT } -max 0.336 [get_ports {SERIAL_DATA[3]}]
set_input_delay -clock { CLK_SENSOR_EXT } -min -0.336 [get_ports {SERIAL_DATA[3]}]
set_input_delay -clock { CLK_SENSOR_EXT } -fall -max -add_delay 0.336 [get_ports {SERIAL_DATA[3]}]
set_input_delay -clock { CLK_SENSOR_EXT } -fall -min -add_delay -0.336 [get_ports {SERIAL_DATA[3]}]
#if setting false paths:
set_false_path -setup -rise_from [get_clocks {CLK_SENSOR_EXT}] -fall_to [get_clocks {SS_PLL:Source_Synchronous_PLL|SS_PLL_0002:ss_pll_inst|altera_pll:altera_pll_i|outclk_wire[0]}]
set_false_path -setup -fall_from [get_clocks {CLK_SENSOR_EXT}] -rise_to [get_clocks {SS_PLL:Source_Synchronous_PLL|SS_PLL_0002:ss_pll_inst|altera_pll:altera_pll_i|outclk_wire[0]}]
set_false_path -hold -rise_from [get_clocks {CLK_SENSOR_EXT}] -rise_to [get_clocks {SS_PLL:Source_Synchronous_PLL|SS_PLL_0002:ss_pll_inst|altera_pll:altera_pll_i|outclk_wire[0]}]
set_false_path -hold -fall_from [get_clocks {CLK_SENSOR_EXT}] -fall_to [get_clocks {SS_PLL:Source_Synchronous_PLL|SS_PLL_0002:ss_pll_inst|altera_pll:altera_pll_i|outclk_wire[0]}]