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>
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
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
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!
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.