Ich habe ein Design, das ungefähr 50 Makrozellen synthetisiert.
Ich habe diesen Abschnitt des Codes:
module levers2(
input [2:0] LL,
input [2:0] RL,
output reg [10:0] DIVISOR,
output reg FAULT
);
reg [10:0] grid[0:63];
wire [5:0] tmp = (LL<<3)+RL;
(snip)
tmp
ist sozusagen eine Adresszeile. Ich habe zwei 3-Bit-Eingangsleitungen und kombiniere sie zu einer 6-Bit-Adressleitung. Also verschiebe ich LL
um drei Bits und füge hinzu RL
. Wenn ich synthetisiere, erhalte ich ein 47-Makrozellen-Ergebnis.
Wenn ich jedoch den Operator in ein logisches or ändere:
wire [5:0] tmp = (LL<<3) | RL;
Das Design synthetisiert zu 54 Makrozellen. Das sind 7 verlorene Makrozellen wofür?!
Ich würde ein bisschen denken oder wäre effizient und einfach, viel einfacher als ein Add, das das zusätzliche Gepäck des Tragens hat.
Kann jemand etwas Licht ins Dunkel bringen, was los ist?
BEARBEITEN ---
Ich habe festgestellt, dass mehr Makrozellen verwendet werden, indem ich den Berichtsmechanismus von ISE verwendet habe. Ich habe auch ein paar verschiedene Dinge ausprobiert (aber nicht den unten erwähnten Verkettungsoperator) und alles hat 7 Makrozellen hinzugefügt, mit Ausnahme von 'add'. Ich war froh, dass das Verhalten konsistent war.
Als Randbemerkung habe ich meinem Top-Level-Schaltplan ein einzelnes ODER mit 3 Eingängen hinzugefügt und ihm drei Signale (Fehlerausgänge) von verschiedenen Modulen zugeführt. Dies fügte 9 Makrozellen hinzu. Du kannst darauf wetten, dass ich einen neuen Weg gefunden habe, als ich das sah, heh.
Wenn Sie nur zwei kleinere Arrays zu einem größeren Array von Signalen kombinieren möchten, verwenden Sie am besten den Verkettungsoperator:
wire [5:0] tmp = {LL, RL};
Mit dem oben Gesagten wire[5:3]
wird verbunden mit LL
und wire[2:0]
wird verbunden mitRL
Sie können es in beliebiger Reihenfolge verwenden:
wire[5:0] tmp = {RL, LL];
Oder auch:
wire[5:0] tmp = {LL[0], RL, LL[2:1];
(Sie können sehen, wie dies zum Verschieben / Drehen von Signalen verwendet werden kann)
Trotzdem bin ich mir nicht sicher, warum der Wechsel zum OR weitere 7 Makrozellen verwenden sollte, es liegt möglicherweise (wahrscheinlich) daran, dass das Synthesetool mit dem Operator + auf einen Addierer schlussfolgert und das CPLD eine Addiererzelle hat, die es verwenden kann, im Gegensatz zu aus wenigen Gattern die Kreuzotter machen.
Wie haben Sie das festgestellt? Hast du das Technologieschema überprüft, um zu sehen, was erstellt wird?
Um genau herauszufinden, was passiert, wäre es hilfreich, den Rest Ihres Modulcodes zu sehen (auch ich kann es hier in ISE versuchen).
BEARBEITEN - aus Neugier habe ich ein kleines Testmodul mit dem relevanten Bit des obigen Codes geschrieben. Ich habe versucht, (mit Standardeinstellungen) für einen Spartan-3A und den XC264A CPLD zu synthetisieren, mit dem +
oder dem |
. Beide Begriffe führten zu identischen Ergebnissen für Spartan und CPLD, sowohl im Technologie-Viewer als auch im Makrozellen-Nutzungsbericht für Ort und Route.
Mit diesen Informationen sieht es so aus, als ob es etwas mit dem Rest des Designs und möglicherweise den Einstellungen des Synthesewerkzeugs (Optimierung usw.) zu tun haben muss. Das obige Snippet sollte nur die beiden kleineren Signale zu einem größeren verketten, sodass keine Logik erforderlich sein sollte.
David Tweed
Oli Glaser
Toni Ennis
Toni Ennis
Toni Ennis
Oli Glaser
Toni Ennis