Forum: FPGA, VHDL & Co. VHDL ALIAS synthetisiert nicht "richtig"


von M. Н. (Gast)


Lesenswert?

Hallo,

ich bin gerade etwas verwirrt. Ich habe folgendes Code-Konstrukt in 
VHDL.

Im "Kopf" Der architecture sind folgende Signaldefinitionen:
1
signal my_reg : std_logic_vector(31 downto 0);
2
alias func_1 : std_logic_vector(7 downto 0) is my_reg(7 downto 0);
3
alias func_2 : std_logic_vector(7 downto 0) is my_reg(15 downto 8);

Im Code werden dann func_1 und func_2 beschrieben:
1
-- Irgendwo in einem synchronen Prozess
2
-- ...
3
func_1 <= (others => '0');
4
5
-- Irgendwo in einem ANDEREN synchronen Prozess
6
-- ...
7
func_2 <= (1 => '1', others => '0');

In der Simulation (Modelsim / Xcelium) tut das auch.
Wird func_2(0) <= '1' geschrieben, ändert sich my_reg(8).

Wenn man das Ganze aber durch die Synthese jagt, kommt der Fehler, dass 
mehrere Quellen die signale my_reg[7:0] treiben. Aus irgendeinem Grund 
legt die Synthese beide Aliase an dieselben bits 7...0 in my_reg.

Da ich mir aktuell unsicher bin, ob das überhaupt so gehen sollte: Ist 
das überhaupt valides VHDL? Als Workaround mache ich es jetzt erstmal 
ohne alias und lege getrennte Signale an...

Standard ist VHDL-93.

Edit: Die Signalnamen sind natürlich jetzt exemplarisch, da ich das 
Originaldesign nicht reinstellen kann.

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


Lesenswert?

M. H. schrieb:
> Ist das überhaupt valides VHDL?
Die paar Zeilen schon.

Ob der Synthesizer das dann in Hardware umsetzen kann, steht in dessen 
User Guide.

> Edit: Die Signalnamen sind natürlich jetzt exemplarisch, da ich das
> Originaldesign nicht reinstellen kann.
Im Idealfall solltest du das jetzt eben auf einen fehlerhaften 
Dreizeiler reduzieren und den posten...

von M. Н. (Gast)


Lesenswert?

Lothar M. schrieb:
> Im Idealfall solltest du das jetzt eben auf einen fehlerhaften
> Dreizeiler reduzieren und den posten...
1
LIBRARY ieee;
2
USE ieee.std_logic_1164.ALL;
3
USE ieee.numeric_std.ALL;
4
5
ENTITY test IS
6
  PORT(
7
    clk     : IN  std_logic;
8
    rst_n   : IN  std_logic;
9
    reg_out : OUT std_logic_vector(15 DOWNTO 0)
10
  );
11
END ENTITY test;
12
13
ARCHITECTURE RTL OF test IS
14
  SIGNAL my_reg  : std_logic_vector(15 DOWNTO 0);
15
  ALIAS counter1 : std_logic_vector(7 DOWNTO 0) IS my_reg(7 DOWNTO 0);
16
  ALIAS counter2 : std_logic_vector(7 DOWNTO 0) IS my_reg(15 DOWNTO 8);
17
BEGIN
18
19
  reg_out <= my_reg;
20
21
  counter1_proc : PROCESS(clk, rst_n) IS
22
  BEGIN
23
    IF rst_n = '0' THEN
24
      counter1 <= (OTHERS => '0');
25
    ELSIF rising_edge(clk) THEN
26
      counter1 <= std_logic_vector(unsigned(counter1) + 1);
27
    END IF;
28
  END PROCESS counter1_proc;
29
  
30
  counter2_proc : PROCESS(clk, rst_n) IS
31
  BEGIN
32
    IF rst_n = '0' THEN
33
      counter2 <= (OTHERS => '0');
34
    ELSIF rising_edge(clk) THEN
35
      counter2 <= std_logic_vector(unsigned(counter2) + 2);
36
    END IF;
37
  END PROCESS counter2_proc;
38
39
END ARCHITECTURE RTL;

Synthetisiert nicht mit den Fehlern:
The signal 'test.my_reg' (Bits: 15:8) is read but not set [Hierarchy: 
':test(RTL):']

Signal 'test.my_reg[7:0]' has multiple simultaneous drivers.

Sollte das gehen, oder ist das tatsächlich einfach Glückspiel, ob er das 
frisst? Ich muss da jetzt erstmal nachschauen. Wenn er das generell 
nicht mag, wird wohl nochmal 'ne Woche umcodieren fällig.

von Blechbieger (Gast)


Lesenswert?

Jetzt wäre noch wichtig zu wissen welches Programm du zur Synthese 
verwendest. Wichtig weil Synthese nicht Teil des VHDL-Standard ist. Da 
macht jeder Hersteller was er will und dokumentiert das im von Lothar 
angesprochenen User Guide.

von M. Н. (Gast)


Lesenswert?

Hi,
Synthese erfolgt mittels Synopsys Design Compiler.

Was mich da gerade dezent fertig macht, ist dass es andere Stellen gibt, 
in denen ge-aliast wird, diese synthetisieren aber ohne Probleme.

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


Lesenswert?

M. H. schrieb:
> Sollte das gehen
Die alte Xilinx ISE kanns (ich hab grad nichts anderes zur Hand):
1
Synthesizing Unit <test>.
2
    Related source file is "C:/Projekte/FPGA/AliasCounter/AliasCounter.vhd".
3
    Found 16-bit register for signal <my_reg>.
4
    Found 8-bit adder for signal <my_reg_15_8$add0000> created at line 33.
5
    Found 8-bit adder for signal <my_reg_7_0$add0000> created at line 24.
6
    Summary:
7
  inferred  16 D-type flip-flop(s).
8
  inferred   2 Adder/Subtractor(s).
9
Unit <test> synthesized.

Und die RTL-Schematic zeigt auch diese 2 Addierer an.

: Bearbeitet durch Moderator
von Tobias B. (Firma: www.elpra.de) (ttobsen) Benutzerseite


Lesenswert?

Die beiden Aliase zeigen doch beide auf den gleichen Vektor. Wenn du 
jetzt aus 2 verschiedenen Prozessen jeweils auf die Aliase zugreifst, 
dann landet der Zugriff doch trotzdem auf ein und dem selben Vektor. Und 
das geht nicht, damit treibst du aus "multiple sources".

Kann es sein, dass du mit my_reg einen Typ meinst? Dann waere my_reg ein 
Subtype und counter1 und counter2 entsprechend 2 Instanzen dieses Types.

Edit: Ach halt, die Aliase zeigen jeweils auf die oberen und auf die 
unteren 8 bit. Da scheint es wohl, dass das nicht korrekt aufgeloest 
werden kann. :-(

: Bearbeitet durch User
von M. Н. (Gast)


Lesenswert?

Tobias B. schrieb:
> Die beiden Aliase zeigen doch beide auf den gleichen Vektor. Wenn du
> jetzt aus 2 verschiedenen Prozessen jeweils auf die Aliase zugreifst,
> dann landet der Zugriff doch trotzdem auf ein und dem selben Vektor.

Nein. Jedes Element im Vector hat ja sein eigenes FF um es so zu sagen. 
Ich kann nur nicht ein und dasselbe Bit aus dem Vekotr in zwei Prozessen 
schreiben. (Bzw. ich kann. und es wird auch synthetisieren, aber eben 
obigen Fehler werfen)

Wenn ich sauber durchgreife und die aliase weglasse und homogen alles 
durch my_reg(7 downto 0) bzw my_reg(15 downto 8) ersetze ginge alles. 
Sieht halt nicht aus.

von M. Н. (Gast)


Lesenswert?

Tobias B. schrieb:
> Edit: Ach halt, die Aliase zeigen jeweils auf die oberen und auf die
> unteren 8 bit. Da scheint es wohl, dass das nicht korrekt aufgeloest
> werden kann. :-(

Wenn ich die Aliase in Unstanzen übegebe: Also die beiden Zähler als 
eigene entities mache und diese instanziiere und die aliase da 
reinwerfe, dann geht alles... Oh mann...

Ich muss mal bei uns nachfragen bzw. direkt bei Synopsys. Für's erste 
habe ich auf jeden Fall keine Lust mehr, mich da rumzuärgern. Die Aliase 
kommen jetzt raus...

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


Lesenswert?

M. H. schrieb:
> Also die beiden Zähler als eigene entities mache
Also wenn du 1 Zähler als Entity machst und den 2x instatiierst und mit 
den Alias fütterst?

> Oh mann...
Ich tippe, du hast einen Fehler im Synthesizer gefunden... ;-)

EDIT:
Die Lattice LSE in der Verison 3.12 verdaut den Dreizeiler auch klaglos.

Und der bei Lattice Diamond mitgelieferte Synplify Pro (R) kanns in den 
Versionen Q-2020.03L-SP1 und R2021.03L-SP1 auch. Er optimiert nur gleich 
das Bit 8 weg, weil das eh' "stuck at zero" ist.

: Bearbeitet durch Moderator
von VHDL hotline (Gast)


Lesenswert?

Bei Vivado hatte ich auch mal so ein Problem, weiß nicht, ob das noch 
besteht. Probier mal
1
  ALIAS counter1 IS my_reg(7 DOWNTO 0);
2
  ALIAS counter2 IS my_reg(15 DOWNTO 8);

oder
1
  ALIAS counter1 : std_logic_vector(7 DOWNTO 0) IS my_reg(7 DOWNTO 0);
2
  ALIAS counter2 : std_logic_vector(15 DOWNTO 8) IS my_reg(15 DOWNTO 8);

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.