Forum: FPGA, VHDL & Co. [Synth 8-403] loop limit (65538) exceeded


von Incanus (Gast)


Lesenswert?

Hallo Leute,
ich habe einen VHDL Code, der folgendes tun soll:
Er soll Zeilenweise auslesen soll.
Bisher hat der Code auch immer gut funktioniert, jetzt habe ich aber ein 
sehr großes File (~400.000 Zeilen) und da bekomme ich bei der Synthese 
den Error:
[Synth 8-403] loop limit (65538) exceeded .

Variablendeklaration:
1
VARIABLE c                  : character;
2
VARIABLE line_count         : natural := 0;
3
FILE  RamFile               : text;
4
VARIABLE  RamFileLine       : line;
5
VARIABLE  I                 : natural := 0;
6
VARIABLE  v_RAM             : RamType := (OTHERS => (OTHERS => g_init_value));
7
VARIABLE  v_hex_value       : std_logic_vector((4 * linelength) - 1 DOWNTO 0);
8
VARIABLE  v_bin_value       : std_logic_vector(linelength - 1 DOWNTO 0);
9
(g_hex           : boolean   := true --> generic)

Hier der Code:
1
        FOR c IN 0 TO line_count - 1 LOOP
2
            readline(RamFile, RamFileLine);
3
            -- hex is generic
4
            IF g_hex THEN
5
                    -- read hex values
6
                    hread(RamFileLine, v_hex_value);
7
                        v_RAM(I) := v_hex_value(g_width - 1 DOWNTO 0);
8
            ELSE
9
                    -- read bin values
10
                    read(RamFileLine, v_bin_value);
11
                    v_RAM(I)(linelength - 1 DOWNTO 0) := v_bin_value;
12
            END IF;
13
            I := I + 1;
14
        END LOOP;
Ich habe auch schon folgendes probiert:
1
VARIABLE c                  : integer  range 0 to 600000;
2
VARIABLE line_count        : natural range 0 to 600000;
Aber ich bekomme immer den Fehler loop limit (65538) exceeded.
Ich verstehe das nicht, da integer ja eigentlich 32 Bit haben, warum 
kann er dann nur 16 Bit nutzen ?

Viele Grüße & Vielen dank für die Hilfe.

von Duke Scarring (Gast)


Lesenswert?

Mit welcher Software synthetisierst Du?
Bei Xilinx-XST gibt es den Parameter '-loop_iteration_limit', aber der 
ist per Default viel klein als 2^16.

Als work-around könntest Du die große Schleife schachteln. Das ist zwar 
nicht wirklich schön, aber es soll ja funktionieren.

Duke

von Incanus (Gast)


Lesenswert?

Gestern habe ich es mit der Vivado 2014.1 probiert,
Google hat mir dann gesagt, dass das eventuell ein Fehler in Vivado ist 
(hier der Beitrag dazu: 
http://forums.xilinx.com/t5/Synthesis/Vivado-loop-iteration-limit/td-p/480698)
Heute habe ich Vivado 2014.4, bekomme aber den gleichen Fehler.

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


Lesenswert?

Incanus schrieb:
> Aber ich bekomme immer den Fehler loop limit (65538) exceeded.
Hört sich nach einer Endlosschleife an.

> FOR c IN 0 TO line_count - 1 LOOP
Welchen Wert hat line_count hier?

> da bekomme ich bei der Synthese den Error
Bei der Synthese? Soll da ein Ram initialisiert werden?

> Hier der Code:
Ich vermute, der Fehler ist ausserhalb des Codes zu finden...

Incanus schrieb:
> Google hat mir dann gesagt, dass das eventuell ein Fehler in Vivado ist
Ich sehe eher, dass das Problem auch in diesem Fall 40cm vor dem 
Bildschirm saß:
1
 the for loop is wrapping around and can never exit

von Incanus (Gast)


Lesenswert?

Lothar Miller schrieb:
>> FOR c IN 0 TO line_count - 1 LOOP
> Welchen Wert hat line_count hier?
Siehe oben, ca. 400.000.
>> da bekomme ich bei der Synthese den Error
> Bei der Synthese? Soll da ein Ram initialisiert werden?
Ja. Der Quellcode wurde bereits getestet und funktioniert auch, für 
entsprechend "kleine" Eingaben (getestet bis 20.000 Zeilen).

von Incanus (Gast)


Lesenswert?

Duke Scarring schrieb:
> Mit welcher Software synthetisierst Du?
> Bei Xilinx-XST gibt es den Parameter '-loop_iteration_limit', aber der
> ist per Default viel klein als 2^16.

Ich habe versucht, in der Xst des alten ISE-Projektes das Limit auf 
500.000 zu erhöhren, aber ohne Erfolg.
Eine entsprechende Eingabe in der Vivado Kommandozeile wirft den Fehler, 
das Vivado diesen Befehl nicht kennt.
Gibt es sonst noch irgendetwas, was ich tun kann, ausser die Schleife 
10x hinzuschreiben ?

von Sigi (Gast)


Lesenswert?

Versuchs mal statt mit FOR mit WHILE:

while i < whatever loop
...
end loop;

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.