The following 2 approaches can be used independently:
a) Manual clockgate insertion
If you want to insert a clockgate in RTL, it looks like this:
cg_libcell u_cg0(
.enable (enable),
.clk_i (clk),
.clk_o (clk_gated)
);
Nothing special, just like any other instantiation.
Keep in mind that at synthesis you use a standard cell library that contains this cell 'cg_libcell'.
For simulation you need to compile a behavioral for this cell.
b) Synthesizer clock gate insertion (fine-grain insertion)
For options in your synthesis script it is better to start from a template script generated by RTL Compiler itself.
I believe "write_template" can do the trick.
It offers many options, I am sure at least one of them generates a script for clockgate insertion.
In this script you will find the enabling of clockgating, the choice for which cell to use, and the minimal amount of
registers the clockgate has to control.
Make sure that your RTL does have constructs that can actually be controlled by a clockgate:
- change or keep the register value
In RTL you see nothing in the clockpath itself.
Usually the synthesizer finds more clockgate possibilities than expected.