Forum: FPGA, VHDL & Co. Vergleich von 2 code Varianten


von Martin (Gast)


Lesenswert?

Hallo zusammen,

1)besteht ein Unterschied im Verhalten bei der Simulation?
2)besteht ein Unterschied im Verhalten bei der Synthese?

ein ziemlich bekanntes Pattern bei FSM ist im Code abgebildet ...
1
  A:process
2
  begin
3
    wait until rising_edge(clk);
4
    current_state <= next_state;
5
  end process;
6
7
  B:process(clk, next_state)
8
  begin
9
                if rising_edge(clk) then
10
        current_state <= next_state;
11
                end if;
12
  end process;

zu 1 würde ich meinen, dass A process nicht getriggert wird,
wenn next_state sich ändert. Allerdings wird B process zwar getriggert
auf events auf dem next_state Signal, aber da es im if rising_edge(clk)
steht quasi im Sand verläuft und nichts bewirkt.
Daher würde ich sagen, dass beides in der Simulation dasselbe
Verhalten zeigt.

Übrigens wenn ich next_state nicht in der sensitivity list vom
process B eintragen würde, sollte es an der Simulation auch nichts
ändern. Man liest ja in Büchern immer, dass alle gelesenen Signale
in die sensitivity list gehören, damit die kombinatorische Logik
synthetisiert wird.

gruss

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


Lesenswert?

1
  B:process(clk, next_state)
2
  begin
3
     if rising_edge(clk) then
4
        current_state <= next_state;
5
     end if;
6
  end process;
ist überbestimmt. Der Prozess wird für die Simulation bei einer Änderung 
von next_state zwar aufgerufen, weil aber die if-Bedingung nicht erfüllt 
ist sofort wieder beendet.

Korrekt wäre
1
  B:process(clk)
2
  begin
3
     if rising_edge(clk) then
4
        current_state <= next_state;
5
     end if;
6
  end process;
und dann ist das Verhalten wieder gleich.

EDIT:
> damit die kombinatorische Logik synthetisiert wird.
Die Synthese schert sich einen feuchten Kehrricht um die Sens-List. Du 
wirst nur freundlich darauf hingewiesen, dass da Signale fehlen, die 
automatisch hinzugefügt werden.
Die Simulation braucht aber die Signale in der Sens-List, weil sie 
darauf die Berechnung des Prozesses triggert.
Und so kann es leicht sein, dass du in kombinatorischen Prozessen bei 
unvollständiger Liste Unterschiede zwischen Simulation und Realität 
siehst :-o

von Morin (Gast)


Lesenswert?

> Übrigens wenn ich next_state nicht in der sensitivity list vom
> process B eintragen würde, sollte es an der Simulation auch nichts
> ändern. Man liest ja in Büchern immer, dass alle gelesenen Signale
> in die sensitivity list gehören, damit die kombinatorische Logik
> synthetisiert wird.

Das ist so nicht ganz korrekt, aber auch nicht ganz falsch. Erstmal: 
VHDL definiert eine klare Bedeutung von sens. Lists, die auch in der 
Simulation korrekt wiedergegeben wird.

Die Synthese von kombinatorischen Prozessen dagegen weicht u.U. 
erheblich vom "korrekten" Verhalten ab: Die endgültige Synthese kann 
nur solche kombinatorischen Prozesse ab, in der alle Signale in der SL 
stehen, weil sich die Zielhardware derart verhält (z.B. die LUTs in 
FPGAs). Deshalb werden bei der Analyse deines VHDL-Codes "fehlende" 
Signale in die SL eingetragen. Weil das im Prinzip eine stillschweigende 
Änderung deines Codes ist, gibt es eine warning, um dich darauf 
aufmerksam zu machen.

von Sven P. (Gast)


Lesenswert?

War das nich so, dass das ganze WAIT und AFTER etc. nur in der 
Simulation funktioniert?

von Marcus H. (mharnisch) Benutzerseite


Lesenswert?

Sven Pauli wrote:
> War das nich so, dass das ganze WAIT und AFTER etc. nur in der
> Simulation funktioniert?

Nein, nicht "das ganze".

Gruß
Marcus
http://www.doulos.com/

von Martin (Gast)


Lesenswert?

[vhdl]
  B:process(clk, next_state)
  begin
     if rising_edge(clk) then
        current_state <= next_state;
     end if;
  end process;
[/vhdl
]
>ist überbestimmt. Der Prozess wird für die Simulation bei einer Änderung
>von next_state zwar aufgerufen, weil aber die if-Bedingung nicht erfüllt
>ist sofort wieder beendet.

das ist quasi ein HDL Analogon (wenn man es mal breit auslegt)
zur einer reinen Softwarefunktion bei der ein Parameter intern
nicht benutzt wird.

allerdings würde ich dennoch next_state drin lassen.
oder verlangsamt sich die Simulation dadurch erheblich?
immerhin dürfte next_state im Vergleich zum clk weniger
events haben.

in letzter Zeit tendiere ich für die Simulation und Synthese
zur Variante A

gruss

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


Angehängte Dateien:

Lesenswert?

@ Morin
> Die endgültige Synthese kann nur solche kombinatorischen Prozesse ab,
> in der alle Signale in der SL stehen, weil sich die Zielhardware
> derart verhält (z.B. die LUTs in FPGAs).
Nein, das stimmt so nicht.

Der Synthese ist die Sensitivity-List schnurzegal. Die macht das 
Design so, wie es in dem Prozess beschrieben ist. Bei fehlenden Signalen 
gibt es bestenfalls noch ein paar Warnungen zum Thema "Es fehlen Signale 
in der Sens-List".

Die Simulation braucht in einem kombinatorischen Prozess alle 
Signale, die eine Änderung eines anderen Signals bewirken. Denn sonst 
wird der Prozess manchmal einfach nicht durchgerechnet.
In einem getakteten Prozess können sich Ausgangswerte nur dann ändern, 
wenn sich der Takt ändert. Deshalb muß da auch kein anderes Signal in 
die Liste.

Und dazu ein kleines Beispiel:
1
library IEEE;
2
use IEEE.STD_LOGIC_1164.ALL;
3
use IEEE.STD_LOGIC_ARITH.ALL;
4
use IEEE.STD_LOGIC_UNSIGNED.ALL;
5
6
entity abcxy is
7
    Port ( a : in  STD_LOGIC;
8
           b : in  STD_LOGIC;
9
           c : in  STD_LOGIC;
10
           x : out  STD_LOGIC;
11
           y : out  STD_LOGIC);
12
end abcxy;
13
14
architecture Behavioral of abcxy is
15
begin
16
  process(a)  -- a ist unnötig, aber eigentlich nötig: b und c
17
  begin
18
     if rising_edge(c) then
19
        x <= a;
20
     end if;
21
     y <= b;
22
  end process;
23
end Behavioral;

Die Synthese gibt ein paar Warnungen:
1
Analyzing Entity <abcxy> in library <work> (Architecture <Behavioral>).
2
WARNING:Xst:819 - "D:/Projekte/FPGA/RegVar/RegVar.vhd" line 19: The following signals are missing in the process sensitivity list:
3
   c.
4
WARNING:Xst:819 - "D:/Projekte/FPGA/RegVar/RegVar.vhd" line 17: The following signals are missing in the process sensitivity list:
5
   b.
6
Entity <abcxy> analyzed. Unit <abcxy> generated.

Macht aber alles so, wie ich es wollte:
getaktetes a  und  kombinatorisches b  (Bild: RTL-Schematics).



@  Martin (Gast)
> allerdings würde ich dennoch next_state drin lassen.
Ich nicht, das macht die Sache nur unübersichtlich.

> in letzter Zeit tendiere ich für die Simulation und Synthese
> zur Variante A
Ich auch, dann wird es garantiert ein getakteter Prozess.

von Morin (Gast)


Lesenswert?

@Lothar
> Nein, das stimmt so nicht.
>
> Der Synthese ist die Sensitivity-List schnurzegal. Die macht das
> Design so, wie es in dem Prozess beschrieben ist. Bei fehlenden Signalen
> gibt es bestenfalls noch ein paar Warnungen zum Thema "Es fehlen Signale
> in der Sens-List".

Ich glaube, da gibt es ein Mißverständnis. Was du meinst ist, dass das 
konkrete Syntheseprogramm die SL einfach ignoriert, und da stimme ich 
dir auch zu. Was ich meinte war, dass das Syntheseprogramm ein Ergebnis 
produziert, welches einer SL entspricht, in der genau alle 
Eingangssignale vorkommen, was formal einer Änderung der SL entspricht.

Das sind letztendlich nur zwei verschiedene Sichtweisen des 
Syntheseprogramms: Konkrete Arbeitsweise des Codes oder Verhalten lt. 
VHDL-Standard. Ich muss aber zugeben, dass deine Beschreibung einfacher 
zu verstehen ist :/

@Martin
> allerdings würde ich dennoch next_state drin lassen.
> oder verlangsamt sich die Simulation dadurch erheblich?
> immerhin dürfte next_state im Vergleich zum clk weniger
> events haben.

Das kommt drauf an, wie oft sich next_state ändert und wie es berechnet 
wird. Wenn du überall unnötige Signale mit in die SL nimmst, kann sich 
das schon auswirken. Und wenn diese unnötigen Signale kombinatorisch 
berechnet werden, am besten noch mit vielen Einganssignalen, dann 
bekommst du simulierte Glitches, die jedesmal für nix den Prozess 
anlaufen lassen.

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.