Warum ändert das Ändern eines „Add“ in ein logisches oder verschlingt 7 CPLD-Makrozellen?

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)

tmpist sozusagen eine Adresszeile. Ich habe zwei 3-Bit-Eingangsleitungen und kombiniere sie zu einer 6-Bit-Adressleitung. Also verschiebe ich LLum 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.

Antworten (1)

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 LLund 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.

Ja, aber das eigentliche Rätsel ist, warum das Synthesetool nicht beide ursprünglichen Quellkonstrukte darauf reduziert hat, und das kann nur beantwortet werden, indem man seine Ausgabe im Detail untersucht.
@Dave - Lustig, ich habe diese Nachricht erst ungefähr eine Stunde nachdem du sie (anscheinend) gepostet hast gesehen (es scheint, dass die Seite nicht wie üblich automatisch aktualisiert wird) Wie auch immer, ich stimme zu, denke jetzt nur darüber nach und mache ein Durcheinander im ISE.
@DaveTweed und Oli - Ich habe das OP aktualisiert. Nicht viel hinzuzufügen, außer dass ich auch glaube, dass das Forum nicht ganz richtig funktioniert. Wie auch immer, der Code rund um mein Problem 'hinzufügen' wurde jetzt ziemlich verändert - ich habe mein Design in einen XC2C64A geschnürt. Mein Entwicklungskit enthält einen 256 ...
(winziger Syntax-Tippfehler – die eckige Klammer nach „Sie können ihn in beliebiger Reihenfolge verwenden“ – lässt mich ihn nicht korrigieren. Ähnlicher Tippfehler auch im nächsten Abschnitt.)
Was das Posten von mehr Code betrifft, so schätze ich es zwar, aber ihr werdet meinen n00b-Code mühelos in Form bringen und mein Lernabenteuer wird enden. Aus diesem Grund versuche ich, so wenig wie möglich zu posten, da ich weiß, dass dies die Hilfe des Boards einschränken wird.
@TonyEnnis - Keine Probleme, ich will den Spaß nicht verderben :-) Wie auch immer, siehe Änderungen, ich habe das obige Codestück ausprobiert und auf beide Arten die gleichen Ergebnisse erhalten, daher bin ich mir nicht ganz sicher, was für Sie los ist.
Oh, ein verwandter Leckerbissen - Das Rechnen mit Potenzen von 2 (z. B. Multiplizieren mit 128 statt 117) macht einen wesentlichen Unterschied in Bezug auf die verbrauchten Ressourcen. Die Synthese-Engine ist verdammt schlau.