Forum: FPGA, VHDL & Co. Verilog - Variablenbereich für die Synthese einschränken


von ElKo (Gast)


Lesenswert?

Hallo liebe Forumsgemeinde,

ich habe ein Projekt für einen ASIC Entwurf. Selbstgeschrieben, komplett 
in Verilog. Darin werden unter anderem Datenweiten zwischen Modulen zur 
Laufzeit definiert über ein Register:
reg [3:0] dataWd;

Nun ist es so, dass dieses Register Werte zwischen 0 und 15 annehmen 
kann. Davon benötige ich nur die Werte von 5 bis 12. Diese Datenweite 
wird für verschiedene Berechnungen benötigt und erzeugt nun jede Menge 
Logik. Vor allem auch überflüssige Logik für die Werte 0-4 und 13-15. 
Wie kann ich den Wertebereich des Registerarrays für die Synthese 
einschränken?

Synthesetool: LeonardoSpectrum 2011a.4 Level 3
Verilog-Standard: maximal 1993

Oder muss ich nun mit der zusätzlichen Logik leben, die nie gebraucht 
wird und beim nächsten Projekt gleich ein 3-Bit Register nehmen, wo 0 
der 5 entspricht usw.?

Ich würde mich freuen, wenn sich hier ein Experte findet, der die Frage 
beantworten kann, da ich nicht mehr weiß, welche Dokumentation mir noch 
weiterhelfen könnte.

Vielen Dank, ElKo

von Ralf (Gast)


Lesenswert?

Sollte das Leonardo das nicht erkennen und wegnehmen?

von ElKo (Gast)


Lesenswert?

Theoretisch ja. Aber in diesem Fall nicht, da diese Register über ein 
Schieberegister konfiguriert werden. Und hier kann Leonardo nicht 
wissen, welche von den möglichen Werten, die dort hinein geschrieben 
werden, dann auch tatsächlich praxisrelevant sind. Ich müsste ihm quasi 
mitteilen, dass es Kombinationen für die Register gibt, die nicht 
vorkommen können/werden.

von FPGA-Vollprofi (Gast)


Lesenswert?

Deshalb definiert man richtigerweise diese Register auch als isolierte 
Elemente / Integer. Die lassen sich leicht einschränken.

von ElKo (Gast)


Lesenswert?

Hallo FPGA-Vollprofi und alle anderen,

vielen Dank für deine Antwort. Leider verstehe ich sie aber nicht so 
recht. Wie meinst du "definiert man diese Register als isolierte 
Elemente/Integer"? Den Typ Integer gibt es bei Verilog 1993 doch gar 
nicht für sythetisierbare Elemente, dachte ich?

Ich hatte jetzt noch eine Idee, wie ich Leonardo zur Synthese einen 
spezifischen Wertebereich vorgeben kann. Dazu brauche ich ein 
Hilfssignal und eine Logik, die auf den gewünschten Bereich prüft.

Folgendes Beispiel zeigt vereinfacht, was ich mache:


module test (in, dataWd, out);
input  wire   [15:0]   in;
input  wire   [3:0]    dataWd;
output wire   [15:0]   out;

reg    [3:0]  dataWdTemp;
always @ (dataWd)
    if (dataWd < 5)
        dataWdTemp = 5;
    else if (dataWd > 12)
        dataWdTemp = 12;
    else
        dataWdTemp = dataWd;

wire   [15:0] dataMask;
assign dataMask = ~(~1 << dataWdTemp) >> 1; // thermometer coder

assign out = in & dataMask;

endmodule


Dieses Beispiel wird von Leonardo korrekt synthetisisert und auch die 
Größe schwankt deutlich, je nach Wertebereich. Also wird tatsächlich die 
nicht benötigte Logik hier weggelassen. Soweit alles top.

Und nun der Haken: In meinem Design funktioniert das nicht. Es ändert 
sich an der Größe gar nichts, außer die hinzugekommenen Vergleicher. 
Erst wenn ich dataWd einen konstanten Wert zuweise, nimmt die Fläche 
geringfügig ab, aber da sollte deutlich mehr Logik wegfallen können. Ich 
arbeite zum Teil noch mit dem Wert und addiere ihn mit 1 oder weiße ihm 
bei Bedarf einen neuen Wert zu. Aber in einem weiteren einfachen 
Beispiel hatte das Leonardo trotzdem erkannt. Hier scheine ich 
tatsächlich eine Grenze erreicht zu sein, was Leonardo als unnötige 
Logik erkennen kann.

Es sei denn, ihr habt noch einen Vorschlag, in welche Richtung ich 
weiter optimieren kann um dieses Problem zu lösen. Ich wäre euch sehr 
dankbar dafür.

MfG ElKo

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.