ICG主要用于寄存器的时钟端,当寄存器的数据端的数据无效时,通过控制ICG将寄存器的时钟端赋0或1,从而寄存器的输出端保持不变,避免了信号的翻转,进而降低了动态功耗。
在芯片设计中,可以通过手动在代码中插入门控时钟对某个模块的时钟进行控制。对单个寄存器的时钟一般不通过手动插ICG的方式,而是通过EDA工具自行插入。在HDL设计中,合理的代码编码风格可以通过EDA工具(需要设置自动插入ICG命令set_clock_gating_style -sequential_cell latch)自行推导生成门控时钟模块。
推荐代码方式:
always @ (posedge CLK or negedge rst_n)begin if(~rst_n) Dout <= 3'h0; else if(EN) Dout <= Din;end
上述代码对应的电路图:
不推荐代码方式:
always @ (posedge CLK or negedge rst_n)begin if(~rst_n) Dout <= 3'h0; else if(EN) Dout <= Din; else Dout <= 3'h0;end
总结:
从上述2段代码中可以看到,在时序逻辑中当条件语句非成对出现(即当某一条件成立时保持不变),如第一段代码中else的缺失,也即是寄存器的输出在~EN条件时保持不变,可以生成ICG单元。反之,第2二段代码中的else不是保持而是输出一个值,因此当~EN条件时Dout还是会翻转的,因此不能产生ICG单元。
综上所述,在时序逻辑中,只有在某一条件下寄存器输出保持不变,EDA才有可能推断出使用ICG时钟门控单元。
留言与评论(共有 0 条评论) “” |