Forum: FPGA, VHDL & Co. Array von Record in Sensitivitätsliste


von HansPeter (Gast)


Lesenswert?

Moin!
Ich habe zur Zeit ein kleines Problem in VHDL. Mein Code enthält ein 
Array eines Records. Der Record besteht aus 2 Vectoren. Dieses Signal 
soll in die Sensitivitätsliste eines Prozesses:
1
process(int_optical_out_link)

Dabei ist int_optical_out_link das Array der Records. Die Simulation 
funktioniert soweit (und gibt das für mich richtige Ergebnis wieder), 
jedoch meckert ISE bei der Synthese, dass nicht alle Signale in der 
Sensitivitätsliste sind:
1
The missing signals are: <int_optical_out_link<0>.homechannel_data>, <int_optical_out_link<0>.homechannel_taken>, <int_optical_out_link<1>.homechannel_data>, ...

Es erwartet also, das alle Komponenten des Records angegeben werden. Die 
Länge des Arrays ist allerdings nicht fix, sondern durch Generics 
bestimmt. Ich kann also nicht alle Parameter "stumpf" hart 
reinschreiben.

Hat jemand einen Typ, wie ich dieses Problem lösen kann?

Grüße

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


Lesenswert?

HansPeter schrieb:
> jedoch meckert ISE bei der Synthese
Die Sensitivliste ist für die Synthese schnurzegal. Da kannst du 
irgendwas reinschreiben und trotzdem kommt das Selbe raus...

> jedoch meckert ISE bei der Synthese, dass nicht alle Signale in der
> Sensitivitätsliste sind:
Das ist eigentlich eher ein Hinweis darauf, dass die Simulation falsch 
sein könnte...

> jedoch meckert ISE
WElche Version? Welche Zielhardware?

von HansPeter (Gast)


Angehängte Dateien:

Lesenswert?

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.

von Da D. (dieter)


Lesenswert?

Schalte auf VHDL2008 um, und schreibe als Sensitivity-List einfach (all) 
hin. Das sollte man generell machen (mittlerweile sollten das alle 
aktuellen Tools unterstützen), dann hat man nie wieder ärger mit diesem 
Relikt aus der HDL Steinzeit :-)

von Lattice User (Gast)


Lesenswert?

HansPeter schrieb:
>> WElche Version? Welche Zielhardware?
> ISE 13.1 mit Virtex-5 (LX110T) als Zielhardware.
>

Google: VHDL Record Sensitivity list

Gleich im ersten Link:

Xilinx XST uses an old VHDL parser for older devices and a new one for 
new devices. Neither understands VHDL as well as users might like, so 
they allow you to pick the least bad, with a command line option 
"use_new_parser=yes" (probably also available as a tick box in the 
"Properties" dialog for the synthesis tool). That will let you use the 
new parser for old Virtex-5 device

von HansPeter (Gast)


Lesenswert?

Lattice User schrieb:
> HansPeter schrieb:
>>> WElche Version? Welche Zielhardware?
>> ISE 13.1 mit Virtex-5 (LX110T) als Zielhardware.
>>
>
> Google: VHDL Record Sensitivity list
>
> Gleich im ersten Link:
>
> Xilinx XST uses an old VHDL parser for older devices and a new one for
> new devices. Neither understands VHDL as well as users might like, so
> they allow you to pick the least bad, with a command line option
> "use_new_parser=yes" (probably also available as a tick box in the
> "Properties" dialog for the synthesis tool). That will let you use the
> new parser for old Virtex-5 device

Danke! Genau das hat mir gefehlt :).

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


Lesenswert?

HansPeter schrieb:
>> That will let you use the new parser for old Virtex-5 device
> Danke! Genau das hat mir gefehlt :).
Deshalb meine Frage nach der Zielplattform. Der neue Parser beherrscht 
auch allgemein das Handling mit mehrdimensionalen Arrays besser:
http://www.lothar-miller.de/s9y/archives/79-use_new_parser-YES.html

von Bogomil (Gast)


Lesenswert?

Ich habe mal ein Array so behandelt, dass ich alle Signale darin 
verodert habe und einem einzigen Signal zugewiesen habe, das dann in der 
sens liste stand.

Janz einfach

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


Lesenswert?

Bogomil schrieb:
> Ich habe mal ein Array so behandelt, dass ich alle Signale darin
> verodert habe und einem einzigen Signal zugewiesen habe, das dann in der
> sens liste stand.
Der eigentliche Witz ist doch, dass der Simulator den Record in der 
Sensitivliste schon richtig behandelt. Und der Synthesizer die Liste 
gar nicht verwendet...

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.