11 Stimmen

Wie verwendet man Clock-Gating in RTL?

Ich gate einige Latch und Logik in meinem Design. Ich habe nicht viel Erfahrung mit Synthese und Platzierung & Routing. Was ist der richtige Weg, um Clock-Gating im RTL zu implementieren?

Beispiel1:

always_comb begin
    gated_clk  = clk & latch_update_en;
end

always_latch begin
    if(gated_clk) begin
         latch_data <= new_data;
    end
end

Beispiel2: Ich bin auf einige RTL-Beispiele gestoßen, als ich einige Recherchen über bewährte Verfahren beim Clock-Gating im RTL durchgeführt habe. Dieses Beispiel hat den obigen Code wie folgt implementiert:

clock_gator cg_cell (.clk(clk), .en(latch_update_en), .scan_en(scan_en_in), .gated_clk(gated_clk));

always_latch begin
    if(gated_clk) begin
         latch_data <= new_data;
    end

Was ist der Zweck der Verwendung einer benutzerdefinierten Clock-Gating-Zelle? Hat das Werkzeug Schwierigkeiten bei der Synthese, wenn clk direkt in einem always_comb-Block mit einem anderen Aktivierungssignal "und"-verknüpft wird? Ich habe das Gefühl, dass die Verwendung einer speziellen Clock-Gating-Zelle ein gängiger Ansatz zur Erzeugung eines gegateten Taktsignals ist. Ich versuche zu verstehen, warum dies der Fall ist.

14voto

Greg Punkte 17729

Was ist der richtige Weg, um Clock-Gating in RTL zu implementieren?

Das Clock-Gating-Signal sollte nur umschalten, wenn der Latch geschlossen ist, ansonsten besteht die Gefahr von Glitches und Metastabilitätsproblemen. Bei einem aktiv hohen Latch sollte das Gating-Signal bei der fallenden Flanke des Takts umschalten. Bei aktiv niedrigen Latches bei der steigenden Flanke.

Normalerweise würde man eine flankensensitive Flop verwenden, um latch_update_en zu halten, um Störungen am Gating-Signal zu vermeiden.

always_ff @(negedge clk)
  latch_update_en <= next_latch_update_en;

always_comb
    gated_clk = (* clock_gating = "clk" *) clk & latch_update_en;

always_latch
    if(gated_clk)
         latch_data <= new_data;

Erinnerung: Wenn Sie nur einen Latch-Entwurf haben: Flanken-Trigger-Flops sind nur Master/Slave-Latches

always_latch 
    if (clk)
      sync_latch_update_en <= next_latch_update_en;
always_latch 
    if (!clk)
      latch_update_en <= sync_latch_update_en;

Hat das Tool Probleme bei der Synthese, wenn der clk direkt in einem always_comb-Block mit einem anderen Enable-Signal "und"-verknüpft ist?

Die meisten Synthesen haben Probleme mit dem direkten UND-Verknüpfen eines Takts. Es ist nicht immer intuitiv, wie das Gating verwendet werden sollte. Ein Synthesizer hat oft viele UND-Gatter in der Bibliothek zur Auswahl, von denen jedes verschiedene Anstiegszeiten, Schiebezeiten und Lasten hat, die sich je nach Eingabekombinationen unterscheiden. Obwohl funktional identisch, ergeben A & B und B & A unterschiedliche Zeitresultate.

Das Instanziieren einer expliziten Zelle aus der Bibliothek des Synthesizers grenzt die Möglichkeiten für bekanntes und erwartetes Verhalten ein. Eine vordefinierte Clock-Gating-Zelle hat auch Attribute, die vom Synthesizer verwendet werden. Die Attribute enthalten Timing-Informationen zur Balancierung des Clock-Baums (Buffereinstellung im Design zur Verwaltung von Lasten und Parasiten).

Einige Synthesizer unterstützen das Setzen von Attribut-Tags in RTL (z. B. // Syntheseattribute oder (* Attribute *)), anstatt explizit eine Zelle instanzieren zu müssen. Es gibt keinen Standard dafür, wie dies gemacht wird, also schauen Sie in Ihre Bedienungsanleitung.

Was ist der Zweck der Verwendung einer benutzerdefinierten Clock-Gating-Zelle?

Die benutzerdefinierte Zelle ist eine vordefinierte Zelle in der Synthesebibliothek mit bekannten Timing-Informationen, Lastenausgleich und anderen Attributen. Mit diesen Informationen weiß der Synthesizer, wo und wie er die Pufferverzögerung im Clock-Baum hinzufügen oder kalibrieren soll. Dadurch wird sichergestellt, dass der nicht gegatete Flop die Taktkante nicht vor dem gegateten Flop sieht.

                 _____       _____
IN -------------|D   Q|-----|D   Q|--- OUT
                |     |     |     |
       |\ |\    |     |     |     |
     +-| >| >---|>    |   +-|>    |
     | |/ |/    |_____|   | |_____|
     |  ___               |
CLK -+-|   \              |
       | &  )-------------+   AUSGEWOGENER TAKT: korrekte Daten abgetastet
GATE --|___/

Ohne Anleitung könnte der gegatete Flop einen verzögerten Takt erhalten. Dieser Unterschied würde dazu führen, dass die falschen Daten abgetastet werden.

                 _____       _____
IN -------------|D   Q|-----|D   Q|--- OUT
                |     |     |     |
                |     |     |     |
     +----------|>    |   +-|>    |
     |          |_____|   | |_____|
     |  ___               |
CLK -+-|   \    |\ |\     |
       | &  )---| >| >----+   UNGEWOGENER TAKT: falsche Daten abgetastet
GATE --|___/    |/ |/

0voto

kevin998x Punkte 989

Lesen Sie Yu-Yun Dai Dissertation : Überprüfung und Synthese von Takt-gesteuerten Schaltungen, die besagt:

Die sequenzielle Äquivalenzprüfung (SEC) von taktgesteuerten Schaltungen ist erforderlich

Außerdem versuchen Sie https://github.com/YosysHQ/yosys-bigsim/blob/master/openmsp430/rtl/omsp_clock_gate.v, in dem der Code wie folgt eingefügt ist:

//----------------------------------------------------------------------------
// Urheberrechtsverletzungen (C) 2009, Olivier Girard
//
// Die Vervielfältigung und Verwendung in Quell- und Binärform, mit oder ohne
// Veränderung, sind gestattet unter folgenden Bedingungen:
//     * Kopien des Quellcodes müssen die obige Urheberrechtsvermerk
//       beachten, diese Liste von Bedingungen und den folgenden Haftungsausschluss.
//     * Kopien in binärer Form müssen den obigen Urheberrechtsvermerk
//       beachten, diese Liste von Bedingungen und den folgenden Haftungsausschluss
//       in der Dokumentation und/oder anderen Materialien, die mit der Verteilung bereitgestellt werden.
//     * Weder der Name der Autoren noch die Namen seiner Beitragenden
//       dürfen verwendet werden, um Produkte zu unterstützen oder zu bewerben
//       die von dieser Software abgeleitet sind, ohne ausdrückliche schriftliche Genehmigung.
//
// DIESE SOFTWARE WIRD VON DEN URHEBERRECHTLICHEN INHABERN UND BEITRAGENDEN "WIE BESEHEN"
// UND JEGLICHE AUSDRÜCKLICHE ODER STILLSCHWEIGENDE GEWÄHRLEISTUNG, EINSCHLIESSLICH, ABER NICHT BESCHRÄNKT AUF
// DIE STILLSCHWEIGENDEN GEWÄHRLEISTUNGEN DER MARKTFÄHIGKEIT UND DER EIGNUNG FÜR EINEN BESTIMMTEN ZWECK
// SIND ABGELEHNT. IN KEINEM FALL HAFTEN DER URHEBERRECHTLICHE INHABER ODER BEITRAGENDEN
// FÜR DIREKTE, INDIREKTE, ZUFÄLLIGE, SPEZIELLE, BEISPIELLOSER, 
// ODER FOLGESCHÄDEN (EINSCHLIESSLICH, OHNE EINSCHRÄNKUNG, BESCHAFFUNG VON
// ERSATZGÜTERN ODER DIENSTLEISTUNGEN; VERLUST VON NUTZUNG, DATEN ODER GEWINNEN; UND UNTERBRECHUNG DES GESCHÄFTES), DIE AUF JEDE HAFTUNGSTHEORIE ZURÜCKZUFÜHREN SIND, OB IN
// VERTRAG, STRENGE HAFTUNG ODER DELIKT (EINSCHLIESSLICH FAHRLÄSSIGKEIT ODER SONSTIGE)
// AUF EINE WEISE, DIE SICH AUS DER NUTZUNG DIESER SOFTWARE ERGIBT, AUCH WENN ÜBER DIE MÖGLICHKEIT DIESER SCHÄDEN INFORMIERT WURDE
//
//----------------------------------------------------------------------------
//
// *Dateiname: omsp_clock_gate.v
//                              
// *Modulbeschreibung:
//                       Generische Taktschrankeinheit für den openMSP430
//
// *Autoren:
//              - Olivier Girard,    olgirard@gmail.com
//
//----------------------------------------------------------------------------
// $Rev: 103 $
// $ZuletztGeändertVon: olivier.girard $
// $ZuletztGeändertAm: 2011-03-05 15:44:48 +0100 (Sa, 05 März 2011) $
//----------------------------------------------------------------------------

Modul omsp_clock_gate (

// OUTPUTs
    gclk,                      // Getakteter Clock

// INPUTs
    clk,                       // Uhr
    enable,                    // Takt aktivieren
    scan_enable                // Scan aktivieren (aktiv während des Verschiebens des Scans)
);

// OUTPUTs
//=========
output         gclk;           // Getakteter Clock

// INPUTs
//=========
input          clk;            // Uhr
input          enable;         // Takt aktivieren
input          scan_enable;    // Scan aktivieren (aktiv während des Verschiebens des Scans)

//=============================================================================
// TAKTSCHARNIER: LATCH + UND
//=============================================================================

// Taktschrankeinheit während der Scan-Verschiebung aktivieren
// (Das Gatter selbst wird während der Scan-Capture-Zeit überprüft)
wire    enable_in =   (enable | scan_enable);

// Das Aktivierungssignal einfangen
reg     enable_latch;
always @(clk oder enable_in)
  if (~clk)
    enable_latch <= enable_in;

// AND-Gatter
assign  gclk      =  (clk & enable_latch);

endmodule // omsp_clock_gate

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X