首页 > 技术知识 > 正文

clock gating和power gating是降低芯片功耗的常用手段,相比power gating设计,clock gating的设计和实现更为简单,多在微架构、RTL coding阶段即可充分考虑,在综合时(compile_ultra -gate_clock)即可自动mapping到clock gating结构上去。本文先讲解clock gating,ICG的基本结构如下图所示:低功耗之门控时钟设计-低功耗怎么实现

门控时钟电路有效的降低了动态功耗,因为其减少了时钟树的翻转行为、减少了寄存器clock pin的翻转行为、减少了大量MUX逻辑消耗的功耗,一般可以节省20%-60%的功耗,同时也节省了MUX面积。

门控时钟单元分成两种,一种是带锁存器(latch based)的门控时钟单元,一种是不带有锁存器(latch free)的门控时钟单元。latch based的门控时钟单元能避免毛刺,因此更推荐使用。

门控时钟又分为离散的和集成的(ICG)两种:

离散的CG单元1)带latch的CG(默认)

set_clock_gating_style -sequential_cell  latch

2)不带latch的CG

set_clock_gating_style -sequential_cell  none

集成的CG单元(ICG)

set_clock_gating_style -negtive_edge_logic “integrated”

通常,在执行命令compile_ultra -gate_clock前需要设置好clock gating的相关配置选项,具体选项如下:

低功耗之门控时钟设计-低功耗怎么实现1 set_clock_gating_style的options解析如下:

-sequential_cell  none | latch

1)-sequential_cell latch(默认)指带latch的CG(latch based style), 并可指定使用具体某个latch cell,比如:-sequential_celllatch:lib_cell。

2)-sequential_cellnone指不带latch的CG(latch free style),比如:

与门做CG,时钟使能为1时钟穿透AND,但posedge trigger存在毛刺;

或门做CG,时钟使能为0时钟穿透OR,但negesge trigger存在毛刺;

-minimum_bitwidth  minsize_value

为了节省gating cell的数量,需达到一定寄存器数量的register bank才使用gating cell。

-setup setup_value  指定建立时间

-hold hold_value  指定保持时间

-positive_edge_logic {cell_list | integrated [active_low_enable]

[invert_gclk]}

1) {cell_list}用于指定“上升沿”触发使用的CG单元。需要注意的是-sequential_cell指定的是否有latch应该和cell_list的对应电路是否含有latch保持一致,如:

set_clock_gating_style -sequential_cell latchpositive_edge_logic {latch and}

set_clock_gating_style -sequential_cell nonepositive_edge_logic {or}

2) {integrated}用于表明使用上升沿触发的ICG单元。

如下图所示,该ICG单元就是一个pre-conctrolled positive-edge triggered clock gating latch。

低功耗之门控时钟设计-低功耗怎么实现2

-negative_edge_logic {cell_list | integrated [active_low_enable]

[invert_gclk]}

1) {cell_list}用于指定“下降沿”触发使用的CG单元。需要注意的是-sequential_cell指定的是否有latch应该和cell_list的对应电路是否含有latch保持一致,如:

set_clock_gating_style -sequential_cell latch -negtive_edge_logic {latch or}

set_clock_gating_style -sequential_cell none -negtive_edge_logic {and}

如下图,-sequential_cell none指定latch-free模式,但是cell_list却指定了latch、and/or, 这种情况下,DC工具仍然会综合出latch-based clock-gating的电路。

低功耗之门控时钟设计-低功耗怎么实现3

2) {integrated}用于表明使用下降沿触发的ICG单元。如下图所示,该ICG单元就是一个pre-conctrolled negative-edge triggered clock gating latch。

低功耗之门控时钟设计-低功耗怎么实现4

-control_point  none | before | after

对于DFT测试电路,为了满足电路可控,需要引入TE信号来控制latch的使能端。before就是在Latch之前插入或门,将TE信号和时钟使能信号或起来然后连接到Latch的D端。同理,after就是在Latch之后插入或门,将TE信号和Latch的Q端或起来然后连接到IGG的AND门。

-num_stages num_stages_count

工具默认只使用一级门控时钟,而使用多级门控时钟可进一步节省面积、降低功耗。如下图,a信号被三个CG单元共享,那么将a信号做成第一级CG,b、c、d做成第二级CG。这样,增加了一个CG但减少了3个与门,同时节省了组合逻辑和第二级的CG的功耗。

set_clock_gating_style -num_stages 2低功耗之门控时钟设计-低功耗怎么实现5

那么如何编写门控时钟的RTL代码风格呢?

第一种风格:

低功耗之门控时钟设计-低功耗怎么实现6

综合出来电路有32个MUX2选择器:

低功耗之门控时钟设计-低功耗怎么实现7

我们换一种写法,DC工具就可将load_cond作为Latch的使能,从而一个clock gating cell便取代了32个MUX2,节省了大量面积的同时,还节省了32个寄存器的动态功耗,32MUX2组合逻辑的功耗,也节省了时钟树上buffer的功耗。

低功耗之门控时钟设计-低功耗怎么实现8

那么如何保证ICG中Latch的时序呢?

除in2reg、reg2reg、reg2out、in2out类型路径外,我们会经常看到reg2cgate的setu/hold检查,即clock gate上enable信号要比clock信号提前到达一段时间setup和保持一段时间hold。

通常clock gate上的setup较难收敛,如下图

register CK端作为launch clock发起端,latch的CK端作为capture捕获端,它们之间天然会存在skew k,即clock tree必然不balance。

Latch的时序检查只有半个时钟周期;

register Q到Latch EN的combo逻辑延迟;

解决办法:

一般将clock gate 单元放在寄存器附近以减小skew。

也可以采用set_clock_gating_check,加大对clock gating时序约束。低功耗之门控时钟设计-低功耗怎么实现9

对于clock gating cell,synthesis时就会插入,和CTS没太大关系,一般只要确保clock timing check打开的就行。另外,CTS工具会对其做clone、declone操作。

ICG cell Clone:  同一个ICG单元控制的寄存器较多或者分布不均匀时,就会导致ICG时钟连线过长,可通过clone ICG cell进行优化;

ICG cell De-Clone: 同一个ICG单元控制的寄存器较少,导致ICG cell数量过多,可通过De-clone ICG cell进行优化;

转载:全栈芯片工程师

猜你喜欢