Forum: FPGA, VHDL & Co. Fragen zu Multi-Cycle Contraints


von mh (Gast)


Lesenswert?

Hallo,

ich benötige in meinem System einen langsameren Takt als das Clocksignal 
und hab das mit Clock-Enable gelöst.
Es funktioniert soweit alles (in Simulation und auf dem FPGA), nur 
erhalte ich wie erwartet unzählige Timing-Fehler.
In meinem UCF-File steht als Takt:
1
NET "clk" LOC = AA12 | IOSTANDARD = LVCMOS33 | TNM_NET = "tnm_clk";
2
TIMESPEC "TS_clk" = PERIOD "tnm_clk" 10 ns HIGH 50%;
Nun muss ich ja der Synthese sagen, dass der CE nur alle 10 Takte kommt. 
Das löst man ja mit einem Multi-Cycle Constraint.

Ich hab zwar schon einiges an White-Papers dahingehend durchgelesen, 
aber sonderlich schlau werd ich trotzdem nicht draus (hab noch nicht 
sonderlich viel Erfahrung mit Timing-Constraints).
Kann mir jemand hierzu ein (verständliches) Beispiel empfehlen oder mir 
zeigen, wie ich am Besten mein UCF-File ergänze?

Schonmal Vielen Dank!

von J. S. (engineer) Benutzerseite


Lesenswert?

Das kann man vom Constraint-Wizzard aus tun, siehe "Exceptions". Ich bin 
aber nicht so sicher, ob das der richtige Ansatz ist. Wenn da ein enable 
kommt, muss das sofort verarbeitet werden und nicht erst Takte später, 
oder?

Ein einziges Signal kann ohnehin kein Problem sein, welches ein MCC 
benötigt. Das müsste zeitlich passen.

Ein MMC benutzt man u.a. für parallele Architekuren von Mulitiplieren 
oder ganzen Schaltungen, die man zeitlich verschachtelt hat.

von mh (Gast)


Lesenswert?

Hallo Jürgen,
also wenn Clock-Enable Eins ist und eine positive Flanke von clk kommt, 
dann werden neue Daten in FFs geladen und die nachfolgende Kombinatorik 
rechnet.

Es gibt einen Reiter: Create Timing Constraints
Nur will das irgendwie nicht öffnen, hab ja schon ein UCF-File, dann 
gehts glaub ich nicht mehr.

Ich hab folgende Zeile im UCF hinzugefügt:
1
TIMESPEC "TS_ce" = FROM FFS TO FFS 100 ns;
Innerhalb meines Top-Level-Moduls gibt es das Signal clk_enable.
Wie sag ich nun, dass clk_enable (was ja modulintern ist), zu TS_ce 
gehört?

von J. S. (engineer) Benutzerseite


Lesenswert?

Doch, das geht. Es muss ja erst ein UCF angelegt werden, sonst fragt er 
Dich ja danach.

Man muss das Toplevel anklicken und dann bei "User Constraints" auf 
"Create Timing Constraints" klicken. Dann kommt der Wizzard.

Bei "Exceptions" "Path" muss jeweils eine Gruppe mit den FFs gebildet 
werden, die entspannt werden sollen. "From" Group .. "Create Group".

Aber wie gesagt, ich bin nicht sicher, ob das das richtige für Deine 
Schaltung ist.

von mh (Gast)


Lesenswert?

Ok, jetzt gings,
ich musste erst bis zu Translate laufen lassen, bis das Fenster aufging.

Es wurde folgendes Constraint hinzugefügt (fast dasselbe wie oben):
1
TIMESPEC "TS_ce" = FROM "FFS" TO "FFS" 100 ns DATAPATHONLY;

Ich frag mich allerdings auch, ob das der richtige Weg ist dies zu 
lösen.
So wie ichs im Moment verstehe, giltet das nun für alle FFS im 
kompletten Design oder?
Es gibt aber auch einige FFS, die mit 100 MHz betrieben werden und 
andere (das sind dann ganze Module) die mit 10 MHz betrieben werden.

von Sigi (Gast)


Lesenswert?

Such mal nach folgenden PDFs:

"understanding timing and placement constraints"
(Folien, viele Diagramme, evtl. schwer zu finden:( )

"Timing Closure User Guide"
(alles über Timing Constraints und deren Analyse)

Zu MultiCycle-Contraints: Zuserst müssen zwei Gruppen
definiert werden, Quelle und Ziel (beide können auch
identisch sein). Dann wird per "From-To"-Constraint
die MC-Ausnahme definiert.

Zu den Gruppen gehöhrt auf keinen Fall das ClockEnable-Signal,
denn das wird ja NICHT im MC-Bereich beschrieben, sondern
im "normalen" Clock-Bereich. Die Gruppendefinition kann
zusätzlich per FFS/RAM/etc. verfeinert werden.

Dein Constraint (..FROM "FFS" TO "FFS"..) ist definitiv
falsch, denn damit schliesst du ja auch das ClockEnable
mit ein. Kann zwar rain zufällig funktionieren, bei
Fehlern gibt's aber bei der Synthese keine Meldung.

Das alles wird ausführlichst im 2. PDF beschrieben.

von mh (Gast)


Lesenswert?

Danke für die PDFs.
Wie würde man mein Problem dann am Besten lösen?

von Sigi (Gast)


Lesenswert?

Eigentlich genau so, wie Du es Oben schon beschrieben
hast: Eine Komponente/Prozess generiert z.B.per Zähler
das ClockEnable-Signal, womit die Ziel-FFs angesteuert
werden. Dann noch die Quell- und Ziel-FFs zu Gruppen
zusammenfassen und das Constraint definieren. Das ist
der ganze Zauber.

von mh (Gast)


Lesenswert?

Wo muss ich die Gruppe genau definieren?
Im UCF-File? Oder in der vhd-Datei?
Wie weiß ich welche FFs ich da gruppieren soll?

Sorry für die blöden Fragen...

von Sigi (Gast)


Lesenswert?

Im HDL-File beschreibst Du Deine Schaltung
(mit allen FFs), im UCF-File werden dann
diese FFs zusammengefasst, z.B.

INST MyComponent/* TNM=MC_GRP;

und z.B. per

TIMESPEC TS_MC = FROM MC_GRP TO MC_GRP 10*TS_CLK;

constrained.

Du musst dabei immer auf den Instanzen-Pfad
achten, der muss beim Gruppieren mit angegeben
werden. Joker-Zeichen wie * sind dabei hilfreich.

von mh (Gast)


Lesenswert?

Danke Sigi!
Das probier ich dann mal.
Mit Instanz kann ich ja direkt Elemente des FPGAs nehmen.
Kann hier auch eine Komponente, also wie sie mit port map im meinem 
Top-Modul eingebunden wird bzw. eines Prozesses, nehmen?

Hab das erste von den PDFs (Präsentation) gefunden:
http://www.slidefinder.net/c/constraints_understanding_timing_placement_constraints/topicosi_iv_timing/30507153/p2
Ich habs nun so probiert wie auf Folie 36 gezeigt:
1
NET "clk_enable" TNM = "TNM_ce";
2
TIMESPEC "TS_ce" = FROM "TNM_ce" TO "TNM_ce" 100 ns;
Hab die Entity von meinem Top-Modul angepasst:
1
Port (
2
     ...
3
     clk_enable  : inout STD_LOGIC := '0';
4
     ...
Ich erhalte beim Mappen folgende Warnung:
WARNING:Timing:3223 - Timing constraint TS_ce = MAXDELAY FROM TIMEGRP 
"TNM_ce"
   TO TIMEGRP "TNM_ce" 100 ns ignored during timing analysis.
und auch eine Timing-Fehler Warnung.
Also so einfach gehts dann wohl leider nicht...

von mh (Gast)


Lesenswert?

Hab nun das mit den Instanzen probiert und es läuft ohne 
Timing-Warnings!
Nochmal Vielen Dank!

von Sigi (Gast)


Lesenswert?

Schau mal auf folgende Seite:
http://www.xilinx.com/support/answers/29290.html

Im ggs zu mir definierst Du die Gruppe per
NET (ich: per INST), was aber egal ist
(liess Dir dazu das "Xilinx Constraint Guide"
durch, das beschreibt alle Constraints und
Gruppierungen).

Ich vermute mal, Dein Problem ist, dass zwar
"clk_enable" als Port existiert, nicht aber
namentlich in der Netzliste (die "Leitung"
existiert natürlich schon!). Deine Gruppe
ist also leer.

Geh mal in den FPGA-Editor bzw. Floorplanner und
such nach dem Signal, dort findest Du auch den
vollständigen Namen (inkl Pfad).

Oder noch besser: setz einfach mal ein kleines
Demo-Projekt auf, dass nur eine Hauptkomponente
besitzt. Da hast Du dann keine Pfade und damit
keine Probleme beim Auffinden von Signalen
bzw. FFs/etc.

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.