Forum: FPGA, VHDL & Co. Sensitivity List


von Daniel K. (daniel_k80)


Lesenswert?

Hallo zusammen,

ich habe ein Verständnisproblem bei der Sensitivity List in VHDL.
Bisher habe ich es so verstanden, dass in die Liste alle Signale 
eingetragen werden, die sich innerhalb des process Blocks ändern.
Nun habe ich aber vorher diesen Artikel gelesen:

http://www.lothar-miller.de/s9y/categories/34-Getakteter-Prozess

Im Unterpunkt "Takt im Prozess" steht nun folgendes:
1
architecture Behavioral of Beispiel is
2
begin
3
   -- Prozess ohne Sensitiv-Liste
4
   process begin
5
      wait until rising_edge(clk);
6
      if (sel1='1') then
7
         outp <= inp;
8
      else
9
         outp <= not inp;
10
      end if;
11
   end process;   
12
end Behavioral;

Wieso wird da die Liste weg gelassen? Und welche Bedeutung bzw. Funktion 
hat die Sensitivity List? Weil ich habe nach dem Lesen das Gefühl 
gehabt, dass mein bisheriges Verständnis dieser Liste falsch war.

Danke fürs aufschlauen!

Gruß
Daniel

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


Lesenswert?

Daniel K. schrieb:
> Wieso wird da die Liste weg gelassen?
Was ist in der Beschreibung dort unverständlich?
http://www.lothar-miller.de/s9y/archives/16-Takt-im-Prozess.html

> Und welche Bedeutung bzw. Funktion hat die Sensitivity List?
Die Sensitivliste ist ausschließlich für den Simulator interessant. 
Der berechnet die Prozessergebnisse neu, wenn sich eines der signale in 
der Liste ändert.

Man kann jeden Prozess entweder mit "wait" oder mit einer Sensitivliste 
beschreiben. Man kann ein Und-Gatter in einem Prozess z.B. so 
beschreiben:
1
process (a,b) begin
2
  z <= a and b;
3
end process;
Oder alternativ so:
1
process begin    -- keine Sensitivliste
2
  wait on (a,b); -- aber ein wait
3
  z <= a and b;
4
end process;

Siehe die hier:
Beitrag "Re: Der vhdl-Schnipsel-Anfängerfragen Thread"
Beitrag "Re: Sensitivitätsliste in VHDL Code"
Beitrag "Re: Verschiedene Schreibweisen bei "process""

> Weil ich habe nach dem Lesen das Gefühl gehabt, dass mein bisheriges
> Verständnis dieser Liste falsch war.
Passiert vielen, die meinen, über diese Liste irgendwas im FPGA 
Verhalten ändern zu können... :-)
Manchmal tappt man über diese Liste auch ins Verderben. Wie z.B. im 
Beitrag "Re: Variable vs Signal" und nochmal weiter 
unten dort im Beitrag "Re: Variable vs Signal"

: Bearbeitet durch Moderator
von Daniel K. (daniel_k80)


Lesenswert?

Hallo Lothar,

danke für die Erklärung.

>Lothar Miller schrieb:

>>> Und welche Bedeutung bzw. Funktion hat die Sensitivity List?
>> Die Sensitivliste ist ausschließlich für den Simulator interessant.
>> Der berechnet die Prozessergebnisse neu, wenn sich eines der signale in
>> der Liste ändert.

Genau DAS hat mir gefehlt :)
Das kam bisher nie wirklich raus, wenn ich etwas über die Liste gelesen
habe.

: Bearbeitet durch User
von Da D. (dieter)


Lesenswert?

Oder man ist auf der Höhe der Zeit* und schreibt einfach und überall:
1
process(all)
2
begin
3
...

*aktueller VHDL Standard ist VHDL2008

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


Lesenswert?

Da Dieter schrieb:
> Oder man ist auf der Höhe der Zeit* und
... schaltet das Hirn aus.
Genau dieses "all" ist m.E. eines der blödsinnigsten Konstrukte der 
"Weiterentwicklung" von VHDL. Denn die Sensitivliste sollte doch 
eigentlich nochmal zum Nachdenken anregen, ob das denn wirklich so 
gemeint war...

> und schreibt einfach und überall: process(all)
Dann kann ich aber nicht mehr mit wait im Prozess arbeiten...  :-/

von Lattice User (Gast)


Lesenswert?

Lothar Miller schrieb:

>
>> und schreibt einfach und überall: process(all)
> Dann kann ich aber nicht mehr mit wait im Prozess arbeiten...  :-/

Wenn es die gleichen Regeln wie das schon lange existierende @(*) in 
Verilog 2001 hat, ist es nur für combinatorische Prozesse erlaubt. Dein 
wait unit raising_edge(clk) ist also nicht in Gefahr.

Und für combinatorische Prozesse macht es durchaus Sinn, ein vergessenes 
Signal in der Sensitivity List bei der Verification ist vermutlich nicht 
wenige ASIC Bugs verantwortlich.

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


Lesenswert?

Lattice User schrieb:
> ein vergessenes Signal in der Sensitivity List bei der Verification ist
> vermutlich nicht wenige ASIC Bugs verantwortlich.
Man sollte sich dann einfach auch mal den Compiler-Log ansehen. Da 
taucht das auch bei der Simulation auf. Und dann wie gesagt: 
Mitdenken... ;-)

Lattice User schrieb:
> Dein wait unit raising_edge(clk) ist also nicht in Gefahr.
Schon, wenn die Regel "Jeder Prozess mit (all)!" gilt. Denn ein Prozess 
mit Sensitivliste und wait geht nun mal nicht...

von Lattice User (Gast)


Lesenswert?

Lothar Miller schrieb:
> Lattice User schrieb:
>> ein vergessenes Signal in der Sensitivity List bei der Verification ist
>> vermutlich nicht wenige ASIC Bugs verantwortlich.
> Man sollte sich dann einfach auch mal den Compiler-Log ansehen. Da
> taucht das auch bei der Simulation auf. Und dann wie gesagt:
> Mitdenken... ;-)

Solche Warnungen im Log zu suchen und dann das fehlende Signal 
nachträglich einzutragen hat mit Mitdenken nichts zu tun. Das ist eine 
Arbeit die der Compiler besser kann, und vor allem vergisst er es nicht 
unter Zeitdruck.

Die Sensitivityliste diente ja mal dazu die Simulation zu beschleunigen.

>
> Lattice User schrieb:
>> Dein wait unit raising_edge(clk) ist also nicht in Gefahr.
> Schon, wenn die Regel "Jeder Prozess mit (all)!" gilt. Denn ein Prozess
> mit Sensitivliste und wait geht nun mal nicht...

Ich bezweifle dass die Regel "Jeder Prozess mit (all)!" wirklich gilt. 
Aber Zugang zum Standard habe ich nicht.

von VHDLogiker (Gast)


Lesenswert?

Daniel K. schrieb:
> Bisher habe ich es so verstanden, dass in die Liste alle Signale
> eingetragen werden, die sich innerhalb des process Blocks ändern.

Man glaubt es nicht, aber genau das wird in einem (von mir erlebten)
VHDL-Kurs gelehrt.

Ich kann mich des Eindrucks nicht erwehren dass "in diesen"
Lehrinstituten Leute sitzen die sonst in der Industrie keine
Beschäftigung bekommen haben.

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


Lesenswert?

Lattice User schrieb:
> dann das fehlende Signal nachträglich einzutragen hat mit Mitdenken
> nichts zu tun.
Nein, sondern eher, ob es dort rein gehört und was es macht. Ich bin 
mir sicher, dass die (all)-Medaille (wie alle pauschalen 
Erleichterungen) zwei Seiten hat...

VHDLogiker schrieb:
> Daniel K. schrieb:
>> Bisher habe ich es so verstanden, dass in die Liste alle Signale
>> eingetragen werden, die sich innerhalb des process Blocks ändern.
> Man glaubt es nicht, aber genau das wird in einem (von mir erlebten)
> VHDL-Kurs gelehrt.
Da hat aber einer grundsätzlich was nicht verstanden oder kann es nicht 
vermitteln.
Nochmal die Kurzform: es müssen alle Signale rein, die eine 
Neuberechnung des Prozesses erfordern.
Und es müssten auch Variablen rein, wenn sie speichernd sind (Lesen 
vor dem ersten Schreiben im Prozess) und eine Neuberechnung erforderlich 
machen. Aber leider können Variablen nicht in die Liste aufgenommen 
werden...

Lattice User schrieb:
> Ich bezweifle dass die Regel "Jeder Prozess mit (all)!" wirklich gilt.
Nein, es ist ja keine Regel aus dem Standard, sondern eine persönliche 
Regel, die man selbst mit sich ausmacht, wie Da Dieter im 
Beitrag "Re: Sensitivity List" eben "einfach und 
überall" einen Prozess seit VHDL 2008 so schreibt.

Da erscheint mir das unäre AND und das unäre OR schon sinnvoller. 
Insbesondere, weil man es auch auf Teilvektoren anwenden kann:
1
enable <= (and addr(12 downto 5)) and (or addr(4 downto 0));
Wobei man das mit dem reduce Package natürlich auch einfach so schreiben 
könnte:
1
enable <= '1' when and_reduce(addr(12 downto 5)) and or_reduce(addr(4 downto 0));

von FPGA-Neuling (Gast)


Lesenswert?

VHDLogiker schrieb:
> Daniel K. schrieb:
>> Bisher habe ich es so verstanden, dass in die Liste alle Signale
>> eingetragen werden, die sich innerhalb des process Blocks ändern.
>
> Man glaubt es nicht, aber genau das wird in einem (von mir erlebten)
> VHDL-Kurs gelehrt.
Das verstehe ich nicht. Warum ist das nicht so?
Wenn das Signal sich nicht ändert, muss der process doch auch nicht 
ausgelöst werden?

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


Lesenswert?

FPGA-Neuling schrieb im Beitrag #4133004:
>>> dass in die Liste alle Signale
>>> eingetragen werden, die sich innerhalb des process Blocks ändern.
>> Man glaubt es nicht, aber genau das wird in einem (von mir erlebten)
>> VHDL-Kurs gelehrt.
> Das verstehe ich nicht. Warum ist das nicht so?
Es müssen nicht alle die Signale eingetragen werden, die sich ändern, 
sondern alle die, die eine Neuberechnung des Prozesses nötig machen.

Hier müssen z.B. a und b nicht in die Sensitivliste, obwohl sie sich 
ändern können:
1
 process (d,e,f) begin
2
   a <= d+e;
3
   b <= f+3;
4
 end process;

Bei einem komplett synchronen Prozess muss also sogar "nur" der Takt in 
die Sensitivliste...
1
 process (clk) begin
2
   if rising_edge(clk) then
3
     a <= d+e;
4
     b <= f+3;
5
   end if;
6
 end process;

> Wenn das Signal sich nicht ändert, muss der process doch auch nicht
> ausgelöst werden?
Richtig. Wobei "ausgelöst" eine arg unglückliche Wortwahl ist, "neu 
berechnet" wäre korrekt...

: Bearbeitet durch Moderator
von Klakx (Gast)


Lesenswert?

Die process (all) Geschichte ist interessant, jedoch nur wenn man einen 
schlauen Compiler hat. Sonst rennt der Simulator immer in den process 
was viel Rechenzeit brauch.

Im asic flow fallen die fehlenden sensitivities auf. Spätestens im lint 
Check oder eher in der Synthese..

von Klaus F. (kfalser)


Lesenswert?

Da Dieter schrieb:
> Oder man ist auf der Höhe der Zeit* und schreibt einfach und überall:
1
 process(all)
2
 begin ...
>
> *aktueller VHDL Standard ist VHDL2008

Auf den ersten Blick mag das ja angenehm sein, aber für den 
Simulator-Hersteller (oder vielleicht sogar für die Performance der 
Simulation) der reinste Horror.
Beispiel die Beschreibung eines synchronen FF:
1
 process(all)
2
 begin
3
   if reset = '1' then
4
     q <= '0';
5
   elsif rising_edge(clk) then 
6
     q <= d; 
7
   end if;     
8
 end

In diesem Fall sind die Signale clk, reset, d involviert.
Der Prozess muss aber nur ausgeführt werden, wenn sich clk und reset 
ändern.
Wird der Prozess ausgeführt, weil sich d ändert, ist die Berechnung 
unnötig und verlangsamt die Simulation.

Bei einem asynchronen FF
1
 process(all)
2
 begin
3
   if rising_edge(clk) then 
4
     if reset = '1' then
5
        q <= '0';
6
     else 
7
       q <= d;
8
     endif; 
9
   end if;     
10
 end

ist die Berechnung sogar bei Änderung von reset unnötig.

Möglicherweise machen die Simulator-Hersteller irgendwelche Analysen um 
zu erkennen, welche Signale wirklich eine Neuberechnung notwendig 
machen, aber ob das so einfach ist...?

Ich würde weiterhin bei einem getakteten Prozess clk (und ev. reset) 
hinschreiben, das 'all' würde ich für große kombinatorische Prozesse 
reservieren.
clk und all haben übrigens gleich viel Buchstaben, man spart eh nicht 
viel :-)

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


Lesenswert?

Klaus Falser schrieb:
> für den Simulator-Hersteller (oder vielleicht sogar für die Performance
> der Simulation) der reinste Horror.
Ich vermute, dass der Compiler zwischenzeitlich durchaus so schlau ist, 
dass er solche simple (Un-)Abhängigkeiten erkennt und Redundanzen 
entfernen kann.

> Möglicherweise machen die Simulator-Hersteller irgendwelche Analysen um
> zu erkennen, welche Signale wirklich eine Neuberechnung notwendig
> machen, aber ob das so einfach ist...?
Die Synthesizer machen das schon lange: du kannst eine unvollständige 
oder komplett falsche Sensitivliste hinschreiben, dann macht dich der 
Synthesizer freundlich drauf aufmerksam, dass die Liste unvollständig 
ist und deshalb die Simulation nicht mehr zur Hardware passt. Es ist 
naheliegend, dass die Simulatoren das auch können könnten...

von Klaus F. (kfalser)


Lesenswert?

Lothar Miller schrieb:
> Die Synthesizer machen das schon lange: du kannst eine unvollständige
> oder komplett falsche Sensitivliste hinschreiben, dann macht dich der
> Synthesizer freundlich drauf aufmerksam, dass die Liste unvollständig
> ist und deshalb die Simulation nicht mehr zur Hardware passt. Es ist
> naheliegend, dass die Simulatoren das auch können könnten...

Die Synthesehersteller haben es einfacher.
Die brauchen nur nur bestimmte, relativ einfache Strukturen erkennen.
1
 process(all)
2
 begin
3
   if reset = '1' then
4
     q <= '0';
5
   elsif rising_edge(clk) then 
6
     q <= d; 
7
   end if;     
8
 end

Im Simulator hat man jede Freiheit.
1
 process(all)
2
 begin
3
   if (sel = '1') then 
4
      if rising_edge(clk1) then 
5
         q <= d1; 
6
      end if;
7
   else 
8
     if rising_edge(clk2) then 
9
         q <= d2; 
10
      end if;
11
   end if;     
12
 end

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.