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 --|___/ |/ |/