Forum: FPGA, VHDL & Co. Zuweisungen in Testbench - Simulation startet nicht


von Guenther (Gast)


Lesenswert?

Hallo,

ich bräuchte mal wieder eure Hilfe.
Ich habe hier eine entity geschrieben, die mir die Eingangssignale 
miteinander verknüpft und auf vier Kanälen wieder ausgibt. Das ganze 
habe ich in der Simulation getestet und es funktioniert auch soweit. 
Allerdings habe ich in der Simulation bisher mit "Force clock" und 
"Force constant" gearbeitet. Also wollte ich eine Testbench schreiben.
Nun bricht diese Testbench aber schon beim Start ab. Als Fehler bekomme 
ich nur
"ERROR: [USF-XSim-62] 'compile' step failed with error(s).
ERROR: [Vivado 12-4473] Detected error while running simulation. Please 
correct the issue and retry this operation.
ERROR: [Common 17-39] 'launch_simulation' failed due to earlier errors."

Anbei die Testbench:
1
library IEEE;
2
use IEEE.STD_LOGIC_1164.ALL;
3
use IEEE.NUMERIC_STD.ALL;
4
5
-- Uncomment the following library declaration if using
6
-- arithmetic functions with Signed or Unsigned values
7
--use IEEE.NUMERIC_STD.ALL;
8
9
-- Uncomment the following library declaration if instantiating
10
-- any Xilinx leaf cells in this code.
11
--library UNISIM;
12
--use UNISIM.VComponents.all;
13
14
entity Data_Gen_tb is
15
--  Port ( );
16
end Data_Gen_tb;
17
18
architecture Behavioral of Data_Gen_tb is
19
    component DataGen is
20
    Port ( CLK      : in STD_LOGIC;
21
           HSYNC    : in STD_LOGIC;
22
           VSYNC    : in STD_LOGIC;
23
           DATA_EN  : in STD_LOGIC;
24
           LOAD     : in STD_LOGIC;
25
           RGB_DATA : in STD_LOGIC_VECTOR (24 downto 0);
26
           CHANNEL1 : out STD_LOGIC_VECTOR (6 downto 0) := (others => '0');
27
           CHANNEL2 : out STD_LOGIC_VECTOR (6 downto 0) := (others => '0');
28
           CHANNEL3 : out STD_LOGIC_VECTOR (6 downto 0) := (others => '0');
29
           CHANNEL4 : out STD_LOGIC_VECTOR (6 downto 0) := (others => '0'));           
30
    end component;
31
    
32
    -- inputs
33
    signal CLK, HSYNC, VSYNC, DATA_EN, LOAD : STD_LOGIC := '0';
34
    signal RGB_DATA : STD_LOGIC_VECTOR (24 downto 0) := (others => '0');
35
    
36
    -- outputs
37
    signal CHANNEL1, CHANNEL2, CHANNEL3, CHANNEL4 : STD_LOGIC_VECTOR (6 downto 0) := (others => '0');
38
    
39
    constant CLK_100_PERIOD : time := 30ns;    
40
begin
41
42
uut : DataGen
43
    port map(
44
        CLK => CLK,
45
        HSYNC => HSYNC,
46
        VSYNC => VSYNC,
47
        DATA_EN => DATA_EN,
48
        LOAD => LOAD,
49
        RGB_DATA => RGB_DATA,
50
        CHANNEL1 => CHANNEL1,
51
        CHANNEL2 => CHANNEL2,
52
        CHANNEL3 => CHANNEL3,
53
        CHANNEL4 => CHANNEL4
54
    );
55
56
--clock process   
57
CLK_100 : process
58
begin
59
    CLK <= '1';
60
    
61
    wait for CLK_100_PERIOD / 2;
62
    
63
    CLK <= '0';
64
    
65
    wait for CLK_100_PERIOD / 2;   
66
    
67
end process CLK_100;    
68
69
--stimulus process
70
stim_proc : process
71
begin    
72
    
73
    data_loop:for I in 0 to 255 loop
74
    
75
        RGB_DATA <= STD_LOGIC_VECTOR(to_unsigned(I, RGB_DATA'LENGTH)); --hier scheint etwas falsch zu sein
76
        
77
        signal_loop:for J in 0 to 15 loop
78
            
79
            -- die folgenden 4 Zeilen scheinen auch falsch zu sein
80
            HSYNC <= (STD_LOGIC_VECTOR(to_unsigned(J, 4))(0)); 
81
            VSYNC <= STD_LOGIC_VECTOR(to_unsigned(J, 4))(1);
82
            DATA_EN <= STD_LOGIC_VECTOR(to_unsigned(J, 4))(2);
83
            LOAD <= STD_LOGIC_VECTOR(to_unsigned(J, 4))(3);
84
            
85
            wait for CLK_100_PERIOD;
86
        
87
        end loop signal_loop;   
88
    
89
        wait for CLK_100_PERIOD;
90
        
91
   end loop data_loop;    
92
93
end process stim_proc; 
94
95
end Behavioral;

Mit den Schleifen wollte ich erreichen, dass alle Möglichkeiten 
durchgespielt werden. Dass die erste Schleife nur bis 255 reicht, ist 
nur dem ersten Versuch und der Verkürzung der Simulationszeit 
geschuldet.
Ersetze ich bei den Zuweisungen innerhalb der Schleifen durch eine 
Zuweisung mit
1
 ... <= '1';
so startet die Simulation zumindest. Ich scheine also hier etwas falsch 
zu machen.

Könnt ihr mir bitte helfen?


Viele Grüße

von Klakx (Gast)


Lesenswert?

ganz sicher, dass da nicht im log mehr steht? bei compile sollte es 
schon mehr Infos geben.
Kann den Fehler auch gerade nicht erkennen.

von Guenther (Gast)


Lesenswert?

Hallo Klakx,
vielen Dank für den Hinweis mit dem Log.

Hier der Auszug des Logs:

INFO: [VRFC 10-163] Analyzing VHDL file 
"C:/.../sources_1/new/DataGen.vhd" into library xil_defaultlib
INFO: [VRFC 10-307] analyzing entity DataGen
INFO: [VRFC 10-163] Analyzing VHDL file 
"C:/.../sim_3/new/testbench3.vhd" into library xil_defaultlib
INFO: [VRFC 10-307] analyzing entity Data_Gen_tb
ERROR: [VRFC 10-435] cannot index the result of a type conversion 
[C:/.../sim_3/new/testbench3.vhd:80]
ERROR: [VRFC 10-435] cannot index the result of a type conversion 
[C:/.../sim_3/new/testbench3.vhd:81]
ERROR: [VRFC 10-435] cannot index the result of a type conversion 
[C:/.../sim_3/new/testbench3.vhd:82]
ERROR: [VRFC 10-435] cannot index the result of a type conversion 
[C:/.../sim_3/new/testbench3.vhd:83]
ERROR: [VRFC 10-1504] unit behavioral ignored due to previous errors 
[C:/.../sim_3/new/testbench3.vhd:18]
INFO: [VRFC 10-240] VHDL file C:/.../sim_3/new/testbench3.vhd ignored 
due to errors

Es liegt also wohl daran, dass ich nicht auf einen Index der 
Typkonvertierung zugreifen kann. Ein Versuch das ganze in einer 
variablen zu puffern und dort auf den Index zuzugreifen, scheiterte 
ebenfalls mit folgendem Fehler (aus dem Log):

ERROR: [VRFC 10-1551] variable outside of subprogram or process must be 
'shared'

Habt ihr sonst einen Tipp für mich, wie ich mein Vorhaben einigermaßen 
elegant umsetzen kann?

von Achim S. (Gast)


Lesenswert?

Guenther schrieb:
> Ein Versuch das ganze in einer
> variablen zu puffern und dort auf den Index zuzugreifen, scheiterte
> ebenfalls mit folgendem Fehler (aus dem Log):
>
> ERROR: [VRFC 10-1551] variable outside of subprogram or process must be
> 'shared'

dann packe die Variable doch einfach in den Prozess

von Markus F. (mfro)


Lesenswert?

Du versuchst, einen Slice/Index vom Ergebnis einer Typumwandlung zu 
bilden. Das ist nicht erlaubt (obwohl es manchmal geschickt wäre und in 
Quartus z.b. funktioniert, in ModelSim allerdings nicht).


So (mit der Zuweisung des Ergebnisses der Typumwandlung an eine 
Zwischenvariable) würd's funktionieren:
1
--stimulus process
2
stim_proc : process
3
    variable slv : std_logic_vector(4 downto 0);
4
begin    
5
    
6
    data_loop:for I in 0 to 255 loop
7
    
8
        RGB_DATA <= STD_LOGIC_VECTOR(to_unsigned(I, RGB_DATA'LENGTH)); --hier scheint etwas falsch zu sein
9
        
10
        signal_loop:for J in 0 to 15 loop            
11
            slv := std_logic_vector(to_unsigned(j, slv'length));
12
            (HSYNC, VSYNC, DATA_EN, LOAD) <= slv(0 to 3); 
13
            wait for CLK_100_PERIOD;
14
        end loop signal_loop;   
15
        wait for CLK_100_PERIOD;
16
   end loop data_loop;    
17
end process stim_proc;

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


Lesenswert?

Achim S. schrieb:
> dann packe die Variable doch einfach in den Prozess
Dort ist sie üblicherweise... ;-)
1
stim_proc : process
2
variable h : std_logic_vector(3 downto 0);
3
begin    
4
    
5
    data_loop:for I in 0 to 255 loop
6
    
7
        RGB_DATA <= STD_LOGIC_VECTOR(to_unsigned(I, RGB_DATA'LENGTH));
8
        
9
        signal_loop: for J in 0 to 15 loop
10
            h := STD_LOGIC_VECTOR(to_unsigned(J, 4));
11
12
            -- dann geht auch das...
13
            HSYNC   <= h(0); 
14
            VSYNC   <= h(1);
15
            DATA_EN <= h(2);
16
            LOAD    <= h(3);

Was sollte bei der Zeile "--hier scheint etwas falsch zu sein" nicht 
passen? Was erwartest du und was passiert stattdessen?


Markus F. schrieb:
> So (mit der Zuweisung des Ergebnisses der Typumwandlung an eine
> Zwischenvariable) würd's funktionieren:
Fast... ;-)
1
    variable slv : std_logic_vector(4 downto 0); -- ein Bit zu viel... ;-)
2
3
            (HSYNC, VSYNC, DATA_EN, LOAD) <= slv(0 to 3); -- falsche Reihenfolge, das wird ein leerer Vektor...

: Bearbeitet durch Moderator
von Achim S. (Gast)


Lesenswert?

Lothar M. schrieb:
> Dort ist sie üblicherweise... ;-)

Yup, aber der TO hat wohl versucht, sie in der architecture zu 
deklarieren (sonst käme seine Fehlermeldung nicht und die Simu hätte 
funktioniert).

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


Lesenswert?

Achim S. schrieb:
> Yup, aber der TO hat wohl versucht, sie in der architecture zu
> deklarieren
Vermute ich auch, aber mit "üblicherweise" meinte ich, dass man mit den 
Stichworten "variable outside of subprogram or process must be 'shared'" 
garantiert die Fehlerursache finden könnte...

Und tatsächlich, der erste Link bei Google 
(https://www.google.de/?client=firefox-b#q=variable+outside+of+subprogram+or+process+must+be+%27shared%27) 
ist dann schon der hier, der beide Lösungsmöglichkeiten aufführt:
http://quartushelp.altera.com/14.0/mergedProjects/msgs/msgs/evrfx_vhdl_variable_must_be_shared.htm
1. die Variable entweder in den Prozess, oder
2. die Variable als "shared variable" deklarieren.
Üblich ist Lösung 1

: 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.