Forum: FPGA, VHDL & Co. Kann mir jemand beim Platzieren von DCMs helfen?


von Steffen Hausinger (Gast)


Lesenswert?

Hallo zusammen,

ich benötige in meinem Design zwei Taktfrequenzen, einen Systemtakt und 
einen Takt für ein I/O-Modul (16 MHz). Da ich für keine von beiden den 
Eingangstakt verwenden möchte, habe ich zwei DCMs angelegt. Soweit so 
gut, in der Simulation klappt alles und synthetisieren lässt es sich 
auch.

Nur beim Platzieren bekomme ich folgende Fehlermeldung (ISE 11.1):
1
ERROR:Place:1012 - A clock IOB / DCM component pair have been found that are not placed at an optimal clock IOB / DCM site pair.  The clock component <CLKGen_100MHz_unit/DCM_SP_INST> is placed at site <DCM_X0Y1>.  The clock IO/DCM site can be paired if they are placed/locked in the same quadrant.  The IO component <CLK_ext> is placed at site <T10>.  This will not allow the use of the fast path between the IO and the Clock buffer. If this sub optimal condition is acceptable for this design, you ma
2
y use the CLOCK_DEDICATED_ROUTE constraint in the .ucf file to demote this message to a WARNING and allow your design to continue. However, the use of this override is highly discouraged as it may lead to very poor timing results. It is recommended that this error condition be corrected in the design. A list of all the COMP.PINs used in this clock placement rule is listed below. These examples can be used directly in the .ucf file to override this clock rule. < NET "CLK_ext" CLOCK_DEDICATED_ROUTE
3
 = FALSE; >
4
   < PIN "CLKGen_100MHz_unit/DCM_SP_INST.CLKIN" CLOCK_DEDICATED_ROUTE = FALSE; >


Es gibt einen recht aktuellen Thread hier im Forum (siehe 
Beitrag "Problem mit DCM-Position"). Leider unterhalten sich da 
offensichtlich zwei Leute vom Fach, wozu ich mich leider (noch) nicht 
zählen kann. Daher kann ich dem Post nicht folgen.

Ich lese aus der Fehlermeldung, dass der Platzierer es nicht schafft, 
die DCMs in den gleichen Quadranten wie den Takteingang zu setzen. 
Deshalb muss er irgendeinen langsameren Pfad auswählen und der Takt wird 
suboptimal ausgeführt.

Was ich aber nicht verstehe, ist, ...

...wieso er das denn nicht ordentlich Platzieren kann? Der verwendete 
Spartan 3E (XC3S500E) hat 8 DCMs, demnach werden in jeden Quadranten 2 
DCMs fallen. Mehr brauche ich auch nicht - wieso klappt das denn nun 
nicht?

...was das Faß überhaupt zum Überlaufen gebracht hat? Oder ist es etwa 
generell immer so, dass man bei der Verwendung von zwei DCMs automatisch 
in diese Beschränkung rennt?


Was kann ich jetzt sinnvolles tun, um dieses Problem aufzulösen? Was 
meint der Platzierer in seiner Fehlermeldung, wenn er von "very poor 
timing results" spricht? Was erwartet mich da?


Grüße
Steffen

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Steffen Hausinger schrieb:
> <CLK_ext> is placed at site <T10>.  This will not allow the use of the
> fast path between the IO and the Clock buffer.
Ist der Pin T10 bei deinem FPGA ein Takteingang?

> wenn er von "very poor timing results" spricht?
Jitter und Skew werden unkalkulierbar und schlecht.
> Was erwartet mich da?
Das kann keiner genau sagen...  :-/

von Steffen Hausinger (Gast)


Lesenswert?

Lothar Miller schrieb:
> Ist der Pin T10 bei deinem FPGA ein Takteingang?

Nein, aber nach der Lesart oben bin ich auch davon ausgegangen, dass mit 
"Side T10" etwas anderes gemeint sei. Sonst hätte ich das Wort "Pad" 
erwartet.

Der Takteingang liegt auf Pin C9 (-> Digilent-Bord). Das habe ich dem 
Tool aber auch in der *.ucf bekannt gegeben:
1
NET "CLK_ext" LOC = C9;
2
NET "CLK_ext" IOSTANDARD = LVCMOS33;
3
NET "CLK_ext" TNM_NET = CLK_ext;
4
TIMESPEC TS_CLK_ext = PERIOD "CLK_ext" 50 MHz HIGH 40% INPUT_JITTER 1 ps;


Was würdest Du denn jetzt an meiner Stelle machen?

von Christian R. (supachris)


Lesenswert?

Du kannst nix anderes machen, als das CLOCK_DEDICATED_ROUTE = FALSE in 
die UCF einzutragen, wenn dein Takt auf so einem Pin bleiben muss. Schau 
dir mal im User Guide das Übersichtsbild zu den DCMs und Clock-Leitungen 
an, dann siehst du schnell die Grenzen. Nur bestimmte CLK Eingänge 
können direkt auf die einzelnen DCMs gehen, und die Zahl der internen 
Clock Lanes ist auch nur 8. Somit kannst du z.B. nicht jeweils alle 4 um 
90° verschobenen Ausgänge zweier nebeneinander liegender DCMs 
gleichzeitig auf die Clock Lanes aufschalten.

von Steffen Hausinger (Gast)


Lesenswert?

Christian R. schrieb:
> Nur bestimmte CLK Eingänge
> können direkt auf die einzelnen DCMs gehen

Mein Takteingang, C9, ist so einer. Er geht direkt auf DCM_X0Y1 - passt 
also.


Christian R. schrieb:
> Somit kannst du z.B. nicht jeweils alle 4 um
> 90° verschobenen Ausgänge zweier nebeneinander liegender DCMs
> gleichzeitig auf die Clock Lanes aufschalten.

Na gut, aber das will ich doch auch gar nicht. Schon klar, dass das nur 
ein Beispiel von Dir war. Aber soll das mit anderen Worten heißen, dass 
es nicht möglich ist, zwei verschiedene Taktfrequenzen zu erzeugen?! 
Bzw. nur mit den genannten Einschränkungen?

Ich bin bisher davon ausgegangen, das wäre eine Standard-Aufgabe und ein 
FPGA langweilt sich über sowas. Aber demnach würden ja alle Spartan 3 da 
draußen nur mit maximal 2 Takten betrieben werden (oder die 
Einschränkung in Kauf nehmen). Ist das denn wirklich so?! Warum gibt es 
denn dann überhaupt 4 DCM-Einheiten?

von Christian R. (supachris)


Lesenswert?

Steffen Hausinger schrieb:
> Christian R. schrieb:
>> Nur bestimmte CLK Eingänge
>> können direkt auf die einzelnen DCMs gehen
>
> Mein Takteingang, C9, ist so einer. Er geht direkt auf DCM_X0Y1 - passt
> also.

Das schon. Aber den meckert er ja nicht an, sondern den 2. Takteingang 
am T10. Das ist offenbar überhaupt kein CLK Eingang oder einer, der 
nicht benutzbar ist, weil durch den anderen DCM blockiert.

> Christian R. schrieb:
>> Somit kannst du z.B. nicht jeweils alle 4 um
>> 90° verschobenen Ausgänge zweier nebeneinander liegender DCMs
>> gleichzeitig auf die Clock Lanes aufschalten.
>
> Na gut, aber das will ich doch auch gar nicht. Schon klar, dass das nur
> ein Beispiel von Dir war. Aber soll das mit anderen Worten heißen, dass
> es nicht möglich ist, zwei verschiedene Taktfrequenzen zu erzeugen?!
> Bzw. nur mit den genannten Einschränkungen?

Doch, natürlich geht das. Sogar bis zu 8 Takte, die auf den schnellen 
Clock Lanes laufen können. Allerdings muss man sich dafür beim Entwurf 
der Außenbeschaltung schon im klaren drüber sein, dass es gewisse 
Einschränkungen hinsichtlich der Plazierung der CLK Eingänge gibt. Siehe 
oben.

> Ich bin bisher davon ausgegangen, das wäre eine Standard-Aufgabe und ein
> FPGA langweilt sich über sowas. Aber demnach würden ja alle Spartan 3 da
> draußen nur mit maximal 2 Takten betrieben werden (oder die
> Einschränkung in Kauf nehmen). Ist das denn wirklich so?! Warum gibt es
> denn dann überhaupt 4 DCM-Einheiten?

Wie gesagt, das geht schon, wenn du 4 CLK Eingänge an den 4 Seiten des 
Chips benutzt und insgesamt bei unter 8 Takten im FPGA bleibst. Bei 
niedrigeren Frequenzen und/oder geringeren Anforderungen an Skew und 
Jitter usw. geht´s natürlich auch über die normalen Routing-Ressourcen.

von berndl (Gast)


Lesenswert?

Hi,

oben in der ISE Fehlermeldung steht:
The IO component <CLK_ext> is placed at site <T10>.

Du schreibst aus deinem .ucf:
NET "CLK_ext" LOC = C9;

Da passt doch etwas nicht zusammen. Wieviele externe Eingangsclocks hast 
du denn nun? Und auf welchen Pins?

von Steffen Hausinger (Gast)


Lesenswert?

berndl schrieb:
> Da passt doch etwas nicht zusammen. Wieviele externe Eingangsclocks hast
> du denn nun? Und auf welchen Pins?

Nach ausgiebiger Lektüre vermute ich, dass genau hier mein Denkfehler 
liegt. Ich habe nämlich nur einen einzigen CLK-Eingang (den auf C9). 
Sehe ich es richtig, dass ich dessen Takt nur auf ein einziges DCM 
schalten kann? D.h. pro Takteingang kann ich zwei Takte nutzen - nämlich 
den Originaltakt und einen daraus per DCM abgeleiteten?

Denn so würde das alles einen Sinn machen...

von Michael S. (Firma: www.das-labor.org) (laborsauron)


Lesenswert?

>Sehe ich es richtig, dass ich dessen Takt nur auf ein einziges DCM
>schalten kann?

Ja

Der DCM hat noch einen Ausgang mit dem Namen IBUFG_OUT. Den nimmst du 
als quelle für den 2. DCM

Sauron

von Steffen Hausinger (Gast)


Lesenswert?

Aha, dann kann ich aus einem einzigen Takteingang also schon mehrere 
Taktfrequenzen ableiten. Das werde ich gleich einmal ausprobieren!

von Christian R. (supachris)


Lesenswert?

Den 2. DCM aber dann auf "Internal" Source stellen. Sonst klappts nicht.
Aber wo kommt dann die Fehlermeldung mit T10 als Input her?

von Steffen Hausinger (Gast)


Lesenswert?

Christian R. schrieb:
> Aber wo kommt dann die Fehlermeldung mit T10 als Input her?

Ich habe eine Vermutung: Gestern Abend habe ich in meiner Verzweiflung 
viele Einstellungen einmal durchgespielt. Dabei habe ich wohl auch die 
Kombination erwischt, in der beide DCMs als "Input" eingestellt sind. 
Demnach ist Ihnen gar kein Takteingang zugeordnet. Möglicherweise hat 
das irgendwie dazu geführt, dass "T10" ausgewählt wurde? Ich weiß es 
nicht.



Ich habe nun aber folgendes ausprobiert:

Externer Takt an erstes DCM:
1
  CLKGen_25MHz_unit : CLKGen_25MHz Port map(
2
      CLKIN_IN => CLK_ext,             -- IBUFG
3
      CLKFX_OUT => iCLK_25MHz,         -- BUFG
4
      CLKIN_IBUFG_OUT => CLK_ext_IBUF, -- Abzweigung aus dem IBUFG von CLKIN_IN
5
      CLK0_OUT => open,
6
      LOCKED_OUT => open );

Daran angeschlossen nun das zweite DCM:
1
  CLKGen_16MHz_unit : CLKGen_16MHz Port map(
2
      CLKIN_IN => CLK_ext_IBUF,        -- Siehe oben
3
      CLKFX_OUT => iCLK_16MHz,         -- BUFG
4
      CLK0_OUT => open,
5
      LOCKED_OUT => open );



Leider kommt immernoch obige Fehlermeldung (diesmal aber mit "Site C9"). 
Habe ich da irgendetwas falsch gemacht? Muss ich noch manuell einen 
"BUFG" im DCM-Wizard anlegen?

von Steffen Hausinger (Gast)


Lesenswert?

Ich habe meinen Aufbau von zwei DCMs mal probeweise auf eine DCM 
reduziert. In meinem Modell verwende ich also jetzt zwei Takte - den 
originalen Eingangstakt (50 MHz) und einen davon abgeleiteten (16MHz).

Die oben beschriebene Fehlermeldung taucht nun nicht mehr auf. Dafür 
werden meine Laufzeiten miserabel! Hier der Auszug:
1
+-------------------------------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+
2
|                               |   Period    |       Actual Period       |      Timing Errors        |      Paths Analyzed       |
3
|           Constraint          | Requirement |-------------+-------------|-------------+-------------|-------------+-------------|
4
|                               |             |   Direct    | Derivative  |   Direct    | Derivative  |   Direct    | Derivative  |
5
+-------------------------------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+
6
|TS_CLK_in                      |     20.000ns|     34.392ns|     82.736ns|           11|          556|      2943528|        42589|
7
| TS_CLKGen_16MHz_unit_CLKFX_BUF|     62.500ns|    258.550ns|          N/A|          556|            0|        42589|            0|
8
+-------------------------------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+

Wenn ich das Ganze mit nur einem Takt aufbaue, beispielsweise, indem ich 
nur den 16MHz-Takt aus dem DCM verwende, entspannt sich die Lage völlig:
1
+-------------------------------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+
2
|                               |   Period    |       Actual Period       |      Timing Errors        |      Paths Analyzed       |
3
|           Constraint          | Requirement |-------------+-------------|-------------+-------------|-------------+-------------|
4
|                               |             |   Direct    | Derivative  |   Direct    | Derivative  |   Direct    | Derivative  |
5
+-------------------------------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+
6
|TS_CLK_in                      |     20.000ns|      7.500ns|      6.405ns|            0|            0|            0|      3076989|
7
| TS_CLKGen_16MHz_unit_CLKFX_BUF|     62.500ns|     20.016ns|          N/A|            0|            0|      3076989|            0|
8
+-------------------------------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+



Was ist hier nur los? Was bereitet ihm solche Probleme, einen zweiten 
Takt zu routen? Wo kommen diese langen Laufzeiten her?

Wie macht ihr das in Euren Projekten, verwendet ihr da keine 
abgeleiteten Takte? Gibt es irgendwelche Kniffs oder Tricks, die ich 
beachten muss?

Steffen

von Sebastian (Gast)


Lesenswert?

Es kann sein das Du den Clock Buffer beim DCM vergessen hast. Wenn ich 
das noch richtig in Erinnerung habe muss man eine BUFG verwenden.

von Steffen Hausinger (Gast)


Lesenswert?

Bei meinem letzten Design mit nur einem DCM war ein IBUF am Eingang und 
ein BUFG am CLKFX. Ist es das, was Du meintest?

Kann man da noch mehr falsch machen?

von Weltbester FPGA Pongo (Gast)


Lesenswert?

war das nicht so, daß Xilinx bei DCMs die BUFGs automatisch plaziert?

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.