Einfache Implementierung eines kleinen CAM auf einem FPGA

Einführung


Einmal musste ich einen kleinen Block CAM (assoziativen Speicher) implementieren. Nachdem ich gelesen hatte, wie Xilinx dies auf BRAM (statische Speicherblöcke) oder auf SRL16 (16-Bit-Schieberegister) macht, war ich ein wenig traurig, da ihre Implementierungen ziemlich viel Platz in Anspruch nahmen. Ich beschloss, es selbst zu versuchen. Die erste Option war die Implementierung der Stirn. Mit Blick auf die Zukunft kam es mir fast sofort in den Sinn und die Zielfrequenz für das Design betrug nur 125 MHz.


Architektur


Betrachten Sie zunächst die Erklärung des Problems. Wir brauchen also eine kleine CAM mit einer Wortbreite von 8-64 Bit und einer Tiefe von 16-1024 Wörtern. Ich brauchte eine binäre Suche in CAM, aber später stellte sich heraus, dass das Erstellen von TCAM (ternärer assoziativer Speicher) ressourcenschonend ist und das Timing geringfügig beeinflusst. Die untere Frequenzgrenze liegt bei der Kintex7- Familie bei 125 MHz. Fangen wir an! Unser CAM besteht aus diesen Zeilen, von denen jede einer Adresse entspricht und ein Wort speichert:


Cam_line


Abbildung 1. Die Struktur einer CAM-Linie


In Fig. 1 ist D ein regulärer D-Trigger zum Speichern von Daten, wobei die Anzahl dieser Trigger in der Zeile der Breite des Eingabedatenworts in CAM entspricht. GÜLTIG - D-Trigger, der '1' speichert, wenn die Daten in der Zeile relevant sind. CMP ist ein Komparator, der den Wert des entsprechenden Suchschlüsselbusbits vergleicht, wenn VALID = '1' ist. Daten schreiben - Datenbus schreiben , bitweise mit dem entsprechenden D ( N - CAM Wortbreite) verbunden, wir - Schreibflag, Clear - Reset VALID (Ungültigmachung der Datenleitung). UND - logisches UND von N Ausgängen der Komparatoren, Match - Flag wird zu '1', wenn die Suche in dieser Zeile erfolgreich ist.


Wir haben also eine Zeile, in der wir suchen können. Kombinieren Sie sie jetzt:


Cam_structure


Abbildung 2. CAM-Struktur


In Fig. 2 ist CAM_line die CAM-Leitung selbst aus Fig. 1, MUX ist der Eingangsadressenmultiplexer, MATCH REGISTER ist ein Register, das Übereinstimmungsflagwerte speichert, ENCODER ist ein Decoder, der den Übereinstimmungsbus in die niedrigste gefundene Übereinstimmungsadresse konvertiert. FSM ist eine steuernde Finite-State-Maschine . match entfernt aus MATCH REGISTER das Bit, das der gesendeten Adresse entspricht, sodass ENCODER zur nächsten gefundenen Adresse wechselt. Die Schnittstelle unseres CAM lautet wie folgt:


LinieRichtungTermin
addrLoginAdresse schreiben / löschen
DatenLoginDatensatz- / Schlüsseldaten
wirLoginFlag aufzeichnen
überprüfenLoginSchlüsselsuchflagge
klarLoginKennzeichnen Sie die Behinderungslinie bei
addr_oBeendenAdresse mit Schlüssel gefunden
match_oBeendenErfolgssymbol für Schlüsselsuche

Tabelle 1. CAM-Schnittstelle


Unten in Fig. 3 ist ein Zeitdiagramm des Betriebs dieser Schnittstelle dargestellt, das zuerst die Aufzeichnung von drei Wörtern in CAM, dann eine erfolgreiche Suche, Löschung und erneute Suche zeigt:


Cam_diagramm
Abbildung 3. Zeitdiagramm der Schnittstelle zum CAM


Wir haben also eine Beschreibung von CAM. Fahren wir mit der Synthese fort.


Synthese


Wir werden in Xilinx ISE synthetisieren, um die Ergebnisse mit denen in XAPP1151 zu vergleichen.


W8v5


Abbildung 4. Frequenzabhängigkeit nach XST (Synthesizer als Teil von ISE) von der CAM-Tiefe für die 8-Bit-Datenbusbreite


W32v5


Abbildung 5. Frequenz nach XST im Verhältnis zur CAM-Tiefe für die 32-Bit-Datenbusbreite


W64v5


Abbildung 6. Frequenz nach XST im Verhältnis zur CAM-Tiefe für die 64-Bit-Datenbusbreite


In 6 gibt es keine Daten für Virtex5 , da CAM dieser Größe nicht in das vorhandene BRAM passte. Wir stellen außerdem fest, dass unser Ergebnis bei einer Breite von 64 Bit und einer Tiefe von 1024 etwas schlechter war als das der Implementierung auf SRL16. Fahren wir nun mit der Vivado-Synthese für den XC7K325T fort . Die Ergebnisse sind wie folgt:


W32k7


Abbildung 7. Frequenzabhängigkeit nach PnR (Platzierung von Blöcken auf dem Chip und Signalverfolgung) von der CAM-Tiefe für eine 32-Bit-Datenbusbreite


K7res


Abbildung 8. Verwendung von Ressourcen für verschiedene CAM-Tiefen für eine Datenbreite von 32 Bit in%


Es ist wichtig zu beachten, dass die Ergebnisse auf Vivado nach PnR erhalten wurden, was bedeutet, dass das Design keine Schwierigkeiten bei der Rückverfolgung hat.


TCAM


Wie oben erwähnt, war es kein besonderes Problem, mit diesem Ansatz von CAM TCAM zu kommen. Es reicht aus, einen Maskierungsbus für die Datenbits hinzuzufügen und ihn Stück für Stück an die Komparatoren zu verteilen, damit sie beim Vergleich der Daten mit dem Schlüssel deren Wert berücksichtigen. Eine solche Änderung führte nicht zu einem Frequenzabfall oder einer ernsthaften Erhöhung des Ressourcenverbrauchs, sodass wir TCAM kostenlos erhielten.


Schlussfolgerungen


So konnten wir die Aufgabe erledigen. Das resultierende Design ermöglicht es der 7. Xilinx-FPGA-Familie, ausreichend große CAM mit einer Frequenz über dem Ziel von 125 MHz zu empfangen. Das Ergebnis des Vergleichs mit XAPP1151 stellte sich für mich als unerwartet heraus. Ich ging davon aus, dass die Implementierung auf BRAM, obwohl sie in Bezug auf Ressourcen sehr teuer ist, die frontale Implementierung in der Häufigkeit überholen wird. Feiern Sie den Sieg jedoch nicht so früh, dieses Dokument beschreibt den Xilinx CAM IP-Kern, mit dem beispielsweise CAM mit einer Tiefe von 32K-Zellen und einer Frequenz von 155 MHz basierend auf BRAM erhalten werden kann. Dieses Ergebnis kann wahrscheinlich in der im Artikel vorgeschlagenen Version erzielt werden, entweder durch Hinzufügen der Stufen der Pipeline oder durch Sammeln großer CAM von kleinen, aber ich kann nicht sofort vorhersagen, ob es in den Chip passt. In Zukunft werde ich versuchen, etwas Ähnliches auf BRAM zu implementieren, aber vorerst vielen Dank für Ihre Aufmerksamkeit.

Source: https://habr.com/ru/post/de470892/


All Articles