門控時鐘是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: