門控時鐘是RTL級進行低功耗設計的最常用方法,能夠有效降低動態功耗。在實際使用中,一般用ICG(集成門控時鐘單元)來完成clock gating。ICG電路和時序如下:
通常來說,工藝庫已經集成了ICG,在做門控時鐘的時候其實不用考慮那么多。如果在實際設計中,工藝庫未提供ICG,需要自己搭建一個門控時鐘電路,那么在布局布線的時候可能要注意,不能將期間擺的太遠,否則線延遲等會讓這個結構失去其意義。
當門控信號控制了邏輯單元中時鐘信號的路徑時,我們會進行Clocl Gating check。我們根據下圖了解一些定義,這樣比較直觀:
這里我們需要明確什么樣的電路會被工具分析成為門控時鐘:
- Gating cell的輸出是作為時鐘信號進行使用,即連接到了后級邏輯單元的時鐘端口。
- Gating pin的輸入非時鐘信號;若Gating pin的輸入為時鐘信號,則其必須不連接后級邏輯單元的時鐘端口。
- 對于上圖簡單的與門控制,工具可以較好的推斷;但對于復雜結構,需要自己添加約束來進行檢查。
運用提到的定義,對于上圖來說,CLKB才是clock signal。接下來我們以這個電路為例看看如何進行clock gating check(對于這個與門來說,有些類似于data to data check):
首先定義兩個時鐘
create_clock -name CLKA -period 10 -waveform {0 5}? [get_ports CLKA]
create_clock -name CLKB -period 10 -waveform {0 5}? [get_ports CLKB]
我們要保證時鐘切換的時候不能產生一些毛刺,也不能產生對時鐘有影響的結果。對于此電路來說,gating cell是一個與門,那么gating pin的信號變化只能發生在clock pin的低電平狀態。則setup check要求門控信號在時鐘信號變高前變化;hold check要求門控信號只能在時鐘下降沿之后進行改變。時序圖如圖,
gating pin的變化要落在5-10ns間,才能滿足門控時鐘的要求。
我們看看setup check的時序報告:
同樣地,我們可以看看hold check的時序報告:
可以看到,在5ns時進行hold check是非常嚴苛的。由于gating signal的變化過于迅速,導致hold check失敗。這個問題可以用我們前面提到的半周期進行處理。我們將寄存器的采樣邊沿改為負沿:
這樣的話,gating signal在負沿launch,留給時序檢查的周期就剩下了半個周期,較好滿足hold time:
?