Forum: FPGA, VHDL & Co. Seltsames Verhalten im Design


von Cihan K. (lazoboy61)


Lesenswert?

Hallo erstmal,

ich habe mal bezüglich Erfahrungen mal ne Frage zu meinem Design.

Ganz kurz gefasst habe ich folgendes Problem:
Bin zur Zeit in der Entwicklungs- und Testphase meines Design, baue 
daher ab und zu Änderungen im Code ein. Dementsprechend implementiere 
ich mein Design von neu und lade es mit impact auf mein FPGA.

Nun stelle ich manchmal fest, dass das Design manchmal nicht richtig 
läuft, dass Funktionen die vorher alle liefen, jetzt teilweise nicht 
mehr laufen, obwohl die Änderung im Code, mit diesen Funktionsteilen 
nicht mal zusammenhängen (mit Funktionen bzw. Funktionsteilen meine ich 
sowas wie Kommunikation[Uart], FFT, Fifos).

Habe folgende Sachen im Design als Sicherheit eingebaut:
Aktuell habe ich 2 Clockdomains in meinem Design, die ich mittels eines 
externen 100MHz taktes über eine DCM mir erzeuge. Im Design werden dann 
100MHz(Systemtakt) und 59,...MHz (für Kommunikationseinheit) benutzt. 
Das LOCKED Signal der DCM verwende ich für die Clocks als Enable, quasi 
zwei BUFGCE habe ich dafür verwendet. Dadurch habe ich sichergestellt, 
dass die beiden Clock mit der pos. Flanke zum gleichen Zeitpunkt starten 
(habe es am Oszilloskopen mir auch dargestellt und verifiziert). Der 
Startup_Wait der DCM ist auch auf TRUE und die einstellungen unter 
Impact(Startup Options) habe ich eingestellt wie folgt: Done_cycle = 4, 
GTS_cycle = 1, GWE_cycle = 1 und LCK_cycle = 2.
Weiterhin habe ich alle internen Signale auch initialisiert. Alle 
externen Signale (sind wenige) werden auch mit mind. 2 FFs 
einsynchronisiert. Bei den Taktdomains 100MHz und 59,...MHz erfolgt der 
Datenaustausch ausschließlich über Fifos. Auch evtl. Flags in diesen 
Taktdomains werden einsynchronisiert und dann verwendet.

Als Timing-Constraints habe ich nur die 100MHz angegeben. Ich wollte 
erstmal vermeiden Programmteile aus meinem Code zu posten, da es mir 
erstmal um das allgemeine Design geht, quasi um Techniken wie 
synchronisationen usw. Falls gewünscht kann ich evtl. Programmteile 
posten.

Was ich jetzt nicht verstehe ist, dass mein Design ab und zu, aber auch 
öfters nach einer Neuimplimentierung (natürlich mit Änderung im Code) 
nicht mehr richtig läuft. Wenn es mal richtig läuft, quasi alle 
Funktionen wie erwartet laufen, dann gibt es auch keine Probleme wenn 
ich z.B. die Bit-File neu rauflade. Worauf ich mich beziehen will ist, 
dass ich versucht habe mein Design immer stets synchron zu entwickeln 
und auch Sachen wie Startup verhalten habe ich schon berücksichtigt. 
Doch warum funktioniert es ab und zu nach einer Neuimplimentierung 
nicht? Woran kann so was denn liegen? Bräuchte hier mal Erfahrungen von 
euch, ob ihr auch schon mal mit solchen Problemen rumhantieren müsstest.

Vielleicht noch Erwähnenswert, dass Design ist zur Zeit aktuell ca. 25% 
Slice Luts und 22% Slice Registern belegt.

Freu mich schon auf Anregungen.
Danke

Gruß
Cihan

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


Lesenswert?

Cihan Kalayci schrieb:
> Nun stelle ich manchmal fest, dass das Design nicht richtig läuft, dass
> Funktionen die vorher alle liefen, jetzt teilweise nicht mehr laufen,
> obwohl die Änderung im Code, mit diesen Funktionsteilen nicht mal
> zusammenhängen (mit Funktionen bzw. Funktionsteilen meine ich sowas wie
> Kommunikation[Uart], FFT, Fifos).
Wie schnell stellst du das fest? Wie oft passieren Fehler? Wie ässern 
sich solche Fehler?

> Als Timing-Constraints habe ich nur die 100MHz angegeben.
Mehr brauchst du auch nicht, denn die 60MHz sind ja daraus abgeleitet...

von Cihan K. (lazoboy61)


Lesenswert?

Lothar Miller schrieb:
> Cihan Kalayci schrieb:
>> Nun stelle ich manchmal fest, dass das Design nicht richtig läuft, dass
>> Funktionen die vorher alle liefen, jetzt teilweise nicht mehr laufen,
>> obwohl die Änderung im Code, mit diesen Funktionsteilen nicht mal
>> zusammenhängen (mit Funktionen bzw. Funktionsteilen meine ich sowas wie
>> Kommunikation[Uart], FFT, Fifos).
> Wie schnell stellst du das fest? Wie oft passieren Fehler? Wie ässern
> sich solche Fehler?

Anhand meiner Daten, die ich zum FPGA per UART schicke sehe ich sehr 
schnell, ob es Kommunkationsprobleme gibt(sehr selten gewesen), ob ebend 
die Daten auch an den richigen Stellen im Design in die dazugehörigen 
Fifos und Brams hineingelangen, ob Bspw. die FFT richtig gelaufen ist 
usw. Da ich mir immer meine Daten vor der FFT, nach der FFT und nach der 
Verabeitung der FFT-Output Werte sofort sehe (sende die Daten per 
Uart-Schnittstellen raus und empfange sie über Hterm), kann ich sie 
anhand von Referenzdaten die ich mir per Software am PC erstellt habe 
vergleichen. Dann sehe ich sofort ob mein Design grad richtig läuft oder 
nicht.

Cihan

von Cihan K. (lazoboy61)


Lesenswert?

Manchmal habe ich allerdings auch den Fall, dass jetzt nicht die Daten 
Fehlerhaft sind, sondern beispielsweise läuft die FFT(übrigens mit dem 
Xilinx Core Generator erstellt) aus irgendeinem Grund nicht oder die FFT 
läuft, aber die Ausgangsdaten werden nicht verarbeitet. Der Fehler liegt 
also nicht immer in den Daten.

Cihan

von Bronco (Gast)


Lesenswert?

Ich hatte mal ein ähnliches Problem, als ich Gigabit-Ethernet 
implementiert hab.

Die Ursache war, daß ich keine Timing-Constraints für Signale zum PHY 
definiert hatte. Den Takt zwar sehr wohl, aber eben nicht die 
Setup/Hold-Zeiten der einzelnen Datensignale.
Das hat dann ein sehr willkürliches "mal gehts, mal nicht"-Verhalten 
erzeugt.

Seit ich die Timing Constraints drinn hatte, geht's immer.

Auch interessant: Alternativ hätte laut Aussage eines Kollegen auch 
geholfen, die I/O-Register in die IOBs zu erzwingen ("Pack I/O 
Registers/Latches into IOBs").

von Cihan K. (lazoboy61)


Lesenswert?

Bronco schrieb:
> Auch interessant: Alternativ hätte laut Aussage eines Kollegen auch
> geholfen, die I/O-Register in die IOBs zu erzwingen ("Pack I/O
> Registers/Latches into IOBs").

Das Attribute war bei mir auf Auto, habe es mal jetzt auf Yes gesetzt. 
Werde es mir mal anschauen.

Bronco schrieb:
> Die Ursache war, daß ich keine Timing-Constraints für Signale zum PHY
> definiert hatte. Den Takt zwar sehr wohl, aber eben nicht die
> Setup/Hold-Zeiten der einzelnen Datensignale.
> Das hat dann ein sehr willkürliches "mal gehts, mal nicht"-Verhalten
> erzeugt.
>
> Seit ich die Timing Constraints drinn hatte, geht's immer.

An Timing-Constraints habe ich auch gedacht, aber wie war für mich immer 
die Frage. Ich lese ja die Daten über eine UART Schnittstelle ein und 
aus, quasi habe ich mehrere Tx und Rx. Das komische ist ja manchmal, 
dass die Daten auch richtig ankommen ins FPGA, aber intern kommst es zu 
Fehlern, die ich mir nicht erklären kann. Hast du auch interne Signale 
mit Constraints versehen?

Cihan

von Cihan K. (lazoboy61)


Angehängte Dateien:

Lesenswert?

Hier mal eine grobe Struktur, wie ich die Daten ein- und auslese.

Habe ich gerade gemacht, natürlich ohne Details, also nur ganz grob, 
damit man sich vorstellen kann wie das Design grob aufgebaut ist.

Cihan

von Cihan K. (lazoboy61)


Lesenswert?

Cihan Kalayci schrieb:
> Bronco schrieb:
>> Auch interessant: Alternativ hätte laut Aussage eines Kollegen auch
>> geholfen, die I/O-Register in die IOBs zu erzwingen ("Pack I/O
>> Registers/Latches into IOBs").
>
> Das Attribute war bei mir auf Auto, habe es mal jetzt auf Yes gesetzt.
> Werde es mir mal anschauen.

Ich hatte aktuell grad im Design Probleme. Dann habe ich einfach mal das 
Erzwingen des IOBs auf Yes gesetzt. Das Ergebnis bis jetzt ist erstmal 
positiv. Werde es natürlich weiter untersuchen, aber es hat schon was 
gebracht, Danke hier an Bronco.

Die andere Seite ist aber, dass ich jetzt viele Warnungen bekommen habe, 
zurecht denke ich auch, hier mal einer von vielen:
WARNING:Pack:2780 - The register "u_RS_422_SH/u_RXFLAG/i_serial_in_FDE" 
has the property IOB=TRUE, but it did not join an IO component because 
it is not
connected to any IO element.

Auf welche Signale sollten denn die IOBs erzwungen werden? Meines 
Wissens nach nur an Eingängen? :-S kann mich auch gewaltig irren. Kann 
da jemand eine klare Aussage machen?

Wenn es wirklich an den IOBs lag, dass das Design manchmal lief und 
manchmal nicht, dann hat doch das Attribute unter den Synthese Optionen 
IOB = AUTO versagt. Kann man das daraus schliessen. Müsste ich evtl. 
durch Attribute im Design selber für die IOBs sorgen? Ich dachte immer, 
dass bspsw. die Eingangspins die mit 2 FFs synchronisiert werden, immer 
automatisch IOBs erzwingen werden. hmmm

Cihan

von Cihan K. (lazoboy61)


Lesenswert?

Cihan Kalayci schrieb:
> Ich hatte aktuell grad im Design Probleme. Dann habe ich einfach mal das
> Erzwingen des IOBs auf Yes gesetzt. Das Ergebnis bis jetzt ist erstmal
> positiv. Werde es natürlich weiter untersuchen, aber es hat schon was
> gebracht, Danke hier an Bronco.

Zu früh gefreut, habe doch noch Fehler drin. Seltsam.

von Schlumpf (Gast)


Lesenswert?

Ich hatte mal ein nicht nachvollziehbares Verhalten von Synthese zu 
Synthese. Ähnlich, wie bei dir.
Am Ende lag es an einer unvollständigen Sensitivity-Liste.

Skurrilerweise war in dem Prozess ein Counter in der Sensitivity-Liste, 
der mit jedem Takt inkrementiert wurde und somit eigentlich auch den 
Prozess mit jedem Takt angestoßen hat und trotzdem führte ein Eingang, 
der nicht in der Liste war, zu diesem Verhalten.
Ist mir bis heute schleierhaft, wieso. Aber Liste vervollständigt und 
Problem war weg.

von Klaus (Gast)


Lesenswert?

Schlumpf schrieb:
> Aber Liste vervollständigt und
> Problem war weg.

Das war wohl zufall, dass das Problem gleichzeitig verschwand.

von Schlumpf (Gast)


Lesenswert?

Klaus schrieb:
> Das war wohl zufall, dass das Problem gleichzeitig verschwand.

Keine Ahnung, ob es das war oder nicht.. jedenfalls war davor trotz 
diverser Änderungen im Design das Problem immer da. Also die Synthese 
hatte genug "Chancen", es auch mal anders zu machen. Und nach 
vervollständigen der Sensitivity-List kam das Problem nie wieder.. auch 
nach vielen weiteren Änderungen am Design.

Ich find´s selber eigenartig....

von Klaus (Gast)


Lesenswert?

Schlumpf schrieb:
> Keine Ahnung, ob es das war oder nicht.. jedenfalls war davor trotz
> diverser Änderungen im Design das Problem immer da. Also die Synthese
> hatte genug "Chancen", es auch mal anders zu machen. Und nach
> vervollständigen der Sensitivity-List kam das Problem nie wieder.. auch
> nach vielen weiteren Änderungen am Design.
>
> Ich find´s selber eigenartig....

Welche Systhesetootl hast du denn verwendet (Version, Hersteller)? Wäre 
echt ne Kuriosität, wenn das tatsächlich die Ursache war :)

von Schlumpf (Gast)


Lesenswert?

Klaus schrieb:
> Welche Systhesetootl hast du denn verwendet (Version, Hersteller)? Wäre
> echt ne Kuriosität, wenn das tatsächlich die Ursache war :)

Boahh jetzt fragst mich was.. ist schon ein paar Jährchen her. Es war 
synplify, aber frag mich bitte nicht, welche Version..

Na ja, dem TO wird das vermutlich auch nicht weiterhelfen ;-)

Beim ihm hört sich das eher nach sowas wie
"unconstrained path" oder Problem an den Domaingrenzen durch 
inkonsistente Daten an.

von Cihan K. (lazoboy61)


Lesenswert?

Hat sich ja übers Wochende hier einiges getan :-)
Danke erstmal für die vielen Antworten.

Schlumpf schrieb:
> Am Ende lag es an einer unvollständigen Sensitivity-Liste.

Immer wieder lese ich, dass die Sensitivity-List mehr für die Simulation 
seinen Zweck hat, als für die Implementierung des Designs. Aber 
abgesehen davon gestalte ich meine Prozesse ausschließlich immer so:
1
PROCESS(CLK)
2
BEGIN
3
-- hier mach ich generell überhaupt nix, sonst müsste es ja in die Sensitivity-List
4
IF CLK = '1'  AND CLK'EVENT THEN
5
   ... -- hier werden alle logischen Zuweisungen und logische Funktionen beschrieben
6
   i_SIG <= R_SIG;
7
END IF;
8
-- hier mach ich generell überhaupt nix, sonst müsste es ja in die Sensitivity-List
9
END PROCESS;
10
11
SIG <= i_SIG; -- Signal Entity List

Das was ich generell mache ist, dass ich mit Signalen innerhalb eines 
Prozesses arbeite und dann wenn ich das Signal nun zu einem anderen 
Prozess außerhalb meiner .vhd file übertragen will, weise ich es an das 
Signal der Entity List zu. Und wenn es am anderen Ende wieder in einem 
Prozess mit gleichem Takt gebraucht wird, benutze ich es einfach zur 
Abfrage oder Zuweisung.

Also wenn ich es kurz zusammenfassen darf, sind alle meine Prozesse mit 
CLK in der Sensitivity-List gefüllt und sollten auch vollständig sein, 
da alle Funktionen und Zuweisungen innerhalb von
1
IF CLK = '1'  AND CLK'EVENT THEN
2
   ...
3
END IF;
passieren.

Was ich noch zu Prozessen mal fragen will. Ist es besser viele 
Funktionen und Zuweisungen innerhalb eines Prozesses zu beschreiben oder 
sollte man viele kleinere Funktionen innerhalb mehrerer Prozesse 
beschreiben. Eignetlich sollte das doch auch keinen Unterschied machen? 
oder?

Schlumpf schrieb:
> Beim ihm hört sich das eher nach sowas wie
> "unconstrained path" oder Problem an den Domaingrenzen durch
> inkonsistente Daten an.

Das hört sich für mich logisch an, könnte sein das es sowas auch ist. 
Denn es kommt mir manchmal vor, dass Daten falsch oder Parameter die ich 
einstellen kann falsch aufgenommen werden oder garnicht erst zum Ziel 
gelangen! Wie kann ich unconstrained path prüfen? Warum kommt es 
überhaupt zu so etwas?

Danke nochmals
Cihan

von Cihan K. (lazoboy61)


Lesenswert?

Habe neue Erkenntnisse mit dem "unconstrained path".

Erstens kann man sich die anzeigen lassen, wenn man sie mit der option 
-u limitiert unter Implement Design -> Properties -> Post-Place & Route 
Static Timing Report Properties. Hatte z.B. 10000 rein geschrieben.

Im Anschluss daran sah ich im nächsten Durchlauf, das automatisch OFFSET 
IN / OUT constraints gesetzt wurden, die vermutlich nicht passten. Habe 
ich im Report-File twr gesehen.

Die Lösung war dann, sie selber in der ucf zu setzen. Habe folgendes 
eingefügt:
OFFSET = IN 10 ns VALID 9.5 ns BEFORE "CLKIN" RISING;
OFFSET = OUT 9 ns AFTER "CLKIN";

Nun läuft das Design ohne Fehler, habs mehrmals getestet, bis jetzt ist 
mir nichts aufgefallen. Werde natürlich noch ein Dauertest und einen 
Test in einer Thermalkammer machen, um das System auch unter "schweren" 
Bedingungen zu testen.

Jetzt tretet für mich die Frage auf, was ich mit den Constraints OFFSET 
bewirkt habe, was das Tool von Xilinx selber nicht geschafft hat? Welche 
Erkenntnis kann man hier als Abschluss geben.

Weiterhin würde die Antwort auf folgende Frage mich auch noch 
interressieren:

Cihan Kalayci schrieb:
> Was ich noch zu Prozessen mal fragen will. Ist es besser viele
> Funktionen und Zuweisungen innerhalb eines Prozesses zu beschreiben oder
> sollte man viele kleinere Funktionen innerhalb mehrerer Prozesse
> beschreiben. Eignetlich sollte das doch auch keinen Unterschied machen?
> oder?

Danke
Cihan

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


Lesenswert?

Cihan Kalayci schrieb:
> Immer wieder lese ich, dass die Sensitivity-List mehr für die Simulation
> seinen Zweck hat, als für die Implementierung des Designs.
Ersetze "mehr" duch "ausschließlich". Dann passts. Die Synthese 
erweitert die Sensitivliste selber und weißt dich dann mit eine Info 
darauf hin, dass die Simulation nicht zur Hardware passen wird...

> Was ich noch zu Prozessen mal fragen will. Ist es besser viele
> Funktionen und Zuweisungen innerhalb eines Prozesses zu beschreiben oder
> sollte man viele kleinere Funktionen innerhalb mehrerer Prozesse
> beschreiben. Eignetlich sollte das doch auch keinen Unterschied machen?
Der Synthesizer muss deine Idee aus dem VHDL-Code heruaslesen und 
interpretieren können. Das kann schon bei kleinen Änderungen 
signifikante Auswirkungen haben. Dort fügt der Synthesizer wegen einer 
anderen Reihenfolge im Quelltext zwei zusätzliche Inverter ein:
http://www.lothar-miller.de/s9y/archives/52-Kompakte-Flankenerkennung.html
(lies unten: "Als kleiner Gimmick").

Ich selber schreibe gern recht viel in 1 getakteten Prozess, und die 
Kombinatorik soweit möglich als Concurrent Statements.

von Schlumpf (Gast)


Lesenswert?

Cihan Kalayci schrieb:
> Jetzt tretet für mich die Frage auf, was ich mit den Constraints OFFSET
> bewirkt habe, was das Tool von Xilinx selber nicht geschafft hat? Welche
> Erkenntnis kann man hier als Abschluss geben.

Die Synthese kann bei Angabe der Taktfrequenz der Register nur die Pfade 
automatisch mit einem sinnvollen Constraint versehen, dessen Quelle und 
Ziel mit diesem Takt (oder einem daraus abgeleiteten und für die 
Synthese bekannten Takt) betrieben sind.
Sprich: Die Synthese muss die Phasenbeziehung der Takte von Quell und 
Zielregister eines Pfades kennen.

Das funktioniert tadellos, solange du dich innerhalb einer Clock-Domain 
befindest. An den Grenzen zu einer anderen Domain (und die Schaltung 
rund ums FPGA sind eine andere Domain), kennt die Synthese den 
Phasenbezug nicht mehr und hat daher keine Chance, automatisch was 
Sinnvolles zu machen.

Daher musst du den Phasenbezug bekannt geben, oder Setup- und 
Holdzeiten.

Das gleiche kann innerhalb des FPGAs an Domaingrenzen vorkommen. 
Allerdings schafft es da die Synthese in der Regel doch selber, da die 
Takte aus der PLL kommen, welche im FPGA sitzt und die Synthese somit de 
Phasenbezug zwischen den beiden Domains kennt.

Zu deiner Frage ob einer oder mehrere Prozesse:
Ich beschreibe mit 2 Prozessen:
im ersten Prozess beschreibe ich ausschließlich die Register.
im zweiten Prozess beschreibe ich dann die gesamte Kombinatorik.

Hab ich mir so angewöhnt, da es sehr übersichtlich ist.

von Cihan K. (lazoboy61)


Lesenswert?

Super Erklärung. Danke dir für die hilfreiche und informative Antwort.

Und vielen dank auch an alle anderen Beteiligten. Mein Problem sieht 
erstmal behoben aus. Hoffe es bleibt auch so.

Gruß Cihan

von Schlumpf (Gast)


Lesenswert?

Cihan Kalayci schrieb:
> Super Erklärung. Danke dir für die hilfreiche und informative Antwort.

Sehr gerne geschehen :-)

Cihan Kalayci schrieb:
> Mein Problem sieht
> erstmal behoben aus. Hoffe es bleibt auch so.

Hoffen wir´s.. denn solche Fehler sind einfach nur lästig :-)

von Bronco (Gast)


Lesenswert?

Cihan Kalayci schrieb:
> Jetzt tretet für mich die Frage auf, was ich mit den Constraints OFFSET
> bewirkt habe, was das Tool von Xilinx selber nicht geschafft hat? Welche
> Erkenntnis kann man hier als Abschluss geben.

Diese Constraints beziehen sich auf IO-Pins des FPGAs, oder ?
Das wäre genau das, was ich gemeint habe: über die OFFSET-Constraints 
sagst Du der Toolchain, was die an den FPGA angeschlossene Hardware für 
die Setup/Hold-Zeiten hat bzw. erwartet. Dann kann die Toolchain 
versuchen, diese einzuhalten bzw. warnen, wenn sie nicht eingehalten 
werden.

von Cihan K. (lazoboy61)


Lesenswert?

Ich meine dann zu sagen, dass man neben dem CLK-Constraint dem Tool auch 
immer die OFFSET IN / OUT Constraints mitteilen sollte. Ich glaube ich 
hatte sogar etwas ähnliches hier im Forum gelesen. Kann mich aber auch 
irren.

Cihan

von Schlumpf (Gast)


Lesenswert?

Cihan Kalayci schrieb:
> Ich meine dann zu sagen, dass man neben dem CLK-Constraint dem Tool auch
> immer die OFFSET IN / OUT Constraints mitteilen sollte.

Muss man nicht unbedingt.
Solange die Signale an den Ports in sich nicht konsistenz sein müssen 
(also z.B. keine Datenbusse sind, sondern nur irgendwelche 
Steuersignale), kann man das auch weglassen.

Wichtig ist dabei halt, dass du dir im Klaren darüber bist, ob dein 
Design damit klar kommt, wenn das eine Steuersignal schon mit dem einen 
Takt, das andere aber erst mit dem nächsten Takt erfasst wird.

Wenn der Phasenbezug deiner extrenen Quelle zum internen Takt bekannt 
ist, dann kannst dir sogar das einsynchronisieren sparen.
Denn dann ist mit richtigem Constraining sichergestellt, dass zum 
Zeitpunkt der Flanke des PFGA-Registers, deine Ports "stabil" sind.

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


Lesenswert?

Schlumpf schrieb:
> Cihan Kalayci schrieb:
>> Ich meine dann zu sagen, dass man neben dem CLK-Constraint dem Tool auch
>> immer die OFFSET IN / OUT Constraints mitteilen sollte.
> Muss man nicht unbedingt.
Man kann es überhaupt nur sinnvoll bei solchen Signalen, die 
synchron zum Takt sind. Denn nur dann kann man sagen, wie lange vor 
oder nach einer Taktflanke das Signal stabil ist. Bei jedem 
asynchronen Signal ist diese Angabe nutzlos.

von Schlumpf (Gast)


Lesenswert?

Lothar Miller schrieb:
> Man kann es überhaupt nur sinnvoll bei solchen Signalen

Na ja, in den allermeisten Fällen ist das so, aber es kann auch fälle 
geben, in denen es Sinnvoll sein kann, sowas anzugeben, obwohl das 
Signal asynchron ist.
z.B. wenn ich den anynchronen Eingang auf mehreren Taktdomänen sample. 
Dann kann es hilfreich sein, mit dieser Methode die Synthese ein wenig 
zu "zwingen", den Skew zwischen Port und den einzelnen Sampleregistern 
der Taktomänen gering zu halten.
Aber ich gebe dir recht. Das ist sicher eher eine Ausnahme und nicht die 
Regel.

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


Lesenswert?

Schlumpf schrieb:
> z.B. wenn ich den anynchronen Eingang auf mehreren Taktdomänen sample.
Unabhängige Taktdomänen (z.B. 47MHz/17MHz)?
Oder "phasenstarre" Taktdomänen (z.B. 25MHz/50MHz)?

> Dann kann es hilfreich sein, mit dieser Methode die Synthese ein wenig
> zu "zwingen", den Skew zwischen Port und den einzelnen Sampleregistern
> der Taktomänen gering zu halten.
Wenn die Takte unabhängig sind, dann hilft eine begrenzte maximale 
Lauzeit zwischen Pad und FF auch nichts. Gesampelt wird dann sowieso 
jedesmal zu einem anderen Zeitpunkt...
Und auch bei starrem Phasenbezug hilft eine Limitierung der maximalen 
Laufzeit nur mental, denn wenn ich sage: vom Pad zum FF maximal 10ns, 
dann kann trotzdem die eine Domäne mit 4ns angebunden werden und die 
andere mit 10ns...

> die Synthese ein wenig zu "zwingen"
Naja, der Synthese ist es erst mal egal. Der Placer und der Router 
können da schon eher was ausrichten... ;-)

von Schlumpf (Gast)


Lesenswert?

Lothar Miller schrieb:
> vom Pad zum FF maximal 10ns,
> dann kann trotzdem die eine Domäne mit 4ns angebunden werden und die
> andere mit 10ns...

richtig.. aber genau darauf wollte ich hinaus.. wenn ich damit die 
maximale Laufzeit begrenze, dann kann ich wenigstens davon ausgehen, 
dass die Signale intern dann um maximal einen Takt verschoben sind und 
nicht um mehrere. Weil ich den Skew dann so einstellen kann dass er eben 
irgendwo zwischen 0 und n ist und nicht vollkommen unbekannt.

Vielleicht habe ich mich etwas schlecht ausgedrückt.

Lothar Miller schrieb:
> Naja, der Synthese ist es erst mal egal. Der Placer und der Router
> können da schon eher was ausrichten... ;-)

richtig.. und man kann ein Haar auch 0..n mal der Länge nach Spalten, 
wenn das Messer nur scharf genug ist :-)

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.