關於一般的門控時鍾結構,首先來看看為什么要有門控時鍾
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~