芯片通常會用到一個寄存器陣列。用戶通過SPI, I2C之類的接口對寄存器進行讀寫操作,實現(xiàn)各個模塊的配置,狀態(tài)查詢等等。
如果不考慮功耗,CTS時工具會插入一個類似下面這樣結構的clock tree。不妨做個簡單估算。
假設寄存器陣列有128個8-bit寄存器。每個8-bit寄存器由8個DFF組成??偣?024個DFF。
假設每8個DFF工具插入一個CTB。128個8-bit寄存器就需要插入128個CTB。
假設每8個CTB又需要插入一個CTB來驅動。前一步插入的128個CTB需要再插入16個CTB驅動。
這16個CTB又需要再插入兩個CTB來驅動。
總共需要插入128+16+2=146個CTB。
假設接口為SPI,讀寫protocol是1位RW,7位地址,8位數(shù)據(jù)。每次讀寫都是16個SPI clock。假設SPI clock直接用做寄存器陣列時鐘(通常有片子里有OSC,需要SPI clock domain到OSC clock domain transfer。那是另一個技巧了。這里就不展開了)。如果不插入ICG,每次讀寫時1024個DFF + 146個CTB都switch 16個SPI clock,那可是不小的功耗,尤其是頻繁讀寫的場景。
上述這種實現(xiàn)方法比較“蠢”。我們知道,每次讀寫只能對一個寄存器進行操作,沒必要所有的寄存器都給時鐘?;谶@個樸素的想法,我們可以利用工具降低功耗。
寄存器陣列的結構有規(guī)律。綜合工具可以根據(jù)地址解碼插入ICG。假設插入的ICG驅動能力足夠,整個寄存器的clock tree會變成類似下面這樣的結構。
對寄存器陣列進行操作時,只有地址符合的寄存器ICG才會被打開,該寄存器的DFF才會得到時鐘。而其他地址不符合的寄存器ICG關閉,沒有時鐘,也就沒有switching power。這樣一來,每次寫操作實際只有一個寄存器會switching,大大減少了switching power。美中不足的是,對任何寄存器操作時ICG前面的CTB都會有時鐘,這部分clock tree仍消耗switching power。
寄存器寫操作的時候會改變寄存器內(nèi)容,需要時鐘鎖入新的數(shù)據(jù)。但是,對寄存器進行讀操作的時候,寄存器內(nèi)容不改變,寄存器不需要時鐘。這個特點工具是不知道的,但是designer可以利用起來。一個很自然的想法就是只在寄存器寫操作放clock進來。
其次,雖然每個SPI寫操作需要16個SPI clock。但是實際上寄存器陣列只需要在地址,數(shù)據(jù)都收到后給一個寫時鐘脈沖就可以了,不需要多個時鐘反復寫幾次。
基于上面這兩個想法,我們可以在寄存器陣列的時鐘入口處加一個ICG。這個ICG只在寫操作的時候打開,且只在地址數(shù)據(jù)都收到后打開一個時鐘周期,放一個時鐘脈沖過去。這樣整個clock tree的switching power就大大降低了。
寄存器陣列時鐘入口處的ICG要在RTL里加。
寫RTL的時候就考慮功耗并手動插入ICG是實現(xiàn)低功耗的最有效手段。再加上工具輔助優(yōu)化一下,就很完美了。
審核編輯:黃飛
-
寄存器
+關注
關注
31文章
5294瀏覽量
119814 -
SPI
+關注
關注
17文章
1688瀏覽量
91201 -
時鐘設計
+關注
關注
0文章
27瀏覽量
10901 -
時鐘脈沖
+關注
關注
0文章
19瀏覽量
12658
發(fā)布評論請先 登錄
相關推薦
評論