Forum: FPGA, VHDL & Co. Generic - Constant - Record - Package - Problem


von Matthias K. (kruessi80)


Lesenswert?

Hi,

habe mal wieder eine Frage an die VHDL-Profis:

Ich möchte exemplarisch ein std_logic_vector in einem Package möglichst 
dynamisch für eine Testbench benutzen.
In diesem Fall könnte ich zunächst eine Konstante (bzw. ein constant) 
definieren, in dem die Breite für den std_logic_vector drin steht.
Wenn ich jedoch im Beispiel unten das Generic der Testbench ändere 
stimmt die Busbreite des Records nicht mehr überein und ich muss auch 
die Konstante im Package ändern.
Gibt es hierzu eine sinnvolle Möglichkeit dieses Dilema zu lösen,
sodass man nur an einer Stelle ändern muss?
Ich möchte eigentlich nur ungern auf die Records verzichten,
da ich im eigentlichen Design sehr viele Signale enthalten sind,
die ich somit sehr einfach durch verschiedene Module durchschleifen 
kann.
1
-- -----------------------------------------------------
2
library IEEE;
3
use IEEE.std_logic_1164.all;
4
use IEEE.numeric_std.all;
5
6
library work;
7
use work.test_pkg.all;
8
9
entity test_tb is
10
    generic ( C_WIDTH : natural := 7 ); -- Mit diesem Generic soll die Simulation ausgeführt werden.
11
end test_tb;
12
13
architecture Behavioral of test_tb is
14
15
   component test
16
      generic (C_WIDTH : natural); -- (Mit diesem Generic soll die Synthese ausgeführt werden.)
17
      port (
18
         test1_o : std_logic_vector(C_WIDTH-1 downto 0);
19
         test2_o : test_type;
20
      );
21
   signal test1_w: std_logic_vector(C_WIDTH-1 downto 0);
22
   signal test2_w: std_logic_vector(C_WIDTH-1 downto 0);
23
begin
24
   DUT: test
25
   generic map ( C_WIDTH => C_WIDTH)
26
   port map(
27
      test1_o => test1_w,
28
      test2_o.a => test2_w );
29
end architecture;
30
-- -----------------------------------------------------
31
32
--Package declaration for the above program
33
library IEEE;
34
use IEEE.std_logic_1164.all;
35
use IEEE.numeric_std.all;
36
37
package test_pkg is
38
   constant C_WIDTH : natural := 7; -- wie bekommt man die Konstante hier dynamisch angepasst???
39
   type test_type is record
40
        a :std_logic_vector(C_WIDTH-1 downto 0);
41
   end record;
42
end test_pkg;   
43
--end of package.
44
-- -----------------------------------------------------

Im voraus vielen Dank :)

von Ottmar (Gast)


Lesenswert?

Generics können nicht dynamisch während eines simulationslaufs geändert 
werden. Es ist aber möglich generics beim Simulatoraufruf zu definieren.

vsim -gC_WIDTH=7 test_tb
vsim -gC_WIDTH=8 test_tb
vsim -gC_WIDTH=9 test_tb

von Ottmar (Gast)


Lesenswert?

Die Lösung nutzt natürlich nichts wenn es in einem package steht. :-)

von Matthias K. (kruessi80)


Lesenswert?

Ottmar schrieb:
> Generics können nicht dynamisch während eines simulationslaufs geändert
> werden.

Ja, das ist klar, brauche ich auch nicht.

> Die Lösung nutzt natürlich nichts wenn es in einem package steht. :-)

Ja, leider. Ist auch echt blöd.
Ich finde Records eigentlich schon gut und das Package ist dafür
doch auch der richtige Ort dafür, da nur so diese nur einmalig
definiert werden müssen.

In der Entity dies zu definieren geht ja einerseits nicht und 
andererseits würde dies dort blöd aussehen.

Wie macht Ihr das denn so?

von Ottmar (Gast)


Lesenswert?

In solchen Fällen hilft eigentlich nur scripten. Beispiel .do:

foreach value {7 8 9} {
  Script ändert den Wert im package auf $value
  Compile source files
  Simulation
}

von Matthias K. (kruessi80)


Lesenswert?

hm...
in dem Fall befinden wir uns wohl am Ende der Leistungsfähigkeit von 
VHDL.
Schade eigentlich, dass dies nur so umständlich geht und man(n) die 
Generics/Konstanten so untergraben muss....

Danke dennoch :-)

von Matthias K. (kruessi80)


Lesenswert?

Cool wäre in dem Fall wenn man den Records einen Parameter mitgeben 
könnte,
wie nachfolgend angedeutet:
1
type test_type(C_WIDTH) is record
2
   a :std_logic_vector(C_WIDTH-1 downto 0);
3
end record;

(Auf was für Ideen man(n) nachts so kommt, schmunzel...)

Cheers

von SuperWilly (Gast)


Lesenswert?

VHDL-2008:


One of the main changes to composite types (array and record types) is 
that now you can use unconstrained array and record elements. For 
instance the following declarations are now legal:
1
type myArrayT is array (natural range <>) of std_logic_vector;
2
3
type myRecordT is
4
record
5
  a : std_logic_vector;
6
  b : std_logic_vector;
7
end record;

Gruß,
SuperWilly

von Ottmar (Gast)


Lesenswert?

Wie schaut's mit dem Synthese support aus?

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.