Forum: FPGA, VHDL & Co. Bekomme Modelsim nicht in den Griff; Error: (vsim-3601)


von Maik R. (kiamur)


Lesenswert?

Hallo,

ich habe gestern angefangen mich mit Modelsim zu beschäftigen. Zuerst 
habe ich mal das Tutorial in der Modelsim Doku durchgearbeitet, wo ein 
Counter mit seiner testbensch getestet wird. Das hat funktioniert.

Jetzt wollte ich mal ein eigenes Modul testen. Ich nehme also das Modul, 
mache mir ein Modelsim Projekt, erstelle den Ordner work, kopiere dort 
das Modul hinein und erstelle eine Testbench. Anschließend wird alles 
kompiliert und mit der Testbench die Simulation gestartet.

Leider bekomme ich immer den Fehler
# ** Error: (vsim-3601) Iteration limit reached at time 0 ns.
# ** Note: (vsim-3602) Delays were truncated during elaboration of the 
design.

Ich habe herumgeforscht, und herausgefunden, dass ich irgendwo einen 
infinity loop habe, aber leider weiß ich nicht, was ich nun dagegen tun 
soll.

Hier ist mal das Modul und die Testbensch:
1
library ieee;
2
use ieee.std_logic_1164.all;
3
4
entity convert_2s_complement is
5
  port  (  clk      : in std_logic;
6
        in_binary  : in std_logic_vector(11 downto 0);
7
        out_2s_compl  : out std_logic_vector(11 downto 0));
8
end entity convert_2s_complement;
9
10
architecture convert_2s_complement_arch of convert_2s_complement is
11
12
begin
13
  process(clk)
14
  begin
15
    if(clk'event and clk = '1') then
16
        out_2s_compl <= not in_binary;
17
      --if(in_binary(11) = '1') then
18
      --  out_2s_compl <= '0' & in_binary(10 downto 0);
19
      --else
20
      --  out_2s_compl <= '1' & (not(in_binary(10 downto 0)) + 1);        
21
      --end if;
22
    end if;
23
  end process;
24
end architecture;
1
library ieee;
2
use ieee.std_logic_1164.all;
3
4
entity convert_2s_complement_test is
5
end convert_2s_complement_test;
6
7
architecture testbench of convert_2s_complement_test is
8
9
component convert_2s_complement
10
  port  (  clk      : in std_logic;
11
          in_binary  : in std_logic_vector(11 downto 0);
12
          out_2s_compl  : out std_logic_vector(11 downto 0));
13
end component;
14
15
signal bench_clk      : std_logic := '0';
16
signal bench_in_binary    : std_logic_vector(11 downto 0);
17
signal benchout_2s_compl  : std_logic_vector(11 downto 0);
18
19
begin
20
  C1: convert_2s_complement port map(clk => bench_clk, in_binary => bench_in_binary, out_2s_compl => benchout_2s_compl);
21
  
22
  CLOCK: process
23
  begin
24
    wait for 20 ns;
25
    bench_clk <= not bench_clk; 
26
  end process CLOCK;
27
  
28
  STIMULUS: process
29
  begin
30
    wait for 20 ns;
31
    bench_in_binary <= "100000000000";
32
    wait for 20 ns;
33
    bench_in_binary <= "000000000000";
34
    wait for 20 ns;
35
    bench_in_binary <= "011100011100";
36
    wait for 20 ns;
37
    bench_in_binary <= "111111111111";
38
  end process STIMULUS;
39
  
40
end testbench;

Kann das von euch einmal jemand "durchnudeln" und mir sagen, wo mein 
Fehler ist, damit ich endlich mal mit dem simulieren anfangen kann?!?

Vielen Dank und Gruß,
Maik

von Duke Scarring (Gast)


Angehängte Dateien:

Lesenswert?

1
vcom *.vhd
2
vsim work.convert_2s_complement_test
3
add wave *
4
run 500 ns

Funktioniert augenscheinlich so, wie es im Quelltext dasteht.

Duke

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


Lesenswert?

> Funktioniert augenscheinlich so, wie es im Quelltext dasteht.
Hätte ich auch erwartet...

@ Maik Ritter
Simulierst du die falsche Datei?

BTW:
Mir fällt auf, dass Änderungen am Takt bench_clk und die Änderung an 
bench_in_binary zeitgleich kommen. Das wird nicht deine Absicht sein. 
Zumindest jede zweite Zuweisung an bench_in_binary wird nicht 
verarbeitet werden. Du solltest die Taktfrequenz mindestens verdoppeln 
;-)

von Matthias (Gast)


Lesenswert?

Ich schätze mal dass die Zeitauslösung zu hoch ist, zumindet habe ich 
dieselbe Iteration Limit Fehlermeldung sobald ich mit Zeitauflösungen >= 
100 ns simuliere.

Übrigens: fehlt da fürs Zweierkomplement nicht noch das Inkrement?

LG
Matthias

von Klaus F. (kfalser)


Lesenswert?

> Ich nehme also das Modul, mache mir ein Modelsim Projekt, erstelle den
> Ordner work, kopiere dort das Modul hinein und erstelle eine Testbench

Ich kann mir zwar nicht ganz vorstellen, dass es daran liegt, aber ich 
habe noch nie gehört, dass man in den Libraries herumkopieren darf.
Du solltest jedes Modul in die Library hineincompiliern.
Soviel ich weiss, gehören zur Library auch Indizes und andere 
Verwaltungsinformationen.

von Maik R. (kiamur)


Lesenswert?

Hallo an alle!

Vielen Dank für eure Hilfe!

@Duke: Genau das was da bei dir rauskommt wünsche ich mir, aber er gibt 
mir immer nur diese Fehlermeldungen aus, die ich gepostet habe. Du hast 
auch nichts in dem Quelltext geändert, oder? Kannst du vielleicht noch 
mal Schritt für Schritt schreiben, wie du meinen Quellen zum Laufen 
gebracht hast?!?

@Lothar: Nein, das mit den 20ns ist nur einer meiner verzeiwfelten 
Versuche gewesen etwas zum laufen zu bekommen . . . .

@Matthias: Das mit der Zeitauflösung werde ich gleich mal ausprobieren, 
aber warum ist das denn so, wenn es wirklich dann klappen sollte? Wenn 
du dir übrigens noch mal den auskommentierten Code im Modul anschaust, 
dann findest du auch das inkrement ;-)

@Klaus: Ich kopiere die beiden Dateien so wie es im Tutorial beschrieben 
ist in den Ordner work, danach öffne ich sie in Modelsim und kompiliere 
dann auch in Modelsim. Habe ich genauso mit den beiden Modelsim 
testfiles Counter und TCounter gemacht. Da hat auch die Simulation 
geklappt . . .

Gruß,
Maik

von Matthias (Gast)


Lesenswert?

@Maik: Der Simulator benutzt intern eine Auflösung, die du ihm 
einstellst. Das ist die Auflösung, die er für Zeitschritte verwenden 
kann. Ich würde nicht mein Leben darauf verwetten, aber es müsste bei zu 
großer Auslösung (größer als Taktrate) eigentlich das passieren, dass 
der Simulator die nächste Taktflanke auf einen folgenden Delta-Delay 
Cycle zum selben Zeitpunkt schedult. Er kriegt nun also einen Haufen 
Flankenwechsel auf der clock mit Zeitabstand 20 ns, da er aber nur 
Zeitabstand 100 ns intern darstellen kann macht er eben einen 
Flankenwechsel bei 0 ns plus einem Delta Cycle daraus.

Am Ende kann er die Simulationszeit nicht weiterzählen sondern zählt nur 
Delta Delays ... bis er das Limit bei diesen erreicht.

Ich simuliere inzwischen prinzipiell mit 1 ps Zeitauflösung, weil auch 
so mancher IP Core feinere Auflösungen braucht und es nicht immer klar 
in der Dokumentation verrät.

LG
Matthias

von Maik R. (kiamur)


Lesenswert?

Hi Matthias,

kannst du mir auch noch sagen, wo ich diese Auflösung einstelle? Unter 
Simulate-> Runtime Options habe ich das nicht gefunden . . .

Sorry wegen der Elementaren Fragen, aber ich finde die Doku zu Modelsim 
alles andere als verständlich, wenn man noch nie damit gearbeitet hat.

Gruß,
Maik

von Duke Scarring (Gast)


Lesenswert?

@Maik:
Versuch mal folgendes:
1
vsim -t 1 ps work.convert_2s_complement_test

Bei mir steht (u.A.) folgendes in der modelsim.ini:
1
[vsim]
2
; Simulator resolution
3
; Set to fs, ps, ns, us, ms, or sec with optional prefix of 1, 10, or 100.
4
Resolution = ps

Duke

von Maik R. (kiamur)


Lesenswert?

Hi Duke,

vielen Dank, jetzt läuft es. Man muss allerdings "vsim -t 1ps 
work.convert_2s_complement_test" schreiben, damit es geht.

Modelsim wird sicher noch für die eine oder andere Frage gut sein . . . 
;-)

Gruß,
Maik

von FPGA-Vollprofi (Gast)


Lesenswert?

Du kannst das auch mit einem Projekt machen und vor der Simulation 
rechts unten klicken, dort wo die Datei ausgewählt wird. (Simulate)

"testbensch"
Der Testmensch und seine Testbensch auf der Restränsch, ISBN 
078-4575-3345, 1982

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.