Forum: FPGA, VHDL & Co. RTL: "wait until rising_edge" oder "if rising_edge"


von Matthias G. (mgottke)


Lesenswert?

Wie soll man mit der wait until rising_edge im RTL umgehen?
So ist es klar:
1
process begin
2
    if rising_edge(clk) then
3
    :
sollte man aber das folgende vermeiden?
1
process begin
2
    wait until rising_edge(clk);
3
    :
Lothar Miller schreib dazu in einem anderen Beitrag:
> Es gibt ein paar schlagende Vorteile:
> - schreibt und liest sich schöner, weil weniger Einrückungen nötig sind
>   und eine Klammerebene gespart wird
> - die Simulation und die Synthese stimmen immer überein,
>   weil es keine unvollständigen Sensitivity-Listen mehr gibt
> - der Prozess ist garantiert getaktet,
>   und hat nicht irgendwo einen asynchronen Teil
> Und wieso sollte man etwas nicht verwenden, wenn es Vorteile bringt?
> Nur, weil es in keinem Buch steht?

In den "vhdl style sheets" die ich kenn wird meist dringend davon 
abgeraten wait im RTL zu verwenden. Gleichzeitig wird aber darauf 
hingewiesen, dass waits im Zusammenhang mit Takten möglichst immer zu 
verwenden ist.

Wo gibt es mit dem wait mögliche Probleme? Oder auch nicht?

von Duke Scarring (Gast)


Lesenswert?

Im XST User Guide (-> VHDL Language Support -> VHDL Sequential Circuits 
-> VHDL Sequntial Process Without a Sensitivity List) ist die von Lothar 
Miller vorgeschlagene Syntax beschrieben.
Die Vorteile sehe ich auch. Es ist schon oft genug vorgekommen, dass es 
in der Hardware läuft und in der Simulation nicht, weil die Sensitivty 
List fehlerhaft war.

Duke

von Klaus F. (kfalser)


Lesenswert?

Beide Formen sind für die Synthese möglich.

Letztendlich läuft es immer darauf hinaus, dass der VHDL Text die 
Beschreibung von FFs ergibt.
Das sind also die Varianten mit :
1
process(clk, reset)
2
begin
3
  if reset = 1 then 
4
    ... 
5
  elsif rising_edge(clk) then  
6
    ... 
7
  end if;
8
end process;

oder die Varianten von
1
process
2
  wait until clk = '1';
3
  ...
4
end process;

Bei der Beschreibung mit if rising_edge() kann man den asynchronen Reset 
beschreiben, etwas das in Form 2 nicht geht.
Bei der Beschreibungsform 2 hat man den (fragwürdigen) Vorteil, dass man 
die sensitivity list nicht zu schreiben braucht. Außerdem unterstützt 
XST anscheinend auch mehrere waits (immer für das gleiche clk Signal) 
hintereinander, sodass man eine Art Sequenz programmieren kann. Ich habe 
das jedenfall noch nie verwendet und ich denke die meisten verwenden 
Form 1 wegen dem Vorteil mit dem asynchronen Reset.

Diese Einschränkungen gelten natürlich nur für die Synthese, in 
Testbenches kann man beschreiben was man will.

von SuperWilly (Gast)


Lesenswert?

Was ist denn mit folgender Variante ?

process
begin
   wait until Clk='1';
...
end process;

Hat meines Erachtens die gleiche Funktion wie der Vorschlag
von Lothar M.

Kommentare ?

Gruß,
SuperWilly

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


Lesenswert?

Der betreffende Standard ist IEEE 1076.6.
Eine Suche im weltweiten Web ergibt einige Treffer, wobei sogar noch 
wesentlich "wildere" Konstruktionen definiert (z.B. Enable und Clk in 
einer Abfrage) und von den Synthesetools unterstützt werden.
http://www.synthworks.com/papers/vhdl_rtl_synthesis_1076_6_dvcon_2004_s.pdf
http://hotelhilbert.net/ETH/digitech/vorlesungsslides/16-syn-handout.pdf
Offenbar wird an der TU Delft auch diese "neue" Beschreibung 
verwendet...

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


Lesenswert?

> Bei der Beschreibungsform 2 hat man den (fragwürdigen) Vorteil,
> dass man die sensitivity list nicht zu schreiben braucht.
Ich würde gerade diesen Vorteil nicht in Frage stellen. Man muß sich nur 
mal in den hier (im Forum) geposteten Quellen die überdefinierten oder 
unvollständigen Sensitivity-Listen ansehen, um zu erkennen, dass da 
etliche Simulationen nicht das machen werden, was das Design auf dem 
FPGA tun wird...   :-/

> XST anscheinend auch mehrere waits (immer für das gleiche clk Signal)
> hintereinander, sodass man eine Art Sequenz programmieren kann.
Das ist vom IEEE aber nicht mehr abgedeckt.
Dort steht, dass das wait an erster Stelle im Prozess zu stehen hat.
Spätestens das zweite wait until würde diese Forderung verletzen.
Aber, ich habe es gerade ausprobiert:
1
   process begin
2
      wait until rising_edge(CLK);
3
      count2 <= count2+1;
4
      wait until rising_edge(CLK);
5
      wait until rising_edge(CLK);
6
      count2 <= count2+1;
7
      wait until rising_edge(CLK);
8
      count1 <= count1+1;
9
   end process;
Das geht, count1 zählt halb so schnell wie count2    :-o

von Duke Scarring (Gast)


Lesenswert?

@SuperWilly:

Ich hab mal den Namen ausgetausch:
1
process
2
begin
3
   wait until En='1';
4
...
5
end process;
Für mich sieht das aus wie ein Latch.

Duke

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


Lesenswert?

> Für mich sieht das aus wie ein Latch.
Das schon (deshalb schreibe ich lieber wait until rising_edge), aber 
diese Beschreibung ist nach IEEE korrekt und ergibt ein getaktetes FF.

von Klaus F. (kfalser)


Lesenswert?

@Duke
> Für mich sieht das aus wie ein Latch.

Die Zeile
1
Wait until EN='1';
ist laut VHDL Standard equivalent zu
1
Wait on EN until EN='1'"

Wait on EN wartet auf ein Event am EN signal, das EN'event ist also 
überflüssig, wenn es auch die Lesbarkeit erhöht.

@Lothar
>> Bei der Beschreibungsform 2 hat man den (fragwürdigen) Vorteil,
>> dass man die sensitivity list nicht zu schreiben braucht.
>Ich würde gerade diesen Vorteil nicht in Frage stellen.

Bei einem kombinatorischen Prozess würde ich Dir recht geben, aber bei 
einem getakteten Prozess sind es nur der Takt (und ev. der Reset) der in 
die sensitivity list gehört. Wer dieses Grundprinzip nicht verstanden 
hat, der hat früher oder später mit dem Rest seines VHDL Codes auch 
Schwierigkeiten.

von Duke Scarring (Gast)


Lesenswert?

>... bei einem getakteten Prozess sind es nur der Takt (und ev. der Reset) >der in 
die sensitivity list gehört.

Richtig und dann ändert man mal schnell auf eine andere Taktdomäne und 
vergisst die sensitivity list...
...und die Simulation geht nicht mehr. Nur so als Beispiel aus der 
Praxis.

Duke

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


Lesenswert?

> Bei einem kombinatorischen Prozess würde ich Dir recht geben...
Bei kombinatorischen Prozessen geht das mit wait sowieso nicht, weil 
aus einer solchen Beschreibung ein getakteter Prozess wird.

Ich versuche, kombinatorische Prozesse in concurrent-Beschreibungen 
abzuhandeln. Das geht erstaunlich oft  ;-)

> Wer dieses Grundprinzip nicht verstanden hat, der hat früher
> oder später mit dem Rest seines VHDL Codes auch Schwierigkeiten.
FULLstes ACK  ;-)

von alex (Gast)


Lesenswert?

Verstehe nicht, warum ihr so auf Sensitivity Listen rumhackt. Bei der 
Synthese gibt es diesbezüglich sowieso eine Warnung, wenn in der Liste 
Signale fehlen sollten (bei ISE zumindest), und diesen Fehler kann man 
doch, so gesehen, gar nicht übersehen. Ist das bei anderen Synthesetools 
etwa anders? Oder ist es jetzt etwa in Mode, ein Design mit Warnungen 
abzugeben...

von Matthias G. (mgottke)


Lesenswert?

Bei der Synthese schon, da arbeiten die Tools sehr unsauber. Aber bei 
der Simulation kommt keine Warnung. Laut VHDL ist es mämlich zulässig 
Singale in der Sensitivity-Liste weg zu lassen. Dies sollte dann auch zu 
anderen Ergebnissen führen. Dies ist aber meist nur in der Simulation 
der Fall.

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


Lesenswert?

> Dies sollte dann auch zu anderen Ergebnissen führen.
Tut es auch :-/
> Dies ist aber meist nur in der Simulation der Fall.
Ausschließlich in des Simulation.
Die (vollständige) Sens-Liste ist nur für die Simulation nötig.

>> Verstehe nicht, warum ihr so auf Sensitivity Listen rumhackt.
Beispiele im Beitrag "Re: Vergleich von 2 code Varianten" und im 
Beitrag "Re: State Machine Zähler-Problem"

von Duke Scarring (Gast)


Lesenswert?

@alex:
Hier mal ein Ausschnitt aus einem Synthesereport:
1
Number of errors   :    0 (   0 filtered)
2
Number of warnings : 9485 (   0 filtered)
3
Number of infos    : 2088 (   0 filtered)

Das Design läuft. Und man möchte den Code gar nicht ändern, um die 
Warnungen wegzubekommen...
Der Warnmechanismus von XST ist alles, nur nicht produktiv brauchbar.

Duke

P.S.: Simulieren läßt es sich natürlich auch.

von Morin (Gast)


Lesenswert?

> und diesen Fehler kann man doch, so gesehen, gar nicht übersehen.

Würde gerne mal sehen, wie du diesen Fehler in den 9485 Warnungen in 
Dukes Projekt erspähst.

> Ist das bei anderen Synthesetools etwa anders?
> Oder ist es jetzt etwa in Mode, ein Design mit Warnungen abzugeben

Um im Xilinx ISE ein Design ohne Warnungen synthetisiert zu bekommen, 
musst du diverse Änderungen vornehmen, die den Code extrem unlesbar und 
unstrukturiert machen.

Schönes Beispiel: Ein einfacher SoC-Bus, Single-Master, 32 
Adressleitungen, 32 Datenleitungen. Gedacht war es so: 12 A-Leitungen 
wählen ein Device, 20 A-Leitungen gehen an das Device. Alle Schreibdaten 
gehen an alle Devices, die Lesedaten aller Devices werden je nach 
Adresse gemultiplexed. Nichts besonderes also. Ergebnis: Eine Flut von 
Warnungen über unbenutzte Adress- und Schreibdaten-Signale in den 
Devices. Und das ist sogar noch relativ einfach zu beheben, es gibt noch 
weitaus schlimmeres.

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


Lesenswert?

>>> Verstehe nicht, warum ihr so auf Sensitivity Listen rumhackt.
Ein aktuelles Beispiel findet sich im 
Beitrag "MUX mit bidirektionalem Pin"  ;-)

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.