关于latch的门控时钟
关于一般的门控时钟结构,首先来看看为什么要有门控时钟
Clock tree consume more than 50 % of dynamic power. The components of this power are:
1) Power consumed by combinatorial logic whose values are changing on each clock edge
2) Power consumed by flip-flops and
3) The power consumed by the clock buffer tree in the design.
通常用的门控时钟有两种
1)latch-free clock gating
第一种门控时钟就是简单的一个使能信号通过一个and gate与时钟与起来,这种做法的弊端就是容易有这种组合逻辑的方式出去的时钟出现毛刺等讨厌的情况,但如果要求不高的话这也不失为一种方法。如果输出的gated_clk是用来上升沿采数的话就可以让一个active low的en信号通过一个或门与clk或起来,这样输出的信号应该不会出现上图所示的那种让时钟的占空比变小情况;反过来,如果输出的gated_clk在后面是用来下降沿采数的话就可以让一个active high的en信号通过一个与门与clk与起来,这样输出的时钟应该也不会有让占空比变大的情况发生,基本能满足采样的要求。
用and gate的波形收到毛刺影响可能下图这样的
但是或门的逻辑就不会这样,如下图,但是毛刺还是会有影响
2)latch-based clock gating
latch的这种gating的结构比较特殊, 如图
这个东西还是基于synopsys的自己的gating clock的逻辑处理出现的一种方式
这个同学的仿真波形图是这样的(只注意en clk q 和gclk)latch这里为低有效,即latch的en端(即clk)为低的时候,latch的q端是可以变化的,但是高的时候就会被latch住。就是基于此原理,输出的latch时钟基本就不会有问题,但是由于latch毕竟是电平敏感的器件,所以这个东西按照组合逻辑来看,还是会怕一些毛刺,但是时钟只要质量可靠,基本就不会有问题。关于这个同学,可以显示的写出,也可以用一种逻辑的方式声明,通过DC的工具语言让工具能够认出来,之后综合的时候也可以出现latch。
显示的写出就是这样。
1 module latch_clk( 2 input wire clk 3 , input wire en 4 , output wire gclk 5 ); 6 7 reg q; 8 always @(*) begin // latch 9 if(~clk) q = en ; 10 else q = q ; 11 end 12 assign gclk = q & clk; 13 endmodule
而不显示的写出,靠工具来综合的时候,rtl代码就要这么写。
1 module gating_clk( 2 input wire clk 3 , input wire in 4 , output wire out 5 ); 6 7 reg q_2 ; 8 wire vld = in ^ q_2; 9 10 always @(posedge clk) begin 11 if(vld) q_2 <= in ; 12 end 13 assign out = q_2; 14 endmodule
这样的话dc综合脚本里面就要加上或者改掉这样几句话,可以达到同样的效果了就
1 set_clock_gating_style -sequential_cell none -positive_edge_logic {latch and} \ 2 -minimum_bitwidth 1 \ 3 -no_sharing 4 5 elaborate ${topDesign} -gate_clock 6 7 propagate_constraints -gate_clock 8 9 compile_u -gate_clock -no_autoungroup -timing_high_effort_script -no_boundary_optimization
这个clock gating 的问题怎么说呢,我还是花了两天时间仔细看了一下的,但是这里有个问题就是首先你必须要在节省功耗的情况下再用这种结构,不然latch的仿真据说是很容易出问题的,而后端的综合脚本里面通常也是dontuse latch的器件的,而且这是重中之重的时钟所以用的时候一定要慎重再慎重,但是用法大体这里已经说明白了,大概就这样,over~