Como usar o clock gating em RTL?

Estou relógio bloqueando algunsrobusto e lógica no meu design. Não tenho muita experiência em síntese, lugar e rota. Qual é a maneira correta de implementar o clock gating em RTL?

Exemplo 1:

always_comb begin
    gated_clk  = clk & latch_update_en;
end

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

Exemplo2: Eu me deparei com exemplos de RTL enquanto fazia algumas pesquisas sobre boas práticas no clock clock de RTL. Esse exemplo implementou o código acima desta maneira:

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

Qual é o propósito de usar a célula de clock clocking personalizada? A ferramenta tem dificuldade na síntese se clk estiver diretamente "e" - em um bloco always_comb com outro sinal de ativação? Estou com a sensação de que o uso de células especiais de clock gating é uma abordagem padrão para o sinal de clock gated gerado. Estou tentando entender por que esse é o caso.

questionAnswers(2)

yourAnswerToTheQuestion