I'm working on a design that's using multiple DCMs along with DDR i/o registers. The main input clock is 500MHz going into a DCM with the CLKIN_DIVIDE_BY_2 flag set so it's immediataly cut down to 250MHz. The DCMs used in the design also have CLKOUT_PHASE_SHIFT=VARIABLE.
To drive my DDR i/o flops, I'm currently using both the CLK0 and CLK180 pins (running at 250MHz).
The original designer flowed the DDR data though the chip using both clock edges, ie, the incoming "posedge" data went down a "posedge" data pipeline to flow back out the DDR output. The incoming "negedge" data went down a "negedge" pipeline. The original design did NOT use CLK0 and CLK180 for these two data paths. Instead, the designer used "posedge" and "negedge" in the Verilog. The major problem comes in the control and data signals that cross the two domains. Because of the potential duty cycle degradation, the P&R tools don't achieve timing closure consistently.
As an experiment, I changed the design to use CLK0 and CLK180 for the internal flops. I was: a) pleased when the P&R timing was better b) surprised when the design no longer worked. I figured I screwed up converting the pos/negedge vs CLK0/CLK180 conversions, so I tripple checked the design and didn't find anything. I backed up to a older working version, made the changes again being VERY careful in my conversion. Again, no luck. Timing number look good, the design doesn't work.
Is there something odd in the phasing between the the posedges of CLK0 and CLK180?
Anyone else run into something like this?
Thanks,
John Providenza