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


von Martin K. (mkohler)


Lesenswert?

Hallo zusammen,
Beim Synthetisieren des folgenden Code-Abschnitts gibt mir XST immer 
folgende Info aus:
1
INFO:Xst:2117 - HDL ADVISOR - Mux Selector <current_state> of Case statement line 118 was re-encoded using one-hot encoding.
2
The case statement will be optimized (default statement optimization), but this optimization may lead to design initialization problems.
3
To ensure the design works safely, you can:
4
     - add an 'INIT' attribute on signal <current_state> (optimization is then done without any risk)
5
     - use the attribute 'signal_encoding user' to avoid onehot optimization
6
     - 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...)
1
    
2
    type state_type is (WAIT_ENABLE, WAIT_WINDOW_START, WAIT_MASK_START, WAIT_MASK_END, WAIT_WINDOW_END, WAIT_ENABLE_END );
3
    signal current_state                    : state_type := WAIT_ENABLE;
4
    signal next_state                       : state_type;
5
6
begin
7
    process(INT_CLK,INT_RESET)
8
    begin
9
        if INT_RESET = '1' then
10
            current_state   <= WAIT_ENABLE;
11
        elsif rising_edge(INT_CLK) then
12
            if READ_ENABLE = '1' then
13
                current_state <= next_state;
14
             else
15
                current_state <= WAIT_ENABLE;
16
            end if;
17
        end if;
18
    end process;
19
20
    -- state machine
21
    process (current_state, READ_ENABLE, WE_VALID_flag, WS_flag, MS_VALID_flag, MS_flag, ME_flag, WE_flag )
22
    begin
23
        -- Default-Werte, werden uebernommen wenn sonst nichts zutrifft, z.B. in IDLE
24
        BUSY_FLAG       <= '0';
25
        TRIGGER_FLAG    <= '0';
26
        next_state      <= WAIT_ENABLE;
27
        
28
        case current_state is
29
            when WAIT_ENABLE =>
30
                if READ_ENABLE = '1' then
31
                    next_state      <= WAIT_WINDOW_START;
32
                end if;
33
            when WAIT_WINDOW_START =>
34
                if WS_flag = '1' then
35
                    next_state      <= WAIT_WINDOW_END;
36
                end if;
37
            when WAIT_WINDOW_END =>
38
                if WE_flag = '1' then
39
                    next_state          <= WAIT_ENABLE_END;
40
            when WAIT_ENABLE_END =>
41
                if READ_ENABLE = '0' then
42
                    next_state          <= WAIT_ENABLE;
43
            when others =>   
44
                next_state <= WAIT_ENABLE;
45
        end case;
46
    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...

von Jan M. (mueschel)


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.

von Martin K. (mkohler)


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:
1
    signal current_state                    : state_type := WAIT_ENABLE;

Gruss, Martin

von Jan M. (mueschel)


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.

von Martin K. (mkohler)


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

von Martin K. (mkohler)


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

von Jan M. (mueschel)


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.

von Martin K. (mkohler)


Lesenswert?

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

Martin

von Jan M. (mueschel)


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.

von Martin K. (mkohler)


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?

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.