mikrocontroller.net

Forum: FPGA, VHDL & Co. INFO:Xst:2117 wie "add an 'INIT' attribute" zu state?


Autor: Martin Kohler (mkohler)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,
Beim Synthetisieren des folgenden Code-Abschnitts gibt mir XST immer 
folgende Info aus:
INFO:Xst:2117 - HDL ADVISOR - Mux Selector <current_state> of Case statement line 118 was re-encoded using one-hot encoding.
The case statement will be optimized (default statement optimization), but this optimization may lead to design initialization problems.
To ensure the design works safely, you can:
     - add an 'INIT' attribute on signal <current_state> (optimization is then done without any risk)
     - use the attribute 'signal_encoding user' to avoid onehot optimization
     - use the attribute 'safe_implementation yes' to force XST to perform a safe (but less efficient) optimization
Ich gehe davon aus, dass dies behoben werden sollte.

Hier nun also der Code-Abschnitt:
(stark zusammengekürzt, so ohne tieferen Sinn...)
    
    type state_type is (WAIT_ENABLE, WAIT_WINDOW_START, WAIT_MASK_START, WAIT_MASK_END, WAIT_WINDOW_END, WAIT_ENABLE_END );
    signal current_state                    : state_type := WAIT_ENABLE;
    signal next_state                       : state_type;

begin
    process(INT_CLK,INT_RESET)
    begin
        if INT_RESET = '1' then
            current_state   <= WAIT_ENABLE;
        elsif rising_edge(INT_CLK) then
            if READ_ENABLE = '1' then
                current_state <= next_state;
             else
                current_state <= WAIT_ENABLE;
            end if;
        end if;
    end process;

    -- state machine
    process (current_state, READ_ENABLE, WE_VALID_flag, WS_flag, MS_VALID_flag, MS_flag, ME_flag, WE_flag )
    begin
        -- Default-Werte, werden uebernommen wenn sonst nichts zutrifft, z.B. in IDLE
        BUSY_FLAG       <= '0';
        TRIGGER_FLAG    <= '0';
        next_state      <= WAIT_ENABLE;
        
        case current_state is
            when WAIT_ENABLE =>
                if READ_ENABLE = '1' then
                    next_state      <= WAIT_WINDOW_START;
                end if;
            when WAIT_WINDOW_START =>
                if WS_flag = '1' then
                    next_state      <= WAIT_WINDOW_END;
                end if;
            when WAIT_WINDOW_END =>
                if WE_flag = '1' then
                    next_state          <= WAIT_ENABLE_END;
            when WAIT_ENABLE_END =>
                if READ_ENABLE = '0' then
                    next_state          <= WAIT_ENABLE;
            when others =>   
                next_state <= WAIT_ENABLE;
        end case;
    end process;

In diesem Fred ging es ums gleiche Thema:
Beitrag "folgende  HDL ADVISOR  Anweisung ?"
Demzufolge hätte ich wohl kein Problem zu erwarten, da ich ja mit Reset 
arbeite.

In meinem Code habe ich aber dem current_state bereits einen Initialwert 
verpasst. Warum taucht die Info dann immer noch auf?
Weiss da jemand Rat?

Gruss, Martin Kohler

-----------------
Edit: Beitrag in der Breite reduziert, bessere Lesbarkeit...

Autor: Jan M. (mueschel)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nein, das brauchst du nicht zu beheben.

Er sagt ja nur, was die Wege sind, ein moegliches Problem zu vermeiden, 
nichts davon, dass diese Probleme auch wirklich auftreten.

Autor: Martin Kohler (mkohler)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
und wie >könnte< ich ich die Info vermeiden, falls ich das wollen täte?
Gibt es da trotzdem einen Weg?

Das INIT Statement habe ich ja hinzugefügt. Oder war das falsch:
    signal current_state                    : state_type := WAIT_ENABLE;

Gruss, Martin

Autor: Jan M. (mueschel)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich denke, diese Meldung tritt immer auf, wenn du dem Synthesizer die 
Implementierung frei stellst. Du kannst das zwar auch selbst festlegen 
(siehe Punkt 2 und 3 in der Meldung), aber das wuerde ich nicht machen.

Es handelt sich ja auch lediglich um ein Info, keine Warning, deswegen 
kannst du das getrost ignorieren.

Autor: Martin Kohler (mkohler)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich möchte daher ja auch den ersten Hinweis beachten und das INIT 
statement hinzufügen. Aber das klappt ja offenbar nicht ganz.

Wie genau ist das zu tun?

Ja, es ist nur eine Info. Aber das beantwortet leider meine Frage noch 
nicht.

Danke für die bisherigen Antworten!

Gruss, Martin

Autor: Martin Kohler (mkohler)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich komme nochmals auf die State Encoding Frage zurück, denn ich habe im 
Online-Tutorial auf www.vhdl-online.de in paar Angaben gefunden.

Ab dieser Seite: http://www.vhdl-online.de/tutorial/deutsch/t_222.htm 
und folgende wird das Codieren von case statements erklärt.

Ich habe momentan ja am ehesten die Variante nach Kapitel 4.5.5 mit 
One-Hot Encoding. Daraus folgt die Info wegen der "unsicheren" 
Statemaschine - genau gemäss dem Tutorial.

Macht es nun Sinn, die Variante "4.5.7 Hand Coding" umzusetzen oder 
macht das sowieso niemand?

Erfahrungen/Anregungen in dieser Sache? Codiert jemand die states "von 
Hand" oder verwendet ihr (wie ich) einen selbst definierten type?

Gruss, Martin

Autor: Jan M. (mueschel)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sowohl als auch:
Wenn man states mit guten Namen versehen kann, mache ich es. Manchmal 
gibt es aber auch state machines, die einfach nur irgendetwas 
abarbeiten, da nummeriere ich die states durch.
XST ist das reichlich egal, er waehlt in beiden Faellen das Encoding so, 
wie es am besten passt, solange das nicht in den Optionen explizit 
ausgeschaltet wird.

Autor: Martin Kohler (mkohler)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dann kriegst auch du stets deine "INFO:Xst:2117 - HDL ADVISOR - Mux 
Selector..." ?

Martin

Autor: Jan M. (mueschel)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja natuerlich. Die wirst du immer bekommen, wen du nicht "FSM Encoding 
Algorithm" auf "user" stellst.

Einen kleinen Vorteil hat die Kodierung per Hand: Man kann zum debuggen 
den momentanen Zustand der state machine einfach auf einen Ausgang legen 
und so im Betrieb beobachten.

Autor: Martin Kohler (mkohler)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Diese Möglichkeit erscheint mir bis jetzt auch recht sympathisch.
Allerdings: werden in der ModelSIM Simulation dann immer noch die state 
Names angezeigt oder die hart codierte Konstante?

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.