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
Sollte das Leonardo das nicht erkennen und wegnehmen?
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.
Deshalb definiert man richtigerweise diese Register auch als isolierte Elemente / Integer. Die lassen sich leicht einschränken.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.