soc设计中常用latch来做时钟门控,它的rtl描述如下:
input EN;
input clk;
input TE;
output E_clk;always @(*) beginif (clk==1'd0)E_latch = EN | TE;
endassign E_clk = E_latch & clk;
实际soc实现会把上面代码中latch和与操作换成专用CLKLANQ的libcell,TE为testMode下信号,funcMode下为0.
对应的时序图如下:
always @(negedge clk) beginE_latch <= EN | TE;
endassign E_clk = E_latch & clk;
那么得到的时序图和上图完全一致。
那这两种做法到底有什么区别呢?
从功能上看不出有什么区别,那就要从实现上分析,两种cell哪个更快(transition,Propagation Delay),哪个更容易收timing?
显然latch结构简单,同样工艺下latch可以做的比Flip-Flop更快。更快就意味这更好的时钟属性。
从timing分析,用latch对setup更友好,因为用latch锁存EN | TE可以做setup的整周期check,而用flip-flop只能做clk的半周期check;而用flip-flop的hold是比较宽松的,有半个时钟周期留给hold。
对于高频时钟来讲setup更难meet,这也是现在高速时钟ICG都用Latch的原因。早期低速时钟且对clk质量要求不高的的ICG也是可以用flip-flop。
下面解释一下为什么latch明明用的clk低电平触发,为什么可以做整周期的setup检查?
原因就在于latch是电平触发,在整个clk低电平都可以capture,只需要在clk高电平到来之前EN|TE满足setup,就可以稳定采样并锁存,所以可以使用整周期setup check