Forum: FPGA, VHDL & Co. Rom simulation


von Mark W. (kram) Benutzerseite


Angehängte Dateien:

Lesenswert?

Hallo,

ich bekomme bei der Simulation eines Roms die unten stehende 
Fehlermeldung. Ich habe beide Dateien angehaengt. Mein Ziel war es eine 
Waveform ins Rom zu schreiben und dann entsprechend auszugeben. Das 
funktionierte anfaenglich auch bis ich die Adressenliste auf 256 
vervolstaendigt habe. Nun weis ich nicht, warum die Simulation dann 
immer stoppt. Wenn ich addr bis 2F laufen lasse, funktioniert es. Ich 
kann die daten und adressen im Simulator vergleichen.

Vielen Dank,

Mark


Fehlermeldung:

ISim P.20131013 (signature 0x7708f090)
WARNING: A WEBPACK license was found.
WARNING: Please use Xilinx License Configuration Manager to check out a 
full ISim license.
WARNING: ISim will run in Lite mode. Please refer to the ISim 
documentation for more information on the differences between the Lite 
and the Full version.
This is a Lite version of ISim.
Time resolution is 1 ps
Simulator is doing circuit initialization process.
Finished circuit initialization process.
ERROR: at 100 ns: Delay 1180000 fs is not greater than previous waveform 
element delay 1270000 fs in assignment for target signal addr in File 
"C:/_Xilinxprj/Rom/rom/roms_constant_tb.vhd" Line 92
ERROR: In process roms_constant_tb.vhd:stim_proc

INFO: Simulator is stopped.
ISim>

von Duke Scarring (Gast)


Lesenswert?

Mark W. schrieb:
> Ich habe beide Dateien angehaengt.
Vorbildlich!

Ich hab das mal durchs Modelsim geschickt:
1
$ vlib work
2
$ vcom roms_constant.vhd
3
Model Technology ModelSim SE vcom 10.2b Compiler 2013.05 May 16 2013
4
-- Loading package STANDARD
5
-- Loading package TEXTIO
6
-- Loading package std_logic_1164
7
-- Loading package std_logic_arith
8
-- Loading package STD_LOGIC_UNSIGNED
9
-- Compiling entity roms_constant
10
-- Compiling architecture Behavioral of roms_constant
11
$ vcom roms_constant_tb.vhd
12
Model Technology ModelSim SE vcom 10.2b Compiler 2013.05 May 16 2013
13
-- Loading package STANDARD
14
-- Loading package TEXTIO
15
-- Loading package std_logic_1164
16
-- Compiling entity roms_constant_tb
17
-- Compiling architecture behavior of roms_constant_tb
18
###### roms_constant_tb.vhd(95):                x"01" after 10ns,
19
** Warning: [4] roms_constant_tb.vhd(95): (vcom-1207) An abstract literal and an identifier must have a separator between them.
20
###### roms_constant_tb.vhd(96):                x"02" after 20ns,
21
** Warning: [4] roms_constant_tb.vhd(96): (vcom-1207) An abstract literal and an identifier must have a separator between them.
22
...
Dem Compiler fehlt da ein Leerzeichen zwischen Zahl und Einheit. Aber 
das ist erstmal kein Beinbruch...
1
# vsim -gui roms_constant_tb
2
# ** Note: (vsim-3812) Design is being optimized...
3
#
4
# Loading std.standard
5
# Loading std.textio(body)
6
# Loading ieee.std_logic_1164(body)
7
# Loading ieee.std_logic_arith(body)
8
# Loading ieee.std_logic_unsigned(body)
9
# Loading work.roms_constant_tb(behavior)#1
10
run 1 sec
11
# ** Fatal: (vsim-3483) Delay in signal assignment is not ascending.
12
#    Time: 100 ns  Iteration: 0  Process: /roms_constant_tb/stim_proc File: roms_constant_tb.vhd
13
# Fatal error in Process stim_proc at roms_constant_tb.vhd line 364
14
#
15
# HDL call sequence:
16
# Stopped at roms_constant_tb.vhd 364 Process stim_proc
17
#

Ihm gefällt also nicht, das Du die Zeit zurückdrehen möchtest.
Das Problem hat sicher auch ISIM, kann es aber nicht so gut 
artikulieren...

Duke

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


Lesenswert?

Mark W. schrieb:
> ERROR: at 100 ns: Delay 1180000 fs is not greater than previous waveform
> element delay 1270000 fs in
Naja, was könnte das wohl sein? Ich tippe auf einen Copy-Paste-Fehler. 
Also gut. Datei aufgemacht und bei 1270 ns geschaut:
1
    x"7D" after 1250ns,
2
    x"7E" after 1260ns,
3
    x"7F" after 1270ns,  
4
    
5
    x"80" after 1180ns,  -- Zeiten MÜSSEN aufsteigend sein...
6
    x"81" after 1190ns,
7
    x"82" after 1200ns,
Das wird dir hier wieder passieren:
1
    x"8C" after 1300ns, 
2
    x"8D" after 1310ns,
3
    x"8E" after 1260ns,  -- Zeiten MÜSSEN aufsteigend sein...
4
    x"8F" after 1270ns,

Mit dieser after Zuweisung wird nicht zwischen den Zuweisungen für 
die angegebene Zeit gewartet, sondern diese Zeiten gelten ab 
Simulationsstart.
Wenn du zwischen den Zuweisungen warten willst, dann musst du in einem 
Prozess etwa so schreiben:
1
   stim_proc: process
2
   begin    
3
      -- hold reset state for 100 ns.
4
      wait for 100 ns;  
5
6
      --wait for clk_period*10;
7
8
      -- insert stimulus here 
9
      addr <=  x"00"; wait for 10 ns;
10
      addr <=  x"02"; wait for 20 ns;
11
      addr <=  x"03"; wait for 30 ns;
12
      :
13
      :
Aber du kannst dir doch einfach mal anschauen, wie Andere das gemacht 
haben...

Das schreibt man eigentlich nicht zusammen:
1
  1250ns

EDIT: zu langsam... :-(
Ist aber auch noch früh am Morgen... ;-)

: Bearbeitet durch Moderator
von F. F. (foldi)


Lesenswert?

Lothar Miller schrieb:
> x"7D" after 1250ns,
>     x"7E" after 1260ns,

Oben schrieb jemand "vorbildlich". Das kann ich von deinem Post auch 
sagen. Ohne dass ich vom eigentlichem Thema was verstehe, so kann sogar 
ich nun den Fehler nachvollziehen.
Am Rande:
Das mit den Farben ist ja toll!

von Mark W. (kram) Benutzerseite


Lesenswert?

An alle,

danke fuer die Tips, habs gerafft.

Das mit dem "wait for" ist natuerlich noch viel besser. Spart ne Menge 
Tipparbeit. Sicherlich gehts auch einfacher mit nem Counter, aber ich 
moechte da Wellenformen speichern.

Ich habe mir den Stimulus muehselig vorgestern Abend angelegt, war wohl 
schon etwas spaet. :-(

Mark

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


Lesenswert?

F. Fo schrieb:
> Das mit den Farben ist ja toll!
Das geht so:
1
[vhdl]
2
  VHDL Code
3
[/vhdl]

Und noch einen Tipp:
Nimm ausschließlich die numeric_std. Am besten gleich von Anfang an.
Dann wird das zwar länger:
1
        data <= ROM(conv_integer(addr));
Aber es ist auch eindeutig klar, dass addr unsigned ist:
1
        data <= ROM(to_integer(unsigned(addr)));
Na gut, hier ist es evtl. eh' klar, aber du musst nicht weit denken, bis 
dir ein Fall einfällt, wo dich interessieren würde, ob die Operation 
signed oder unsigned ist:
1
        wert <= a+b;
Siehe den Beitrag "IEEE.STD_LOGIC_ARITH.ALL obsolete"
Und das da: http://www.lothar-miller.de/s9y/categories/16-Numeric_Std
Man muss sich nur merken: von und nach integer steht ein to_ davor 
(to_integer(), to_unsigned(), to_signed()) und zwischen den Vektoren 
wird nur gecastet (signed(), unsigned(), std_logic_vector()). Das wars, 
alle Konvertierungen erledigt.

Mark W. schrieb:
> Ich habe mir den Stimulus muehselig vorgestern Abend angelegt, war wohl
> schon etwas spaet. :-(
Ich hätte das eher mit einer Schleife gemacht. In Testbenches kann  und 
darf man die ausgiebig verwenden:
1
LIBRARY ieee;
2
USE ieee.std_logic_1164.ALL;
3
USE ieee.numeric_std.ALL;
4
 
5
ENTITY roms_constant_tb IS
6
END roms_constant_tb;
7
 
8
ARCHITECTURE behavior OF roms_constant_tb IS 
9
 
10
    -- Component Declaration for the Unit Under Test (UUT)
11
 
12
    COMPONENT roms_constant
13
    PORT(
14
         clk : IN  std_logic;
15
         en : IN  std_logic;
16
         addr : IN  std_logic_vector(7 downto 0);
17
         data : OUT  std_logic_vector(15 downto 0)
18
        );
19
    END COMPONENT;
20
    
21
22
   --Inputs
23
   signal clk : std_logic := '0';
24
   signal en : std_logic := '1';
25
   signal addr : std_logic_vector(7 downto 0) := (others => '0');
26
27
   --Outputs
28
   signal data : std_logic_vector(15 downto 0);
29
30
   -- Clock period definitions
31
   constant clk_period : time := 10 ns;
32
 
33
BEGIN
34
 
35
  -- Instantiate the Unit Under Test (UUT)
36
   uut: roms_constant PORT MAP (
37
          clk => clk,
38
          en => en,
39
          addr => addr,
40
          data => data
41
        );
42
43
   -- Clock 
44
   clk <= not clk after clk_period/2;
45
 
46
47
   -- Stimulus process
48
   stim_proc: process
49
   begin    
50
      for i in 0 to 255 loop
51
        addr <= std_logic_vector(to_unsigned(addr,8));
52
        wait for 40 ns;  -- entweder so ...
53
        -- ... oder so:  wait until falling_edge(clk);
54
      end loop;  
55
    
56
      wait;
57
   end process;
58
END;

: Bearbeitet durch Moderator
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.