Forum: FPGA, VHDL & Co. Benötige Hilfe beim DDR Constraints


von Johann (Gast)


Angehängte Dateien:

Lesenswert?

Hallo

Ich verwende einen Virtex 5 FPGA und einen externen AD-Wandler. Die 
Digitalisierung funktioniert auch schon ganz gut nur manchmal kommen 
fehlerhafte Werte zustande. Ich vermute mal dies liegt am Timing. Bis 
jetzt habe ich leider noch nicht so viele Erfahrung mit den Constraints.

Ich habe einen Takt von max. 200MHz. Die Daten werden per DDR-Verfahren 
an den FPGA übertragen.

Laut Datenblatt des AD-Wandlers kommen die Daten typischer Weise immer 
genau bei einer ansteigenden und fallenden Flanke. Im Worst Case können 
aber die Daten 0.5ns vor oder hinter der CLK-Flanke noch nicht stabil 
sein. Daher sollte man diesen Bereich meiden.


Ich habe es wie folgt programmiert. Die CLK geht auf einen CLK-BUFGDS 
und von dort auf einen internen BUFG.

Die Daten werden auf einen IBUDS gelget. Danach werden diese direkt mit 
einem IDDR verbunden. Der IDDR-Datenausgang ist dann direkt mit einem 
BLOCK-RAM verbunden.

Demnach habe ich meine Constraints wie folgt erzeugt:


Alle Datenleitungen zu einer Gruppe zusammenfassen:

INST "IDDR_ADC_1_DATA_0" TNM = GROUP_IDDR_ADC_1_DATA;
INST "IDDR_ADC_1_DATA_1" TNM = GROUP_IDDR_ADC_1_DATA;
...


Die Clockfrequenz festlegen

NET "ADC_1_DRY_P" TNM_NET = ADC_1_DRY_P;

TIMESPEC TS_ADC_1_DRY_P = PERIOD "ADC_1_DRY_P" 5 ns HIGH 50%;

Die Daten sollen 2ns vor der ansteigenden Flanke für 1,5ns stabil 
anliegen.
OFFSET = IN 2.0 ns VALID 1.5 ns BEFORE "ADC_1_DRY_P" TIMEGRP 
"GROUP_IDDR_ADC_1_DATA" RISING;
OFFSET = IN 2.0 ns VALID 1.5 ns BEFORE "ADC_1_DRY_P" TIMEGRP 
"GROUP_IDDR_ADC_1_DATA" FALLING


Und genau bei diesem OFFSET-IN-Constarint habe ich so meine Probleme. In 
Anhang habe ich 2 Screenshits hinzugefügt. Hier kann man sehen das vor 
und hinter jeder Flanke die Daten noch nicht stabil anliegen. Genau dies 
will ich verwenden. Laut diesem Bild muss der OFFSET-IN-Parameter siehe 
2. Screenshot 0.5ns groß sein. Da bei 200MHz die High Phase 2.5ns 
entspricht muss Data Valid Parameter 1.5ns sein. (Sorry fehler auf dem 
Screenshot hier steht 2)

Jedoch habe ich ein Beispiel Constraint im Internet gefunden was den 
Offset-In-Parameter auf 2ns setzt und den Data Valid Parameter auf 
1.5ns. Diese Variante halte ich auch für logisch richtig jedoch bin ich 
verunsichert und wollte Euren Rat einholen.


Da die Datenleitungen ja direkt mit IDDR verbunden werde habe ich kein 
IDELAY für die Datenleitungen vorgesehen.

Ich verwende nur ein IDELAY für die CLOCK-Leitung. Hierzu habe ich mit 
einem DCM aus 50MHz 200MHz erzeugt. Diese 200MHz habe ich mit dem 
IDELAYCNTRL verbunden.

Den IDELAY habe ich auf FIX eingestellt. Was mich nur wundert ist das 
pro Stuffe ein Delay von 78ps erzeugt wird. Veränder ich jedoch den Wert 
und mache erneut eine Timing Analyse sehe aich das dies nicht konstant 
ist.

Ich verwende ISE 11.4 und einen Virtex 5 mit dem langsamsten Speedgrade.

von Johann (Gast)


Lesenswert?

Hier ist eine Timing Analyse von einem Datenpfad: Ich habe den CLK um 
14*78ps verzögert.



Timing constraint: OFFSET = IN 2 ns VALID 1.5 ns BEFORE COMP 
"ADC_1_DRY_P" TIMEGRP         GROUP_IDDR_ADC_1_DATA "RISING";
 28 paths analyzed, 14 endpoints analyzed, 14 failing endpoints
 14 timing errors detected. (0 setup errors, 14 hold errors)
 Minimum allowable offset is   0.985ns.
------------------------------------------------------------------------ 
--------
Slack (setup path):     1.015ns (requirement - (data path - clock path - 
clock arrival + uncertainty))
  Source:               ADC_1_DATA_12_N (PAD)
  Destination:          IDDR_ADC_1_DATA_12 (FF)
  Destination Clock:    W_ADC_1_DRY rising at 0.000ns
  Requirement:          2.000ns
  Data Path Delay:      5.478ns (Levels of Logic = 2)
  Clock Path Delay:     4.518ns (Levels of Logic = 3)
  Clock Uncertainty:    0.025ns

  Clock Uncertainty:          0.025ns  ((TSJ^2 + TIJ^2)^1/2 + DJ) / 2 + 
PE
    Total System Jitter (TSJ):  0.050ns
    Total Input Jitter (TIJ):   0.000ns
    Discrete Jitter (DJ):       0.000ns
    Phase Error (PE):           0.000ns

  Maximum Data Path: ADC_1_DATA_12_N to IDDR_ADC_1_DATA_12
    Location             Delay type         Delay(ns)  Physical Resource
                                                       Logical 
Resource(s)
    ------------------------------------------------- 
-------------------
    AE23.PADOUT          Tiopp                 0.000   ADC_1_DATA_12_N
                                                       ADC_1_DATA_12_N
    AF23.DIFFI_IN        net (fanout=1)        0.000 
IBUFDS_ADC_1_DATA_12/SLAVEBUF.DIFFIN
    AF23.I               Tiodi                 1.164   ADC_1_DATA_12_P
                                                       IBUFDS_ADC_1_DATA_12/IBUFDS
    ILOGIC_X0Y31.DDLY    net (fanout=1)        3.962   W_ADC_1_DATA_12
    ILOGIC_X0Y31.CLK     Tidockd               0.352   B_ADC_1_DATA<12>
                                                       IDDR_ADC_1_DATA_12
    ------------------------------------------------- 
---------------------------
    Total                                      5.478ns (1.516ns logic, 
3.962ns route)
                                                       (27.7% logic, 
72.3% route)

  Minimum Clock Path: ADC_1_DRY_P to IDDR_ADC_1_DATA_12
    Location             Delay type         Delay(ns)  Physical Resource
                                                       Logical 
Resource(s)
    ------------------------------------------------- 
-------------------
    AC17.I               Tiopi                 1.074   ADC_1_DRY_P
                                                       ADC_1_DRY_P
                                                       IBUFGDS_ADC_1_DRY/IBUFDS
    IODELAY_X1Y23.IDATAINnet (fanout=1)        0.000 
W_ADC_1_DRY_IBUFGDS
    IODELAY_X1Y23.DATAOUTTioddo_IDATAIN        1.945   IDELAY_ADC_1_DRY
                                                       IDELAY_ADC_1_DRY
    BUFGCTRL_X0Y6.I0     net (fanout=2)        1.162   W_ADC_1_DRY1
    BUFGCTRL_X0Y6.O      Tbgcko_O              0.230   W_ADC_1_DRY_BUFG
                                                       W_ADC_1_DRY_BUFG
    ILOGIC_X0Y31.CLK     net (fanout=64)       0.107   W_ADC_1_DRY
    ------------------------------------------------- 
---------------------------
    Total                                      4.518ns (3.249ns logic, 
1.269ns route)
                                                       (71.9% logic, 
28.1% route)

von Duke Scarring (Gast)


Lesenswert?

Deine Daten kommen mit 200 MHz im DDR-Mode rein?
D.h. 200 MHz, DDR = alle 2.5 ns eine Flanke.

Johann schrieb:
> den CLK um 14*78ps verzögert
Das entspricht 1.01 ns.

> Data Path Delay:      5.478ns (Levels of Logic = 2)
> Clock Path Delay:     4.518ns (Levels of Logic = 3)
Die scheint er ja auch zu berücksichtigen.


Johann schrieb:
> Jedoch habe ich ein Beispiel Constraint im Internet gefunden was den
> Offset-In-Parameter auf 2ns setzt und den Data Valid Parameter auf
> 1.5ns. Diese Variante halte ich auch für logisch richtig jedoch bin ich
> verunsichert und wollte Euren Rat einholen.
Das ist möglicherweise für ein anderes Beispiel? Anderer Takt, anderer 
ADC?

Da steht, das es hold-Zeit Verletzungen sind.
Johann schrieb:
>  ... 14 hold errors)
>  Minimum allowable offset is   0.985ns.
Also liegen die Daten nicht lange genug an. Versuch doch mal eine 
Taktverzögerung von 12 * 78 ps = 935 ps. Damit solltest Du unter die 
geforderten 0.985 ns kommen.

Kann Dein ADC Testpattern generieren? Damit läßt sich die Übertragung 
prüfen.

Duke

von Johann (Gast)


Lesenswert?

Leider kann der keine Testsignale erzeuge. Ich muss einen 
Funtinsgenerator nehmen und einen Sinus erzeugen.

Den schaue ich mir an auerßdem ezeuge ich die FFT von dem Signal. Ich 
werde es mal mit 12 ausprobieren.

von Johann (Gast)


Lesenswert?

Muss ich denn nur 2ns als Offset-In-Parameter verwenden oder 0.5ns?

von Johann (Gast)


Lesenswert?

Weis denn keiner wie ich diese Constraint richtig setzen muss?

0.5ns oder 2ns für den Offset-IN-Parameter

von Johann (Gast)


Lesenswert?

Ich knapper schon die Tischkante. :-)

Und das wieder so kurz vor Weihnachten

von Duke Scarring (Gast)


Lesenswert?

Johann schrieb:
> Muss ich denn nur 2ns als Offset-In-Parameter verwenden oder 0.5ns?
Wenn ich mir Deine Grafiken im ersten Beitrag anschaue, dann würde ich 
sagen 0.5 ns.

Duke

von Johann (Gast)


Lesenswert?

0.5ns empfielt der Wizard. Aber rein logisch würde ich 2ns sagen, daher 
bin ich sehr unsicher. Ich denke jedoch das bereits einige mit DDR 
Signalen zu tun hatten siehe DDR RAM

von Christian R. (supachris)


Lesenswert?

Hast du dir das WP 237 von Xilinx mal reingezogen? 
http://www.xilinx.com/support/documentation/white_papers/wp237.pdf

von Johann (Gast)


Lesenswert?

Hier ist leider kein Beispiel für DDR constraints vorhanden. Außerdem 
wird das Valid constraint nicht benutzt.

von Johann (Gast)


Lesenswert?

Wenn ich das richtig verstehe dann stellt das Offset In Constraint 
folgendes da:

Das Offset In Constraint gibt an wie der Zusammenhang zwischen dem CLK 
und den Datenleitungen ist. Der Zusammenhang bezieht sich auf die Pads.

OFFSET = IN 2.0 ns VALID 1.5 ns BEFORE "ADC_1_DRY_P" TIMEGR 
"GROUP_IDDR_ADC_1_DATA" RISING;

bedeutet das die Daten 2ns vor der ansteigenden CLK Flanke satbil 
anliegen. Die Daten bleiben für 1.5ns  stabil. Demnach kann mit Hilfe 
des Constraint geprüft werden, ob die Setup and Hold Zeit am ersten 
FlipFlop eingehalten wird.

Im FPGA werden die Datenleitungeu und CLK Leitung bis zum ersten FF 
unterschiedlich verzögert.

Muss jetzt am Flip Flop immer die Datenleitung zuerst ankommen oder ist 
es besser wenn der Clock voher da ist? (Dadurch würde ja das Signal nur 
1 Takt später übernommen werden)


ICH VERSTEHE NUR NICHT WARUM DER WIAZRD IN DEN SCREENSHOTS ES ANDERS 
BESCHREIBT. HIER MUSS ICH JA EINE SEHR GERINGE OFFSET IN ZEIT VON 0.5ns 
ANGEBEN.

von Christian R. (supachris)


Lesenswert?

Ja, der Wizzard ist echt bissl komisch. Ich hab das immer so verstanden, 
dass das OFFSET IN die Zeit vor der Flanke angibt, in der die Daten 
stabil sind. Also Periodendauer - maximale Setup-Zeit des externen 
Bausteins. Und das VALID gibt die Zeit an, wie lange die Daten gültig 
sind, ungeachtet der Flanke. Also Periodendauer - Differenz aus 
maximaler und minimaler Setup-Zeit. Wenn der ADC also 1 bis 2 ns für das 
Setup der Daten nach der Flanke braucht, wäre das OFFSET IN 8ns und das 
VALID 9 ns. Die Daten könnten sich ja 1ns nach der Flanke schon ändern.
Bei DDR bin ich mir aber auch immer etwas unsicher. Im Whitepaper steht, 
man solle das manuell ausrechnen für den FALLING Zweig, der Wizzard 
erzeugt aber auch DDR Constraints mit FALLING drin.

von Johann (Gast)


Lesenswert?

Ich hatte auch den Wizard benutzt. Er erzeugt ein Constraint für rising 
und eins für falling edge. Nur leider werden die Timing nicht 
eingehalten, obwohl die Daten nach dem IBUFDS direkt auf ein IDDR geht. 
Dies habe ich auch mit dem Plan Ahead geprüft.

Bei einer Periode von 5ns ergibt das 2.5ns für die High-Phase und 2.5ns 
für die Low-Phase.

Im idealen Fall ändern die Daten zusammen mit dem Clock ihren Zustand. 
Jedoch steht im Datenblatt das die Daten SPÄTESTENS 0.5 ns nach jeden 
CLK-Flankenwechseln gültig anliegen.

Außerdem ist auch 0.5ns vor jedem Flankenwechsel kein stabiles 
Datensignal zu erwarten.

Darauchs  bin ich zu folgende Constraints gekommen:

OFFSET IN = (Periodendauer / 2) - 0.5ns --> 2.0ns
VALID = (Periodendauer / 2) - (2 x 0.5ns) --> 1.5ns

OFFSET = IN 2.0 ns VALID 1.5 ns BEFORE "ADC_1_DRY_P" TIMEGRP
"GROUP_IDDR_ADC_1_DATA" RISING;
OFFSET = IN 2.0 ns VALID 1.5 ns BEFORE "ADC_1_DRY_P" TIMEGRP
"GROUP_IDDR_ADC_1_DATA" FALLING

Jetzt hatte ich den Einfall einfach den CLK mit Hilfe eines IDELAYS um 
1.8 ns zu verzögern. Dadurch liegen die Daten mehr als 1.3ns (1.8ns 
-0.5ns = 1.3ns) stabil an wenn eine Clock-Flanke eintritt.

Also habe ich die Verzögerung eingebaut und mit Hilfe von Plan Ahead das 
ganze untersucht. Ich habe die Laufzeit des Datenpfads vom Input Pad bis 
zum IDDR Element ermittelt und die Laufzeit vom CLK (PAD bis IDDR). 
Anschließend habe ich die Differenz beider Datenpfade gebildet. Die 
Daten liegen aus meiner sich lange genug stabil an. Leider habe ich 
nichts gefunden wie lange die Setup Time von einem IDDR bei einem Virtex 
5 ist.

Ich kann durch das Verschieben des CLKs die Setup-Time einhalten jedoch 
erhalte ich dann einen negativen Slack beim Hold-Timing.


Die genauen Zeiten der Pfade kann ich beim nächsten mal posten. Und das 
Ergebnis der Timing Analyse.

von Christian R. (supachris)


Lesenswert?

Stimmen denn die Daten vom ADC nicht oder sagt das nur die statische 
Timing-Analyse? Du könntest auch alle Daten mit dem IDELAY einstellbar 
verzögern und durch inkrementieren - Daten lesen - inkrementieren die 
Breite des Daten-Auges ermitteln. Oder du machst in diesem Fall mal 
ausnahmsweise eine Timing-Simulation, die sagt dir an, wie weit die 
Timings verletzt sind.

von Johann (Gast)


Lesenswert?

Die Daten kommen werden schon richtig in den FIFO geschrieben. Nur ab 
und zu ledier nicht. Ich denke das ist ein Timing Problem das bei 
unterschiedlich Temperaturen auftritt.

Was mich halt wundert ist wenn ich dein IDEALY verwende dann steht im 
Datenblatt das pro Stuffe ein Delay von 78ps hinzukommt. Laut Plan Ahead 
sind die 78ps leider nicht konstant. Wenn ich zum Beispiel als festen 
Wert 14 beim Idealy einstelle, dann gehe ich von einer Verzögerung von 
78ps*14 aus --> 1092ps. Dies stimmt jedoch nicht. Wenn ich den Wert um 2 
erhöhe (also 16) dann erwarte ich eine Verzögerung von 1248ps (1248ps 
-1092ps = 156ps --> 2*78ps)

Jedoch zeigt mir Plan Ahead nicht diese Verzögerung an. Manchmal wird 
von 70ps ausgegangen manchmal von mehr.

Ich werde am Montag mal die genauen Ergebnisse der Pfadanalyse von Play 
Ahead posten. Ich habe es mit der Version 11.4 und 13.3 untersucht. Es 
sind keine Unterschiede feststellbar.

von Johann (Gast)


Lesenswert?

Frohes und vor allem gesundes neues Jahr an alle

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.