Wie verwende ich Clock Gating in RTL?

Ich schalte einiges einverriegeln und Logik in meinem Design. Ich habe nicht viel Erfahrung in Synthese und Ort & Route. Was ist der richtige Weg, um Clock Gating in RTL zu implementieren?

Beispiel 1:

always_comb begin
    gated_clk  = clk & latch_update_en;
end

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

Beispiel 2: Ich bin über RTL-Beispiele gestolpert, als ich nach bewährten Methoden für RTL-Clock-Gating gesucht habe. In diesem Beispiel wurde der obige Code folgendermaßen 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
end

Was ist der Zweck der Verwendung einer benutzerdefinierten Clock-Gating-Zelle? Hat das Tool Schwierigkeiten bei der Synthese, wenn clk in einem always_comb-Block mit einem anderen Freigabesignal direkt "und" verknüpft ist? Ich habe das Gefühl, dass die Verwendung einer speziellen Clock-Gate-Zelle ein Standardansatz für das generierte Gate-Clock-Signal ist. Ich versuche zu verstehen, warum dies der Fall ist.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage