Lothar Miller schrieb:
> Das ist eigentlich eher ein Hinweis darauf, dass die Simulation falsch
> sein könnte...
Habe ich auch zuerst befürchtet. Deshalb habe ich das Problem herunter
gebrochen und eine kleine Test Entity geschrieben:
1 | library IEEE;
|
2 | use IEEE.std_logic_1164.all;
|
3 |
|
4 | entity test is
|
5 | port(
|
6 | vector_in : in std_logic_vector(5 downto 0);
|
7 | xor_out_1 : out std_logic_vector(2 downto 0);
|
8 | xor_out_2 : out std_logic);
|
9 | end;
|
10 |
|
11 | architecture behaviour of test is
|
12 |
|
13 | type record_type is record
|
14 | element1 : std_logic_vector(2 downto 0);
|
15 | element2: std_logic;
|
16 | end record;
|
17 |
|
18 | type array_of_record is array (1 downto 0) of record_type;
|
19 |
|
20 | signal input: array_of_record;
|
21 | begin
|
22 |
|
23 | input(0).element1 <= vector_in(5 downto 3);
|
24 | input(0).element2 <= vector_in(5);
|
25 | input(1).element1 <= vector_in(2 downto 0);
|
26 | input(1).element2 <= vector_in(0);
|
27 |
|
28 | process(input) is
|
29 | begin
|
30 | xor_out_1 <= input(0).element1 xor input(1).element1;
|
31 | xor_out_2 <= input(0).element2 xor input(1).element2;
|
32 | end process;
|
33 |
|
34 | end;
|
Genau bei diesem Problem beschwert sich das Synthesetool, dass ich nicht
alle benötigten Signal in der Sensitivitätsliste habe (ich sollte
"input<0>.element1", "input<0>.element2", etc. einfügen). Um zu
überprüfen, wie die Simulation mit Modelsim dies handelt (da bei meinem
vorherigen Test das "erwartete" Ergebnis herauskam), habe ich die kleine
Testbench geschrieben:
1 | entity tb is
|
2 | end;
|
3 |
|
4 | architecture testbench of tb is
|
5 | component test is
|
6 | port(
|
7 | vector_in : in std_logic_vector(5 downto 0);
|
8 | xor_out_1 : out std_logic_vector(2 downto 0);
|
9 | xor_out_2 : out std_logic);
|
10 | end component;
|
11 |
|
12 | signal vector_in : std_logic_vector(5 downto 0) := (others => '0');
|
13 | signal xor_out_1 : std_logic_vector(2 downto 0);
|
14 | signal xor_out_2 : std_logic;
|
15 |
|
16 | begin
|
17 |
|
18 | dut:test
|
19 | port map(
|
20 | vector_in => vector_in,
|
21 | xor_out_1 => xor_out_1,
|
22 | xor_out_2 => xor_out_2);
|
23 |
|
24 | stimuli:process is
|
25 | begin
|
26 | wait for 5 ns;
|
27 | vector_in <= "100000";
|
28 | wait for 5 ns;
|
29 | vector_in <= "101000";
|
30 | wait for 5 ns;
|
31 | vector_in <= "100011";
|
32 | wait for 5 ns;
|
33 | wait;
|
34 | end process;
|
35 |
|
36 | end;
|
Und tatsächlich, die Simulation funktioniert ohne Probleme (es wird also
korrekt erkannt, dass wenn ich den Array von Records (hier "input") in
die Sensitivitätsliste packe, er automatisch alle damit
zusammenhängenden Subsignale auch dazu zählt). Siehe Anhang.
Also sollte Simulation das richtige zurückliefern. Es ist also eher ein
"kosmetisches" Problem.
> WElche Version? Welche Zielhardware?
ISE 13.1 mit Virtex-5 (LX110T) als Zielhardware.
Ich schätze wohl, dass ich damit leben muss, dass die zig Warnungen dann
ausgeschmissen werden, falls ich dass ganze nicht umschreiben will. Die
Simulation scheint die Sensitivitätsliste ja richtig zu interpretieren.