Forum: FPGA, VHDL & Co. Prozess-Sensivity-Liste leer lassen


von Bronco (Gast)


Lesenswert?

Hallo,

ich habe ein Modul vorliegen (nicht von mir), in dem ein umfangreicher 
ungetakteter Prozeß ist. Ist nicht schön, aber es tut.
Die Sensivity-Liste ist ellenlang.

Frage:
Soweit ich weiß, wird die Sensivity-Liste von der (Xilinx)-Toolchain bei 
der Synthese automatisch vervollständigt und nur für die Simulation muß 
sie korrekt sein.
Ist es legithim, die Sensivity-Liste für die Synthese komplett 
wegzulassen?
(Gibt eine Warning, aber das macht in dem Fall nichts)

von P. K. (pek)


Lesenswert?

Bronco schrieb:
> Ist es legithim, die Sensivity-Liste für die Synthese komplett
> wegzulassen?

Willst Du überhaupt nicht simulieren? Der "lästige" Simulationsoverhead 
zahlt sich in der Regel mehrfach aus...

Du brauchst die Sensitivityliste nur für die Simulation (nach der 
Synthesis ist die HW ja einfach da, nichts muss getriggert werden).

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


Lesenswert?

Bronco schrieb:
> Ist es legithim, die Sensivity-Liste für die Synthese komplett
> wegzulassen?
1. Du kannst sie nicht weglassen (bzw. nur, wenn du ein wait im 
Prozess hast).
2. Du kannst sie nicht leerlassen.

Wenn du hinnimmst, dass deine Simulation dann sicher nicht mehr stimmt, 
dann schreibst du irgendwas da rein, dann geht das. Aber es wird dich 
einholen. Garantiert.

In VHDL2008 gibt es auch die Möglichkeit die Sensitivliste mit (ALL) zu 
beschreiben.

von Bronco (Gast)


Lesenswert?

Peter K. schrieb:
> Willst Du überhaupt nicht simulieren? Der "lästige" Simulationsoverhead
> zahlt sich in der Regel mehrfach aus...

Simulieren werde ich in diesem konkreten Fall nie. Das Modul ist fertig 
und seit längerem im Feld erprobt. Ich möchte es nur etwas aufräumen und 
übersichtlicher machen, ohne die Funktionalität zu ändern.


Lothar Miller schrieb:
> 1. Du kannst sie nicht weglassen (bzw. nur, wenn du ein wait im
> Prozess hast).

Doch, das geht. Ich hab einen Vergleich der Bitfiles mit und ohne 
Sensivity-Liste gemacht, und beide Bitfiles sind (bis auf's Datum) 
identisch. Alles muß die Toolchain die vollständige Sensitivity-Liste 
selber erstellt haben.


Lothar Miller schrieb:
> In VHDL2008 gibt es auch die Möglichkeit die Sensitivliste mit (ALL) zu
> beschreiben.

Danke, das hört sich gut an.

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


Lesenswert?

Bronco schrieb:
> Lothar Miller schrieb:
>> 1. Du kannst sie nicht weglassen
>>    (bzw. nur, wenn du ein wait im Prozess hast)
> Doch, das geht.
1
  process begin
2
     -- jetzt kommt alles, aber kein "wait"
3
  end process;
Sowas geht?

von Bronco (Gast)


Lesenswert?

Lothar Miller schrieb:
> Sowas geht?

Sorry, ich seh gerade, ich hab was übersehen:
Erst kommt ein riesiger ungetakteter Block, aber ganz am Ende steht doch 
noch ein if(rising_edge(...)) Block.

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


Lesenswert?

Bronco schrieb:
> Erst kommt ein riesiger ungetakteter Block, aber ganz am Ende steht doch
> noch ein if(rising_edge(...)) Block.
Uuuups. Das ist aber schief gegangen! Kombinatorik und getakteter Teil 
in einem Prozess? Das grenzt ja an "Kündigungsgrund"... :-o

Wie auch immmer:
In einem if(rising_edge(...)) ist kein wait zu finden. Du kannst dort 
also nicht die Sensisitvliste leer lassen. Evtl. bekommst du aber nur 
eine Warnung. Ich probier das gerade mal aus...
... XISE sagt dazu:
1
 No sensitivity list and no wait in the process

von Marcus H. (mharnisch) Benutzerseite


Lesenswert?

Bronco schrieb:
>> Willst Du überhaupt nicht simulieren?
> Das Modul ist fertig [...]. Ich möchte es nur etwas aufräumen und
> übersichtlicher machen, ohne die Funktionalität zu ändern.

Sicher... ;-) Die Simulation zeigt Dir dann den Unterschied zwischen 
"möchten" und "tun".

Lothars Tip bzgl VHDL-2008 ist sicherlich die übersichtlichste Methode, 
unhandliche Sensitivity Listen in den Griff zu bekommen.

--
Marcus

von Bronco (Gast)


Lesenswert?

Marcus Harnisch schrieb:
> Sicher... ;-) Die Simulation zeigt Dir dann den Unterschied zwischen
> "möchten" und "tun".
Das wäre ohne Frage der richtige Weg, wenn ich auch nur ansatzweise 
nachvollziehen könnte, was das Modul genau machen soll. So könnte ich 
nur etwas simulieren, von dem ich nicht weiß, wie das Ergebnis aussehen 
soll.

Lothar Miller schrieb:
> Uuuups. Das ist aber schief gegangen! Kombinatorik und getakteter Teil
> in einem Prozess? Das grenzt ja an "Kündigungsgrund"... :-o
Ja, mit dem Gedanken trage ich mich regelmäßig, wenn man mir solche 
Projekte über den Zaun wirft. Vorallem dann diese Diskussionen, das doch 
alles perfekt funktioniert und ich die >3000 (kein Witz) 
Timing-Verletzungen doch einfach ignorieren soll...

von Marcus H. (mharnisch) Benutzerseite


Lesenswert?

Bronco schrieb:
> Marcus Harnisch schrieb:
>> Sicher... ;-) Die Simulation zeigt Dir dann den Unterschied zwischen
>> "möchten" und "tun".
> Das wäre ohne Frage der richtige Weg, wenn ich auch nur ansatzweise
> nachvollziehen könnte, was das Modul genau machen soll. So könnte ich
> nur etwas simulieren, von dem ich nicht weiß, wie das Ergebnis aussehen
> soll.

Warum willst Du das dann "aufräumen"? Das Modul macht doch angeblich was 
es soll. Never touch a running system. Besonders, wenn es, wie es 
scheint, weder Doku noch Testbench gibt. Ästhetische Gründe 
rechtfertigen das nicht.

--
Marcus

von Bayer (Gast)


Lesenswert?

Bronco schrieb:
> Soweit ich weiß, wird die Sensivity-Liste von der (Xilinx)-Toolchain bei
>
> der Synthese automatisch vervollständigt

Da wird nichts vervollständigt, sondern die wird einfach ignoriert, weil 
die Synthese die nicht braucht. Die Synthes baut alles, was dasteht, 
egal welcher Zeitabluf sich dahint verbirgt.

Nur die SImulation muss das "wissen" weil sie nur das ansprint, was auch 
zueinander abhängig ist.

von Bronco (Gast)


Lesenswert?

Marcus Harnisch schrieb:
> Warum willst Du das dann "aufräumen"? Das Modul macht doch angeblich was
> es soll. Never touch a running system.

Okay, ich war nicht ganz ehrlich: Wir hoffen und beten, daß es tut, was 
es soll. Nachweisen kann es ja leider keiner mehr.
Wenn in der Vergangenheit Probleme aufgetreten sind, wurden halt 
irgendwelche Workarounds gebastelt.
Mein Ansatz ist: erstmal das Modul so verstehen, wie es ist. Quasi 
Reverse-Engineering. Kommentare einfügen, Signale erklären, den Code 
strukturieren.
Im zweiten Schritt könnte ich dann sogar Bugs finden...

von Drill-Tutor (Gast)


Lesenswert?

>Okay, ich war nicht ganz ehrlich: Wir hoffen und beten, daß es tut, was
>es soll. Nachweisen kann es ja leider keiner mehr.
>Wenn in der Vergangenheit Probleme aufgetreten sind, wurden halt
>irgendwelche Workarounds gebastelt.
>Mein Ansatz ist: erstmal das Modul so verstehen, wie es ist. Quasi
>Reverse-Engineering. Kommentare einfügen, Signale erklären, den Code
>strukturieren.

Damit verstehtst du den Code lokal besser aber nicht die Funktionsweise 
des Modules. Dein Ansatz sollte besser sein, als erstes eine Simulations 
ans laufen zu bekommen.:

-in TB Instanzieieren
-Takt und reset drantütern
-In simulator laden
-Im wave alle Ausgänge anzeigen lassen
- schauen was passiert.

Simulation ist Reverse Engineering, dein Ansatz dagegen ist 
hoffnungsvolle Kaffesatzleserei.

Gruß

PS.:
>Im zweiten Schritt könnte ich dann sogar Bugs finden...

Wie willst du bugs erkennen, wenn du keine Spec/referenzpattern/Doku 
hast?
Ein Bugs ist dann das, was im Code nach deiner Ansicht nach einem Bug 
aussieht?! Das ist reichlich unbedarft.

von Bronco (Gast)


Lesenswert?

Drill-Tutor schrieb:
> Simulation ist Reverse Engineering, dein Ansatz dagegen ist
> hoffnungsvolle Kaffesatzleserei.

Seh ich anders. Ich versuche zuerst herauszufinden, was das Modul machen 
soll, sprich, welche Konzepte dahinterstecken. Denn die Konzepte sind 
schon durchdacht, nur halt nicht dokumentiert.
Was es tatsächlich macht, kann ich heute schon mit ChipScope 
nachvollziehen, aber ich kann nicht beurteilen, ob dies korrekt ist, 
solange ich nicht weiß, was es machen soll.

von P. K. (pek)


Lesenswert?

Bronco schrieb:
>> Simulation ist Reverse Engineering, dein Ansatz dagegen ist
>> hoffnungsvolle Kaffesatzleserei.
>
> Seh ich anders. Ich versuche zuerst herauszufinden, was das Modul machen
> soll, sprich, welche Konzepte dahinterstecken. Denn die Konzepte sind
> schon durchdacht, nur halt nicht dokumentiert.
>
> Was es tatsächlich macht, kann ich heute schon mit ChipScope
> nachvollziehen, aber ich kann nicht beurteilen, ob dies korrekt ist,
> solange ich nicht weiß, was es machen soll.

"was es machen soll" erfährst Du niemals mit Reverse-Engineering. Dafür 
brauchst Du eine Spezifikation. Mit Reverse-Engineering und Code 
anschauen findest Du (nicht mehr und nicht weniger) heraus "was es tut", 
potentielle Bugs hebe sich da nicht ab.

Wenn Du also keine Dokumentation/Spezifikation vorliegen hast, ist der 
Weg über die Simulation sicher der gute Weg. Du kannst damit wenigstens 
beweisen, dass deine optimierte Version immer noch dasselbe macht wie 
vorher und Du keine neuen Fehler eingebaut hast (der +/-1 Bock lässt 
grüssen...).

Und wenn Du Dokumentation/Spezifikation vorliegen hast gilt das genau 
so, nur kannst Du zusätzlich dazu potentielle alte Böcke auch noch 
angehen.

von Bronco (Gast)


Lesenswert?

Peter K. schrieb:
> "was es machen soll" erfährst Du niemals mit Reverse-Engineering. Dafür
> brauchst Du eine Spezifikation. Mit Reverse-Engineering und Code
> anschauen findest Du (nicht mehr und nicht weniger) heraus "was es tut",
> potentielle Bugs hebe sich da nicht ab.

Gut, dann ist Reverse-Engineering der falsche Begriff. Nennen wir es 
Spaghetti-Code-Dekyrptographie.
Ich kann aus dem Source-Code mit zunehmender Erfahrung auf das 
zurückschließen, was der ursprüngliche Entwickler machen wollte. Er 
schreibt an einer Stelle 10 Worte in den FIFO, also gehe ich davon aus, 
daß er an anderer Stelle auch 10 Worte auslesen will. Wenn er aber 11 
Worte ausliest, weiß ich, daß ich diese Stelle intensiv anschauen und 
testen (bzw. simulieren) muß.
Zu diesem Verständnis hilft es mir ungemein, den Code in eine Form zu 
bringen, die ich besser lesen kann, obwohl das Verhalten noch identisch 
ist.

PS: nach der Denkweise meines Brötchengebers liegt eine Spezifiktion 
sehr wohl vor, nur eben in Form von Spaghetti-Code :-O

von P. K. (pek)


Lesenswert?

Bronco schrieb:
> Ich kann aus dem Source-Code mit zunehmender Erfahrung auf das
> zurückschließen, was der ursprüngliche Entwickler machen wollte.

Chapeau!

> Er schreibt an einer Stelle 10 Worte in den FIFO, also gehe ich davon
> aus, daß er an anderer Stelle auch 10 Worte auslesen will. Wenn er
> aber 11 Worte ausliest, weiß ich, daß ich diese Stelle intensiv
> anschauen und testen (bzw. simulieren) muß.

Um bei Deinem Beispiel zu bleiben: Er kann auch 10 Worte reinschreiben 
und 10 Worte rauslesen und trotzdem was falsch gemacht haben. Oder so.

> Zu diesem Verständnis hilft es mir ungemein, den Code in eine Form zu
> bringen, die ich besser lesen kann, obwohl das Verhalten noch identisch
> ist.

Gerade damit nach Deiner Optimierung das Verhalten noch identisch ist, 
hilft Dir eine Regression-Simulation (vorher-nachher mit "golden" Sets).

von Marcus H. (mharnisch) Benutzerseite


Lesenswert?

Peter K. schrieb:
> Gerade damit nach Deiner Optimierung das Verhalten noch identisch ist,
> hilft Dir eine Regression-Simulation (vorher-nachher mit "golden" Sets).

Die es anscheinend nicht gibt. Man könnte mit einem LEC Werkzeug formal 
überprüfen, ob die Logik von altem und "aufgeräumten" Design identisch 
ist. Kostet aber ein bisschen.

von Bronco (Gast)


Lesenswert?

Marcus Harnisch schrieb:
>> Gerade damit nach Deiner Optimierung das Verhalten noch identisch ist,
>> hilft Dir eine Regression-Simulation (vorher-nachher mit "golden" Sets).
>
> Die es anscheinend nicht gibt. Man könnte mit einem LEC Werkzeug formal
> überprüfen, ob die Logik von altem und "aufgeräumten" Design identisch
> ist. Kostet aber ein bisschen.

Ich mach das viel einfacher:
Beim Aufräumen gibt's nur Änderungen, bei denen das Bitfile identisch 
bleibt.
Wenn ich dann ein Grundverständnis hab, wage ich mich auch daran, 
Signalnamen per Find-Replace umzubennen. Leider verhält sich die 
Xilinx-Toolchain so, daß das Ändern von Signalnamen i.d.R. zu einem 
anderen Bitfile führt (schätzungsweise, weil die Signalnamen nach 
Alphabet sortiert werden).

von Drill-Tutor (Gast)


Lesenswert?

>Wenn ich dann ein Grundverständnis hab, wage ich mich auch daran,
>Signalnamen per Find-Replace umzubennen. Leider verhält sich die
>Xilinx-Toolchain so, daß das Ändern von Signalnamen i.d.R. zu einem
>anderen Bitfile führt (schätzungsweise, weil die Signalnamen nach
>Alphabet sortiert werden).

Ne, das hat nix mit sortierung etc zu tun. Eher das die 
namensbasierenden constraints im ucf file ins leere laufen. Im 
günstigsten file ist nur das routing etwas anders, im worst case hat 
sich die Zurordnung Netz - Pin geändert - das ist dann tödlich.

Besser als umbenennen wäre IMHO eine Dokumentation der teilblöcke mit 
ein und asugehenden Signalen, Taktdomain, reset, und kurzer beschreibung 
was da gemacht wird (FIFO, data processing, synchronisierung) Oft hilft 
ein Blick in den synthesereport da steht was an Counter, Muxern, 
Block-Rams, FSM erkannt und synthetisiert wurde.

MfG

von Mathi (Gast)


Lesenswert?

Bronco schrieb:
> Leider verhält sich die
> Xilinx-Toolchain so, daß das Ändern von Signalnamen i.d.R. zu einem
> anderen Bitfile führt (schätzungsweise, weil die Signalnamen nach
> Alphabet sortiert werden).

Nicht unbedingt. Die Algorithmen die hinter der Umsetzung der Schaltung 
(Place & Route) stehen, sind heuristische Algorithmen. Für ihre Arbeit 
brauchen die Tools einen Startwert. Der wird bei manchen Tools (u.U. 
auch bei Xilinx) aus der Eingabe generiert.

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


Lesenswert?

Mathi schrieb:
> Für ihre Arbeit brauchen die Tools einen Startwert. Der wird bei
> manchen Tools (u.U. auch bei Xilinx) aus der Eingabe generiert.
Andere lassen die Toolchain mit unterschiedlichen Werten mal über Nacht 
durchlaufen, und nehmen dann die Werte für das beste Design als 
Startwerte für das weiter vorgehen...

von Drill-Tutor (Gast)


Lesenswert?

Bronco schrieb:
>> Leider verhält sich die
>> Xilinx-Toolchain so, daß das Ändern von Signalnamen i.d.R. zu einem
>> anderen Bitfile führt (schätzungsweise, weil die Signalnamen nach
>> Alphabet sortiert werden).

>Nicht unbedingt. Die Algorithmen die hinter der Umsetzung der Schaltung
>(Place & Route) stehen, sind heuristische Algorithmen. Für ihre Arbeit
>brauchen die Tools einen Startwert. Der wird bei manchen Tools (u.U.
>auch bei Xilinx) aus der Eingabe generiert.

Dann hat sich das bei Xilinx geändert. Nach Aussage Xilinx- FAE und 
eigenen Tests wird der Start wert fürs simulated annealing beim 
plac/routing nicht bei jedem lauf zufällig erzeugt sondern man bedient 
sich eines seeds das der user den Toolchain explicit übergibt.

Wenn aber ein tool eines drittherstellers in die Toolchain spuckt 
(synthese) haben die xilinx-aussagen auch keinen wert.

Gruß

von Mathi (Gast)


Lesenswert?

Danke für die Info!

Meine Aussage war nur eine Hypothese, warum das Ergebnis ein anderes 
sein kann. Hatte damit nämlich vor ein paar Jahren mal ein Problem und 
vom damaligen FAE diese Info bekommen.

Dann kann es aber auch nicht der Grund für das unterschiedliche Ergebnis 
sein.

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.