Forum: FPGA, VHDL & Co. VHDL Procedure Datentyp Template


von Andreas (Gast)


Lesenswert?

Hallo Allerseits,

zur Zeit schreibe ich an einem Package das mir später einmal den Test 
von Speichern erleichtern soll. Dazu habe ich mir einige proceduren 
definiert, die mir z.B. den Speicher mit Zufallszahlen befüllen. 
Weiterhin habe ich mir dafür folgen Datentypen angelegt:
1
type tMemTiming is record
2
   WrSetup     : time; -- setup time before Write signal strobes
3
   WrHold      : time; -- Hold time after Write Signal finished strobing
4
   WrPuls      : time; -- Write Puls Time
5
   RdSetup     : time; -- setup time before Read signal strobes
6
   RdHold      : time; -- Hold time after Read Signal finished strobing
7
   RdPuls      : time; -- Read Puls Time
8
end record;
9
10
subtype tMemIdx is integer range 0 to ((2**C_AdrRng) - 1);
11
12
type tMemX8 is array (tMemIdx) of std_logic_vector(7 downto 0);
13
type tMemTesterX8 is record
14
   TxMem       : tMemX8;
15
   RxMem       : tMemX8;
16
   FirstValue  : tMemIdx;
17
   LastValue   : tMemIdx;
18
   MemIsFull   : boolean;
19
   MemIsEmpty  : boolean;
20
   Timing      : tMemTiming;
21
end record;

Da ich verschiede Datenbreiten bedienen möchte, lege ich mir zunächst 
einfach unterschiedliche Record von Speichern an.

Nun zu meinem egtl. Problem. Einige einfache Funktionen wie z.B. aus dem 
TxMem schreiben sind für alle Datenbreiten gleich, es unterscheidet sich 
lediglich die Datenbreite. Wäre es daher möglich ähnlich im C eine 
Template Funktion zu definieren, wo dann zur Laufzeit einfach die 
entsprechende Datenbreite definiert wird oder ist es lediglich möglich 
für jede Speicherbreite die Funktion zu kopieren den Datentyp im 
procedure ruf umzuändern?

Vielen Dank für die Antworten!


Grüße
Andreas

von Strubi (Gast)


Lesenswert?

Hi Andreas,

ganz doofe Frage: Warum nicht einfach generics nehmen?
Wenn alle Stricke reissen, und man etwas mit Makros hacken muss: Es gibt 
da einige dreckige Tricks mit dem C preprozessor (deswegen haben bei mir 
auch manche Dateien ne .chdl-Endung).

Gruss,

- Strubi

von Andreas (Gast)


Lesenswert?

Hallo Strubi,

>ganz doofe Frage: Warum nicht einfach generics nehmen?

Wie soll das bei Proceduren funktionieren? Denen übergebe ich eine 
Parameterliste und in dieser wird der Datentyp mit angebene. In meinem 
Fall würde das zu einer Überladung jeder Funktion führen und zwar 
dreimal, weil ich es für 8, 16 und 32Bit möchte.

Ein einfaches Beispiel:
1
procedure init (variable MemTester : inout tMemTesterX8);
2
procedure init (variable MemTester : inout tMemTesterX16);

Genau diese doppelte Definition möchte ich umgehen, weil ich ja in 
beiden Funktionen das gleiche mache nur mit anderen Datentyp

Viele Grüße
Andreas

von Duke Scarring (Gast)


Lesenswert?

Brauchst Du die verschiedenen Speicherbreiten gleichzeitig?
Wenn ja, sehe ich momentan nur die mehrfache Definition als Lösung.

Andernfalls kannst Du die Bitbreite auch in einem Config-Package 
definieren.

Duke

von Andreas (Gast)


Lesenswert?

Hallo Duke,

>Brauchst Du die verschiedenen Speicherbreiten gleichzeitig?

Es war eben als Package geplant, das ich in meinen verschiedenen TBs 
lade und die Anpasssung auf das exakte Problem mittels Datentyp 
vornehme. Okay, dann wrde ich nochmal in Ruhe drüber nachdenken, ob es 
sich noch anders lösen lässt. Erst einmal Vielen Dank.

Andreas

von Christoph (Gast)


Lesenswert?

Eine Variante ist wie von dir vorgeschlagen die Überladung.

Vorteil du kannst gleichzeitig alle Speicherbreiten benutzen, da ja alle 
Funktionen zur Verfügung stehen.


Weitere Variante ist, im Package Konstanten zu definieren für die 
Breiten, diese Konstanten kannst du in der Recorddefinition benutzen. 
Nachteil, pro Design ist so nur eine Breite möglich.


Dritte Variante, VHDL2008.
Wichtitg, zuerst abklären ob deine Tools damit umgehen können. Für 
deinen Speichertester würde der Simulator schon reichen.
VHDL2008 erlaubt es Records etc. Unconstrained zu definieren und erst 
bei der Signal deklaration einzuschränken.
Somit hast du nur eine procedure die von den übergebenen Daten immer 
brav alle 'Length Attribute beachtet.

Z. B. sowas:
1
type DualPortRamOutputPort_type is record
2
    Data           : std_logic_vector;
3
    Interrupt      : std_logic;
4
end record DualPortRamOutputPort_type;

und dann so ein Signal deklarieren:
1
signal PortAOut : DualPortRamOutputPort_type(Data(7 downto 0));

VHDL2008 kennt auch den Datentyp "type", somit könntest du deiner 
procedure den zu verwendenden Typ als weiteren Parameter mitgeben.

Sind sehr schöne Features, die ich nicht mehr hergeben möchte. Aber 
Prüfe deine Tools und die deiner Kunden/Zweigstelle/andere Abteilung ob 
die schon VHDL2008 können.

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.