Altera_Forum
Honored Contributor
19 years agoSpecifying the latch edge for DDR output timing
This is a problem that I've had hanging over me for a while. I'm hoping someone can shed light on it.
So, I need to implement some DDR output logic (not for memory, but just to send a high-speed data stream to another chip--it's RGMII, if you must know). As I understand it, the standard way to implement that is with two sets of registers and a mux that selects between them based on the current phase of the clock. But here's the thing: the timing is too tight to clock each register at the beginning of its output phase. I need to clock it a half cycle earlier so that the latch-minus-launch time is a full cycle (instead of a half cycle). The numbers suggest to me that this should work. However, when I implement that, I can't find a way to make TimeQuest understand which latch/launch relationship to analyze. It seems to always assume that the latch edge is the very next edge, so it always thinks that the latch-minus-launch that it has to analyze is half a cycle, but I really want it to be a full cycle. I've tried setting a multicycle of 2 (instead of the default of 1), but that just adds a full cycle to get one and a half cycles, which is no good either. And it won't let me specify fractional multicycle values. I also tried just altering the numbers in set_output_delay to compensate, but that results in the minimum being greater than the maximum, so it complains and rejects the assignment. Does anyone know a way to deal with this situation? Is there a way to manually specify the latch/launch relationship, perhaps?