Forum: FPGA, VHDL & Co. Clock Domain Crossing - Timing Constraints - set-false-path


von Sören B. (al_bundy)


Lesenswert?

Hallo Zusammen,

ich habe große std_logic_vectoren die periodisch ms-Bereich von einer 
300 MHz-Clk an eine 25 MHz-Clk-Domain übergeben werden sollen. 
Realisiert habe ich das über einen Handshake von Control-Signalen, die 
mit ASYNC-Attribut versehen in die jeweils andere Domain eingetaktet 
werden. Die großen Datenvektoren werden nach dem Handshake einfach von 
der langsamen Domain verwendet/verarbeitet. ISE beschwert sich nun über 
ein nichteinhalten der Timing Constraints der Datenvektoren. Daher 
wollte ich nun in die UCF-File den "set-false-path"-Parameter für die 
langen Vektoren setzten. Leider will es mir einfach nicht gelingen. Ich 
scheine sowohl Fehler im Syntax als auch in der richtigen Bezeichnung 
der Signale/Signalpfade zu machen. Was mir Google ausspuckt hat mir 
leider nicht weitergeholfen.

Die beiden Clks werden aus einem externen 25 MHz-Quarz mittels PLL 
erzeugt.
Ich benutze die ISE IDE, der Code ist in VHDL geschrieben und der FPGA 
ist ein SPARTAN 6.

Kann mir jemand sagen wie der genaue Syntax lautet und wie ich aus dem 
Constraints-Report die richtigen Signalnamen ablese? Oder mache ich hier 
gar was komplett falsch?

Vielen Dank schon mal.

von rossi (Gast)


Lesenswert?

NET "ModuleInst/DataSignal[0]" TIG;

im ucf sollte dafür sorgen, dass für DataSignal kein Timing geprüft 
wird.
Falls Signale bei der Synthese automatisch umbenannt, kannst Du ein KEEP 
Attribut setzen.

In den Synthese-Optionen von ISE lässt sich einstellen, ob die 
Hierarchie der Module geplättet wird. Das hat auch Einfluss auf die 
Signalnamen.

Wenn die das Timing Ignore für ganze Clock Domains setzten willst, schau 
mal hier
https://forums.xilinx.com/t5/Spartan-Family-FPGAs-Archived/how-to-set-false-paths-between-different-clock-domains-which-are/td-p/387715

von Sören B. (al_bundy)


Angehängte Dateien:

Lesenswert?

Hallo Rossi,

mit TIG hat es leider uach nicht funktioniert. ISE wirft folgende 
Fehlermeldung:

------
ERROR:ConstraintSystem:59 - Constraint <NET
   "f_read_md/ch_count_ch2/CLOCKCOUNT_0_SAVE" TIG;> [ONE4ALL.ucf(10)]: 
NET
   "f_read_md/ch_count_ch2/CLOCKCOUNT_0_SAVE" not found.  Please verify 
that:
   1. The specified design element actually exists in the original 
design.
   2. The specified object is spelled correctly in the constraint source 
file.
-----

Die zugehörige Timing Analyse habe ich mal als Bild angefügt. Ich habe 
folgende Varianten versucht:

NET "f_read_md/ch_count_ch2/CLOCKCOUNT_0_SAVE" TIG;

NET "f_read_md/ch_count_ch2/CLOCKCOUNT_0_SAVE_4" TIG;

Hat leider beides nicht funktioniert. Die ganze Clockdomain wollte ich 
nicht aus der Analyse ausschließen. Die Control-Signale sollen ja 
weiterhin geprüft werden.

von Duke Scarring (Gast)


Lesenswert?

Sören B. schrieb:
> ISE wirft folgende Fehlermeldung:
> ------
> ERROR:ConstraintSystem:59 - Constraint <NET
>    "f_read_md/ch_count_ch2/CLOCKCOUNT_0_SAVE" TIG;> [ONE4ALL.ucf(10)]:

Probier mal aus, ob es mit einem zusätzlichen Sternchen geht:
1
NET "f_read_md/ch_count_ch2/CLOCKCOUNT_0_SAVE*" TIG;

Duke

von Weltbester FPGA-Pongo (Gast)


Lesenswert?

ISE optimiert gerne die Signalnamen. Es ist gut möglich, dass er das zu 
ignorierende SIG nicht mehr findet. Dazu einfach ein keep / donttouch 
auf das Signal setzen. Ein TIG würde ich an der Stelle nicht setzen. 
Besser ein MAXPATHDELAY. Nicht, dass die Daten das handshake Signal 
überholen.

von Sören B. (al_bundy)


Lesenswert?

Hallo Zusammen,

mit dem Sternchen hat es nun geklappt. Ich wollte anschließend zur 
Sicherheit das keep attribut setzen, da ist mir aber aufgefallen, das 
die Signale Teil des Ports der Component sind. Ich glaube, da kann man 
kein keep setzen. Auf jeden Fall werden die Signale nun im Timing report 
ignoriert. Also an dieser Stelle schon mal vielen Dank für die Hilfe.

Ist es denn möglich den konkret bemängelten Signalpfad zu ignorieren? So 
dass nur der Übergang zwischen den Clock-Domains nicht geprüft wird? Das 
war eigentlich mein Ziel mit "set-false-path". Oder gibt es das nur in 
Vivado? Ich habe mit dem neuen Wissensstand probiert folgende Zeile zu 
integrieren:


set_false_path -from [get_port 
f_read_md/ch_count_ch2/CLOCKCOUNT_0_SAVE*] -to [get_pin 
f_read_md/CLOCKCOUNT_1_OUT*];

Da kam dieser Fehler:

-----
ERROR:ConstraintSystem:300 - In file: ONE4ALL.ucf(11): Syntax error. 
Ensure
   that the previous constraint specification was terminated with ';'.

-----

Die Lösung mit maxpathdelay hört sich gut an. Einen derartigen Befehl 
konnte ich leider nicht finden. Ich habe was ähnliches gefunden. Das sah 
dann bei mir so aus:

set_max_delay -from [get_cells 
f_read_md/ch_count_ch2/CLOCKCOUNT_0_SAVE[*]] -to [get_cells 
f_read_md/CLOCKCOUNT_1_OUT[*]] -datapath_only 75.0;

Da kam dann die gleiche Fehlermeldung.

Was mache ich falsch?

von Weltbester FPGA-Pongo (Gast)


Lesenswert?

Sören B. schrieb:
> that the previous constraint specification was terminated with ';'.

Da fehlt wohl das Semi - d.h eine Zeile ist nicht vollständig.Eventuell 
auch schon mal ein line end code , der falsch gelesen wird. 
Zeilenwechsel gemacht? Welcher Editor? Welcher EOL eingestellt?

von Sören B. (al_bundy)


Lesenswert?

Weltbester FPGA-Pongo schrieb im Beitrag #6807890:
> Sören B. schrieb:
>> that the previous constraint specification was terminated with ';'.
>
> Da fehlt wohl das Semi - d.h eine Zeile ist nicht vollständig.Eventuell
> auch schon mal ein line end code , der falsch gelesen wird.
> Zeilenwechsel gemacht? Welcher Editor? Welcher EOL eingestellt?

Sobald die oben aufgeführte Zeile mit einer Raute auskommentiert wird, 
läßt sich die UCF-file problemlos synthetisieren. Das zeigt das die 
Kommandos ";" und "EndofLine" vom Editor funktionieren (Notepad++, 
Kodierung ANSI). Sonnst würde er ja auch bei den anderen damit 
erstellten Semikolons meckern. Da ich die Zeile über Copy&Paste 
eingefügt habe, habe ich der Sicherheit halber das Semikolon und den 
Zeilenwechsel der kopierten Zeile gelöscht, neu gesetzt und nochmal 
versucht zu synthetisieren. Es kommt weiterhin die gleiche 
Fehlermeldung.

von Steffen H. (avrsteffen)


Lesenswert?

Fehlt da nicht die letzte geschossene eckige Klammer? "]"

von Sören B. (al_bundy)


Lesenswert?

Steffen H. schrieb:
> Fehlt da nicht die letzte geschossene eckige Klammer? "]"

Hab mehrfach drübergeschaut. Ich sehe keine fehlenden Klammern. Um das 
jeweilige Sternchen wird geöffnet und geschlossen [*] und die Befehle 
-from und -to haben jeweils auch [get cells....].

von Steffen H. (avrsteffen)


Lesenswert?

Ja sorry, stimmt. Hab mich verwirren lassen von den schrägen Klammern. 
Und ein "* " sehe ich garnicht. Aber ich denke mal genau deswegen sehe 
ich manche Schrift als kursive.

: Bearbeitet durch User
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.