Forum: FPGA, VHDL & Co. Force auf records anwenden - Modelsim VHDL


von Matthias (Gast)


Lesenswert?

Hallo Forum,
Ich probiere, meine State Machine vernuenftig durchzutesten. Die State 
Machine selbst ist als Typ definiert:
1
type T_AUTO_GATING_STATES is
2
(
3
state1,
4
state2,
5
state3,
6
state4

Bei der Implementierung der State Machine ist es ja nunmal von vorteil, 
statt nur der 4 definierten Faelle auch alle undefinierten Faelle 
abzufangen, durch Verwendung des "when others =>" (im falle eines case).

Nun die Frage: Ich will natuerlich testen dass die State machine sich 
vorschriftsmaessig wieder faengt wenn sie im OTHERS state ist, 
allerdings kann ich diesen Fehlerfall ja schlecht herbeisimulieren. Ich 
dachte daran, in Modelsim via FORCE die state machine auf einen nicht 
definierten Zustand zu setzen, was aber scheinbar nicht wirklich 
hinhaut. Ich dachte an sowas wie
force sim:/top_level/entity/sub_entity/signal_of_state_machine others 
100 ms
sodass Modelsim die state machine nach 100 ms Simulation eben in 
besagten OTHERS zustand zwingt, was aber nicht geht, da
Error: (vsim-4026) Value "others" does not represent a literal of the 
enumeration type.

Hat da jemand eine Idee wie man das machen kann?
Danke

von PittyJ (Gast)


Lesenswert?

Ich weiss nicht, ob das geht.
Ich hatte mal den Fall, da kam der State wirklich in einen 
"Others"-Fall.
Das kam durch Metastabilität am Eingang, den ich nicht sauber abgefangen 
hatte.
Das System kam dann aber nie wieder aus dem "Others"-Fall heraus, trotz 
einer
State <= Reset
Anweisung.

Von daher bin ich sehr vorsichtig mit dem when others Fall, weil der 
nicht so funktioniert hat, wie z.B. der switch() default: in C

Ich meine auch, man kann es so nicht testen.


Bei meinem Problem damals gab es sogar Unterschiede, wenn ich das für 
eine Altera und einen Xilinx (jeweils mit den Herstellertools) 
synthetisiert habe.

von abc (Gast)


Lesenswert?

bsp: deine Statemachine würde one-hot codiert werden bei der Synthese.

dann müsste es für alle 12 nichtgenutzten Fälle eine Schaltung geben die 
wieder resettet.

Das wird meines Wissens nach aber nicht automatisch synthetisiert, wenn 
dieser Zustand nicht auch irgentwo erreicht wird.

Stattdessen sind dann 2 Zustände aktiv und man kann nur hoffen das sich 
dies wieder selbst fängt.


Würde mich aber auch interessieren wie man den Fall testen kann, vor 
allem jedoch in der Hardware.

von Klaus F. (kfalser)


Lesenswert?

Matthias schrieb:
> Bei der Implementierung der State Machine ist es ja nunmal von vorteil,
> statt nur der 4 definierten Faelle auch alle undefinierten Faelle
> abzufangen, durch Verwendung des "when others =>" (im falle eines case).

Du verwechselt Modell und Implementierung.
Bei der Simulation mit ModelSim kann eine Variable vom Type 
T_AUTO_GATING_STATES nur genau einen dieser 4 Zustände annehmen, es gibt 
also wirklich keine others.
Wird das ganze in Hardware umgesetzt, dann macht die Synthese daraus 
einen Vektor von Bits. Je nach Codierung, die der Compiler verwendet 
(One-Hot oder Binary) können das 4 oder 2 bits sein.
Im Falle von Binary gibt es in diesem Fall wieder keine überflüssigen 
Codes, weil man mit 2 Bit genau 4 Zustände abbilden kann. Hättest Du 5 
States, dann schaut die Welt schon anders aus ...
Wählst Du oder der Compiler One-hot Kodierung, dann wird der 
Zustandsvektor auf 4 Bits abgebildet, in diesem Fall gibt es ungültige 
Zustände im implementierten System.

Du kannst dies alles aber nicht mit ModelSim vorher testen, weil dein 
Modell noch nichts von der späteren Umsetzung weiss.

Ein sicheres Verhalten der implementierten FSM kann man nur erreichen, 
indem man den Compiler durch Optionen anweist, zusätzliche Logik zum 
Erkennen ungültiger Zustände zu generieren und dann einen sicheren State 
anzuspringen.

PS : Das ist nicht das selbe, wie das Einfügen eines when others Pfades.
Auch für den Compiler hat Dein Type nur genau 4 Zustände.

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


Lesenswert?


von Matthias (Gast)


Lesenswert?

Klaus und Lothar:
Vielen Dank fuer die Erklaerung. Das hab ich noch nicht gewusst, klingt 
soweit aber logisch. Dann kann ich mir das in Modelsim ja sparen und 
fuer die Synthese schau ich mir dann die entsprechenden Texte an.
Vielen dank!

von Ratgeber (Gast)


Lesenswert?

Wenn es um die Simulation eines Störfalls geht, könnte man von einer 
anderen Stelle das Signal fremdsetzen, um ein UUUU / XXXXX zu 
generieren, sodass sich die fsm verlaufen kann.

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


Lesenswert?

Ratgeber schrieb:
> sodass sich die fsm verlaufen kann.
Eine FSM mit x Zuständen, die alle mit case abgefragt werden, kann sich 
in der Simulation nicht verlaufen. Bzw wird sie sich in der Simulation 
garantiert anders "falsch verhalten" als in der Realität. Denn die 
Simualtion kümmert sich nicht darum, WIE die FSM realisiert wird (One 
Hot, Gray, Binär, Sicher...).
Von daher ist es m.E. eigentlich sinnlos, einen Fall zu simulieren, der 
nie auftreten kann...

von Fpgakuechle K. (Gast)


Lesenswert?

abc schrieb:
> bsp: deine Statemachine würde one-hot codiert werden bei der Synthese.
>
...
> Würde mich aber auch interessieren wie man den Fall testen kann, vor
> allem jedoch in der Hardware.

Post-synthesise: Simulation der backannotierten Synthese Netzliste. Der 
projektnavigator von Xilinx sollte im Process-fenster die Option 
"Post-synhtesis simulation" anbieten.
Backannotierung ist hier kurz erklärt:
 http://www.xilinx.com/itp/data/alliance/dev/dev15_1.htm

MfG,

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.