二、RTL級低功耗設計
前面介紹了系統級的低功耗設計,換句話說就是在系統級降低功耗可以考慮的方面。系統級的低功耗設計,主要是由系統級設計、具有豐富經驗的人員實現,雖然還輪不到我們設計,我們了解一下還是比較好的。我們前端設計人員的重點不在系統級設計上面,而是在RTL級(及綜合)上面。下面我們就來介紹RTL編碼與邏輯綜合的低功耗設計,重點是門控時鍾和操作數隔離技術。今天主要是講解操作數和一些常見的方法;門控時鍾由於內容比較多,所以寫在后面。
(1)並行與流水的選擇
對於某一個功能模塊,我們可以通過並行的方式進行實現,也可以通過流水線的方式進行實現,這兩種方法都是面積換速度,不過在一定的場合下可以降低功耗,需要靈活應用,下面就簡要地介紹一下這兩種方法(的使用)。
·並行處理常用於數字信號處理部分。采用並行處理,可以降低系統工作頻率,從而可能降低功耗。例如下圖中:
用兩個乘法器來取代原設計中的一個乘法器。這樣,時鍾頻率可以降低,系統的整體功耗會降低。采用這種方法,要在增加的面積與節省的功耗之間進行權衡。
·流水線技術可以將一個較長的組合路徑分成M級流水線。路徑長度縮短為原始路徑長度的1 /M。這樣,一個時鍾周期內充/放電電容變為C/M。如果在加入流水線之后,時鍾速度不變,則在一個周期內,只需要對C/M進行充/放電,而不是原來對C進行充/放電。因此,在相同的速度要求下,可以采用較低的電源電壓來驅動系統。這樣,系統的整體功耗可能會降低。例如對於下面的流水線設計:
假設在一個設計中,關鍵路徑是一個32bit X 32bit的乘法器。假設該乘法器的整體電容為C,工作頻率為f。
->不加流水線時,要達到此工作頻率,工作電壓應該為V。
->當采用流水線方式時,該路徑被分成兩部分。對於每一部分,整體電容變為C/2。這樣,如果要達到原來的工作頻率f,工作電壓可以降為βV,這里β<1. 因此,整個系統可以工作在βV電壓下,整體功耗變為原來的β^2倍,即:
(2)資源共享與狀態編碼
對於設計比較多算術運算的設計,如果有同樣的操作在多處使用,那我們就可以避免相應的運算邏輯在多個位置重復出現。例如下面是沒有進行共享資源的代碼:
進行資源共享后的代碼如下所示:
上述代碼中,在各分支中只使用一個比較器和一個算術比較器就可以實現相同的功能,因此極大地減少了功耗。
此外,對於一些變化非常頻繁的信號,我們利用數據編碼來降低開關活動(例如,用格雷碼比用二進制碼翻轉更少,功耗更低)。
(3)操作數隔離
下面我們重點介紹另外一種常用的方法——操作數隔離(operand isolation,簡稱OI)的方法。
①操作數隔離的原理
我們先來看一個電路,如下所示:
上面的電路圖中,當SEL_0≠1,SEL_1≠0時,加法器Add_0的運算結果並不能通過mux_0和mux_1到達寄存器reg_0的輸入端口,也就是說寄存器reg_0將不會保存加法器Add_0的運算結果,這就意味着加法器Add_0的運算是不必要的。為了節省功耗,我們可以用操作數分離的方法,在某些條件下,使加法器不工作,保持靜態,進行操作隔離之后的電路如下所示:
因此,操作數隔離的原理就是:如果在某一段時間內,數據通路的輸出是無用的,則將它的輸入置成個固定值,這樣,數據通路部分沒有翻轉,功耗就會降低。
下面我們再舉一個例子,對於下面的電路:
上圖所示的乘法器中,如果知道乘法操作延遲超過半個時鍾周期,則將乘法器的輸出與反相時鍾進行與操作,可以保證在時鍾前半周期乘法器的輸出不會導致加法器的翻轉。這就是操作數隔離技術的基本思想。不過需要注意的是,采用這種方法,會增加面積,並影響到DFT,所以在使用前應該對它的利弊進行權衡。
②OI的物體選擇
OI並不是什么時候都可以進行使用的(也就是說不是所有的對象(物體)都符合操作數隔離的要求)。此外操作數隔離主要是:滿足一定條件下,通過指定操作數隔離的物體來實現的;指定操作數隔離的物體可以通過EDA工具自動執行(我們一般使用這種方法),也可以通過我們手動進行。下面我們就分別介紹一下這兩種方式。
·EDA工具自動指定操作數隔離的物體
默認情況下,如果操作數隔離的物體滿足下列條件,Power Compiler自動選擇它(們):
1.OI物體是算術運算器或層次組合單元。
2.OI物體的輸出是選擇性地使用。
3.運算器必須有非零的翻轉率。
4.僅當工具進行功耗估算后,用操作數隔離具有潛在的功耗可節省,才把它(們)作為OI物體。
自動進行操作數隔離的腳本如下:
set do_operand_isolation true
set_operand_isolation_style
read_saif
……
compile
·手動指定操作數隔離的物體
除了使用EDA工具自動選擇IO物體,我們也可以手動進行指定,然后進行操作數隔離。手動完成操作數隔離大致可以分為兩步:
A:設定操作數隔離的風格為手動(用戶自定義模式):
在約束腳本中加入下面的命令,說明是使用手動的方式指定IO物體:
set_operand_isolation_style -user_directives
B:手動指定IO物體:
手動指定IO物體有下面兩種方式:
1.用命令指定OI物體:set_opreand_isolation_cell,例如:
set_operand_isolation_cell [get_cells U1]
2.在RTL代碼中加綜合指引(pragma)
例如:下面的RTL中加入了綜合指令“//synopsys_isolate_operands":
if(c2 == 1’b1)
o = a + b ;
else
o = c + d ; //synopsys_isolate_operands
完成前面A、B兩步的設置之后,在使用compile命令進行綜合時,如果手動指定的IO物體滿足前面的三點:
1.OI物體是算術運算器或層次組合單元。
2.OI物體的輸出是選擇性地使用。
3.運算器必須有非零的翻轉率。
那么綜合器就會進行操作數隔離。
③操作數隔離的范圍
有些時候,我們需要在整個設計中指定某些模塊要做操作數隔離,某些模塊不要做操作數隔離。這時候我就可以使用set_operand_isolation_scope命令來實現了。例如下面的分層模塊中:
我們只對SUB2模塊中的操作數做隔離,其他的模塊不做操作數隔離,那么就可以使用下面的示例腳本:
set_operand_isolation_scope [get_designs tops] false
set_operand_isolation_scope [get_designs sub1] false
set_operand_isolation_style
······
④隔離邏輯的設置
實現操作數隔離需要插入相應的隔離邏輯,比如與門或者或門之類的。這些邏輯可以由EDA自動選擇,也可以由我們自己手動指定。下面就來介紹這兩種方式。
·默認的EDA工具選擇
默認情況下,隔離邏輯由工具自動選擇。工具根據輸入數據連線的靜態概率(SP)來選擇適合的隔離邏輯為“AND'’門或“OR”門。使用的命令如下所示:
set_operand_isolation_style -logic adaptive
如果SP > 0.5,選擇“OR”門作為隔離邏輯
如果SP < 0.5,選擇“AND”門作為隔離邏輯
·手動
我們可以手工地選擇隔離邏輯,例如下面命令指定用“AND”門作為隔離邏輯:
set_operand_isolation_style -logic AND
通過前面的描述,我們知道操作隔離的實現可以通過EDA全自動化實現,也可以通過我們指定OI物體的半自動化實現。完成操作數隔離后,我們可以用命令報告設計中的操作數隔離,例如:
report -operand_isolation -isolated -verb命令顯示如下的信息:
⑤操作數隔離的復原
加入隔離邏輯之后,如果時序變差達到不能滿足要求的情況,我們就要復原原來的邏輯。復原的方法也是有自動和手動的方法。
·自動
一般情況下,如果加了隔離邏輯后,設計的時序變差了,即當WNS(worst negative slack)大於指定的slack時,EDA工具會使設計自動復原到原來沒有操作數隔離的狀態。例如下面的腳本適用於如果WNS大於0. 5時,設計自動復原到原來的狀態:
set_operand_isolation_slack 0.5
compile
compile -inc
·手動
我們也可以用手工的方法復原操作數隔離。用手工的方法進行操作數隔離的復原是在指定的時序路徑上刪除OI邏輯。這時候不考慮slack。需要執行增量編輯去刪除OI邏輯。腳本如下:
remove_operand_isolation -from <starting_point> to <end_point>
compile -inc
······
最后,提供一個完整的加入操作數隔離的示例腳本,如下所示,使用了默認的隔離邏輯類型和操作數隔離的自動恢復:
set do_operand_isolation true
read_verilog mydesign.v
current_design top
link
create_clock -p 10 [get_ports clk]
set_operand_isolation_style
set_operand_isolation -slack 0.1
compile
report_operand_isolation -verb -isolated
······