mikrocontroller.net

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


Autor: Matthias Krüßelin (kruessi80)
Datum:

Bewertung
0 lesenswert
nicht 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.
-- -----------------------------------------------------
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.numeric_std.all;

library work;
use work.test_pkg.all;

entity test_tb is
    generic ( C_WIDTH : natural := 7 ); -- Mit diesem Generic soll die Simulation ausgeführt werden.
end test_tb;

architecture Behavioral of test_tb is

   component test
      generic (C_WIDTH : natural); -- (Mit diesem Generic soll die Synthese ausgeführt werden.)
      port (
         test1_o : std_logic_vector(C_WIDTH-1 downto 0);
         test2_o : test_type;
      );
   signal test1_w: std_logic_vector(C_WIDTH-1 downto 0);
   signal test2_w: std_logic_vector(C_WIDTH-1 downto 0);
begin
   DUT: test
   generic map ( C_WIDTH => C_WIDTH)
   port map(
      test1_o => test1_w,
      test2_o.a => test2_w );
end architecture;
-- -----------------------------------------------------

--Package declaration for the above program
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.numeric_std.all;

package test_pkg is
   constant C_WIDTH : natural := 7; -- wie bekommt man die Konstante hier dynamisch angepasst???
   type test_type is record
        a :std_logic_vector(C_WIDTH-1 downto 0);
   end record;
end test_pkg;   
--end of package.
-- -----------------------------------------------------

Im voraus vielen Dank :)

Autor: Ottmar (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Ottmar (Gast)
Datum:

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

Autor: Matthias Krüßelin (kruessi80)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Ottmar (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
}

Autor: Matthias Krüßelin (kruessi80)
Datum:

Bewertung
0 lesenswert
nicht 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 :-)

Autor: Matthias Krüßelin (kruessi80)
Datum:

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

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

Cheers

Autor: SuperWilly (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
type myArrayT is array (natural range <>) of std_logic_vector;

type myRecordT is
record
  a : std_logic_vector;
  b : std_logic_vector;
end record;

Gruß,
SuperWilly

Autor: Ottmar (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie schaut's mit dem Synthese support aus?

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.