www.mikrocontroller.net

Forum: FPGA, VHDL & Co. Problem mit modelsim


Autor: fresh (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo
Habe ein kleines Problem beim Simulieren! Es kommt immer folgende Fehler 
Meldung:

# ** Error: (vsim-3601) Iteration limit reached at time 0 ps.

Ich weis auch was es heißt aber ich sehe den Fehler im Code nicht! 
Vielleicht sieht ihn ja jemand von euch!

Danke im vorhinein!

MFG Fresh

entity transmit_unit is

  port (
    clk        : in  std_logic;
    reset      : in  std_logic;
    data_in    : in  transmit_data;
    enable_out : out std_logic := '1';
    data_out   : out std_logic);

end transmit_unit;


architecture twoproc of transmit_unit is

  signal r, rin      : transmit_reg_type;
  signal tmp_data_in : std_logic := '1';
begin  -- twoproc


  -- purpose: combinatorial process of the two-process design
  -- type   : combinational
  -- inputs : data_in, r
  -- outputs: data_out, rin
  comb: process(data_in.transmit_en, r)
    variable tmp      : transmit_reg_type;
    variable databit  : std_logic := '0';
    variable prebit   : std_logic := '0';
  begin  -- process comb
    tmp := r;
    if data_in.transmit_en = '1' then
      if (tmp.precount = precount_value) then
        databit := data_in.data;
        --look if bit Stuffing is enable
        if (data_in.bit_stuff_en = '1') then
          --send the data or the stuffing bit
          if(tmp.bitnumber = conv_std_logic_vector(6,3)) then
            databit := not prebit;
            enable_out <= '1';
            tmp.bitnumber := (others => '0');
          else
            prebit := databit;
          end if;
          --compare if the the prebit and the databit are the same
          if (databit = prebit) then
            tmp.bitnumber := tmp.bitnumber + 1;
          else
            tmp.bitnumber := (others => '0');
          end if;
          --control the bitnumber if it reached the value 5
          if (tmp.bitnumber = bitstuffing_value) then
            enable_out <= '0';
            tmp.bitnumber := conv_std_logic_vector(6,3);
          end if;
        end if;

        tmp_data_in <= databit;
        tmp.precount := (others => '0');
      else
        tmp.precount := tmp.precount + 1;
      end if;
    else
      tmp.precount := precount_value;
    end if;
    rin <= tmp;
  end process comb;

  data_out <= tmp_data_in;

  -- purpose: sequential process or the two-process design
  -- type   : sequential
  -- inputs : clk, reset, rin
  -- outputs: r
  seq: process (clk, reset)
  begin  -- process seq
    if reset = '0' then                 -- asynchronous reset (active 
low)
      r.bitnumber <= (others => '0');
      r.precount  <= precount_value;
    elsif clk'event and clk = '1' then  -- rising clock edge
      r <= rin;
    end if;
  end process seq;

end twoproc;

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ fresh (Gast)

>Habe ein kleines Problem beim Simulieren! Es kommt immer folgende Fehler
>Meldung:

># ** Error: (vsim-3601) Iteration limit reached at time 0 ps.

Uhhh, das sieht komisch aus. Diese tmp.irgendwas Scheibweise kenn ich 
gar nicht. Du kommst aus der prgrammierer-Ecke, nicht wahr?

Ich sag mal, für das Problem brauch man keine Variablen. Machs mal ohne. 
Und lass diese komsichen tmp.irgendwas Dinger weg. Normale Signale tuns 
locker.

MFG
Falk

Autor: Roger Steiner (edge)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Falk Brunner

> Uhhh, das sieht komisch aus. Diese tmp.irgendwas Scheibweise kenn ich
> gar nicht. Du kommst aus der prgrammierer-Ecke, nicht wahr?

und was du nicht kennst ist schlecht?

> Und lass diese komsichen tmp.irgendwas Dinger weg. Normale Signale tuns
> locker.

tmp wird wohl ein record sein. ideal um Signale zu gliedern => code wird 
uebersichtlicher und weniger schreibaufwand.

Cheers, Roger

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Roger Steiner (edge)

>> Uhhh, das sieht komisch aus. Diese tmp.irgendwas Scheibweise kenn ich
>> gar nicht. Du kommst aus der prgrammierer-Ecke, nicht wahr?

>und was du nicht kennst ist schlecht?

Was der Bauer nicht kennt, frisst er nciht. ;-)

>tmp wird wohl ein record sein. ideal um Signale zu gliedern => code wird
>uebersichtlicher und weniger schreibaufwand.

Schon klar, hab ich aber bei VHDL noch nie gesehen und auch nie was 
drüber gelesen. Modelsim scheint es auch nicht zu bekommen, obwohl es 
das kennt. Wahrscheinlich kommte es in eine endlose Rekursion beim 
Durchhangeln der Records. Und übersichtlich die DER Code weiss Gott 
nicht.

MFg
Falk

Autor: damicha (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

@fresh:
Da hat mal einer schön die Zwei Prozess Methode benutzt! Du hast Dir 
aber ne ganz Hand voll Latche gebaut. Z.B.: tmp_data_in wird nur in 
einem der if-else Zweige gesetzt. Entweder Du weißt überall zu oder du 
setzt einen Default-Wert.

Dein Problem ist aber wahrscheinlich ein anderes.
Poste doch mal die Testbench, vieleicht gibt es dort ein Zweig in einem 
der Prozesse, der kein wait oder wait until oder ähnliches enthält. Da 
kann es dann schnell mal zu einem Loop kommen.

Gruß DaMicha.

Autor: fresh (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo
Ich habe in der Testbench mal nur den ClockProcess drinnen aber auch 
dann kommt der Fehler! Nehme nicht an das an diesen Prozess hängt oder?

 clk: process
  begin  -- process clk
    clk_i <= '0';
    wait for 25ns;
    clk_i <= '1';
    wait for 25ns;
  end process clk;

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das passt schon.

Autor: fresh (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Beim Process für den Takt hat bei den wait for Anweisungen der 
Abstand zwischen 25 und ns gefehlt! Aber der hat leider mein 
ursprüngliches Problem nicht gelöst! Habe nun den ausdruck enable_out <= 
'1'; aus der if schleife genommen damit ein latch weniger entsteht! 
Sollte man zum latcher vermeiden solche konstrukte:

if (test = '1') then
   tmp := '1';
else
   tmp := tmp;
end if;

verwenden oder kann man den ausdruck im else zweig weglassen?

comb: process(data_in.transmit_en, r)
    variable tmp      : transmit_reg_type;
    variable databit  : std_logic := '0';
    variable prebit   : std_logic := '0';
  begin  -- process comb
    tmp := r;
    if data_in.transmit_en = '1' then
      if (tmp.precount = precount_value) then
        databit := data_in.data;
        --look if bit Stuffing is enable
        if (data_in.bit_stuff_en = '1') then
          enable_out <= '1';
          --send the data or the stuffing bit
          if(tmp.bitnumber = conv_std_logic_vector(6,3)) then
            databit := not prebit;
            tmp.bitnumber := (others => '0');
          else
            tmp.bitnumber := tmp.bitnumber;
            prebit := databit;
          end if;
          --compare if the the prebit and the databit are the same
          if (databit = prebit) then
            tmp.bitnumber := tmp.bitnumber + 1;
          else
            tmp.bitnumber := (others => '0');
          end if;
          --control the bitnumber if it reached the value 5
          if (tmp.bitnumber = bitstuffing_value) then
            enable_out <= '0';
            tmp.bitnumber := conv_std_logic_vector(6,3);
          end if;
        end if;

        tmp_data_in <= databit;
        tmp.precount := (others => '0');
      else
        tmp.precount := tmp.precount + 1;
      end if;
    else
      tmp.precount := precount_value;
    end if;
    rin <= tmp;

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ fresh (Gast)

>Hallo Beim Process für den Takt hat bei den wait for Anweisungen der
>Abstand zwischen 25 und ns gefehlt!

Da meckert Modelsim aber vorher drüber.

>ursprüngliches Problem nicht gelöst! Habe nun den ausdruck enable_out <=
>'1'; aus der if schleife genommen damit ein latch weniger entsteht!

Es dürfen KEINE Latches entstehen, sonst schiesst du dir ins Knie.

>Sollte man zum latcher vermeiden solche konstrukte:

>if (test = '1') then
>   tmp := '1';
>else
>   tmp := tmp;
>end if;

Kann man machen.

>verwenden oder kann man den ausdruck im else zweig weglassen?

Wenn man, was ich für sinnvoll halte, das alles gleich in einen 
getakteten Prozess schreibt. Ist genauso übersichtlich, und Latches 
entstehen auf keinen Fall. Hat auch keine negativen Auswirkungen auf die 
Geschwindigkeit, die Diskussionen darüber in der Vergangenheit halte ich 
für eine Legende.

MFG
Falk

Autor: fresh (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo ich bins gleich nochmal!

Habe jetzt folgendes getestet und bekomme da auch diesen fehler mit den 
iteration limit!

comb: process(data_in.transmit_en, r)
    variable tmp      : transmit_reg_type;
    variable databit  : std_logic := '0';
    variable prebit   : std_logic := '0';
  begin  -- process comb
    tmp := r;

    rin <= tmp;
  end process comb;

  data_out <= tmp_data_in;

  seq: process (clk, reset)
  begin  -- process seq
    if reset = '0' then                 -- asynchronous reset (active 
low)
      r.bitnumber <= (others => '0');
      r.precount  <= precount_value;
    elsif clk'event and clk = '1' then  -- rising clock edge
      r <= rin;
    end if;
  end process seq;

und in der testbench:

  clk: process
  begin  -- process clk
    clk_i <= '0';
    wait for 25 ns;
    clk_i <= '1';
    wait for 25 ns;
  end process clk;

  reset_i <= '1';

wo kann da noch der Fehler aufretten?

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ fresh (Gast)

>Habe jetzt folgendes getestet und bekomme da auch diesen fehler mit den
>iteration limit!

Dein Stil ist und bleibt komisch. Warum nciht ganz einfach so?

comb: process(clk)
    variable tmp      : transmit_reg_type;
    variable databit  : std_logic := '0';
    variable prebit   : std_logic := '0';
  begin  -- process comb
    elsif clk'event and clk = '1' then  -- rising clock edge

    tmp := r;
  
     -- Berechnung hier rein

     r <= tmp;
  
     data_out <= tmp_data_in;


    end if;
  end process;

und in der testbench:

  clk: process
  begin  -- process clk
    clk_i <= '0';
    wait for 25 ns;
    clk_i <= '1';
    wait for 25 ns;
  end process clk;

  reset_i <= '1';

MFG
Falk

Autor: fresh (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja das wäre eine einfachere Lösung aber ich habe als Vorgabe das das 
ganze im 2 Prozess Design zu implementieren ist. aber das darf doch im 
großen und ganzen keinen wirklichen unterschied machen!

MFG Harald

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert
fresh wrote:
> if (test = '1') then
>    tmp := '1';
> else
>    tmp := tmp;
> end if;
>
> verwenden oder kann man den ausdruck im else zweig weglassen?

Der else-Zweig hat keine Auswirkung. Latches kannst du nur vermeiden 
indem du den Prozess entweder taktest oder so schreibst dass überhaupt 
keine speichernden Elemente benötigt werden.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ fresh (Gast)

>Ja das wäre eine einfachere Lösung aber ich habe als Vorgabe das das
>ganze im 2 Prozess Design zu implementieren ist.

Von wem? Prof? Akademiker . . .

>aber das darf doch im
>großen und ganzen keinen wirklichen unterschied machen!

Nein. Wenn du im kombinatorischen Prozess in JEDEM Zweig eine Zuweisung 
an JEDE Ausgangsvariable machst. Aber ich bleibe dabei. Schreibs mal 
einfach ohne diese Records und so weit wie möglich ohne Variablen hin.

MFG
Falk

Autor: FPGA-Jeck (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bringt modelsim den fehler bei jedem Code? Vielleicht ist ja das 
iteration limit zu niedrig (0 bis 10), üblich sind ein paar tausend. du 
kannst ja mal mit einem Beispiel von modelsim testen.

und vielleicht etwas spitzfindig.

wo wird clk_i aus deiner TB verwendet ?
clk: als label und signalname ist vielleicht unglücklich

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.