數(shù)字IC低功耗設(shè)計(jì)入門(mén)(四)——RTL級(jí)低功耗設(shè)計(jì)
掃描二維碼
隨時(shí)隨地手機(jī)看文章
二、RTL級(jí)低功耗設(shè)計(jì)
前面介紹了系統(tǒng)級(jí)的低功耗設(shè)計(jì),換句話(huà)說(shuō)就是在系統(tǒng)級(jí)降低功耗可以考慮的方面。系統(tǒng)級(jí)的低功耗設(shè)計(jì),主要是由系統(tǒng)級(jí)設(shè)計(jì)、具有豐富經(jīng)驗(yàn)的人員實(shí)現(xiàn),雖然還輪不到我們?cè)O(shè)計(jì),我們了解一下還是比較好的。我們前端設(shè)計(jì)人員的重點(diǎn)不在系統(tǒng)級(jí)設(shè)計(jì)上面,而是在RTL級(jí)(及綜合)上面。下面我們就來(lái)介紹RTL編碼與邏輯綜合的低功耗設(shè)計(jì),重點(diǎn)是門(mén)控時(shí)鐘和操作數(shù)隔離技術(shù)。今天主要是講解操作數(shù)和一些常見(jiàn)的方法;門(mén)控時(shí)鐘由于內(nèi)容比較多,所以寫(xiě)在后面。
(1)并行與流水的選擇
對(duì)于某一個(gè)功能模塊,我們可以通過(guò)并行的方式進(jìn)行實(shí)現(xiàn),也可以通過(guò)流水線的方式進(jìn)行實(shí)現(xiàn),這兩種方法都是面積換速度,不過(guò)在一定的場(chǎng)合下可以降低功耗,需要靈活應(yīng)用,下面就簡(jiǎn)要地介紹一下這兩種方法(的使用)。
·并行處理常用于數(shù)字信號(hào)處理部分。采用并行處理,可以降低系統(tǒng)工作頻率,從而可能降低功耗。例如下圖中:
用兩個(gè)乘法器來(lái)取代原設(shè)計(jì)中的一個(gè)乘法器。這樣,時(shí)鐘頻率可以降低,系統(tǒng)的整體功耗會(huì)降低。采用這種方法,要在增加的面積與節(jié)省的功耗之間進(jìn)行權(quán)衡。
·流水線技術(shù)可以將一個(gè)較長(zhǎng)的組合路徑分成M級(jí)流水線。路徑長(zhǎng)度縮短為原始路徑長(zhǎng)度的1 /M。這樣,一個(gè)時(shí)鐘周期內(nèi)充/放電電容變?yōu)镃/M。如果在加入流水線之后,時(shí)鐘速度不變,則在一個(gè)周期內(nèi),只需要對(duì)C/M進(jìn)行充/放電,而不是原來(lái)對(duì)C進(jìn)行充/放電。因此,在相同的速度要求下,可以采用較低的電源電壓來(lái)驅(qū)動(dòng)系統(tǒng)。這樣,系統(tǒng)的整體功耗可能會(huì)降低。例如對(duì)于下面的流水線設(shè)計(jì):
假設(shè)在一個(gè)設(shè)計(jì)中,關(guān)鍵路徑是一個(gè)32bit X 32bit的乘法器。假設(shè)該乘法器的整體電容為C,工作頻率為f。
->不加流水線時(shí),要達(dá)到此工作頻率,工作電壓應(yīng)該為V。
->當(dāng)采用流水線方式時(shí),該路徑被分成兩部分。對(duì)于每一部分,整體電容變?yōu)镃/2。這樣,如果要達(dá)到原來(lái)的工作頻率f,工作電壓可以降為βV,這里β<1. 因此,整個(gè)系統(tǒng)可以工作在βV電壓下,整體功耗變?yōu)樵瓉?lái)的β^2倍,即:
(2)資源共享與狀態(tài)編碼
對(duì)于設(shè)計(jì)比較多算術(shù)運(yùn)算的設(shè)計(jì),如果有同樣的操作在多處使用,那我們就可以避免相應(yīng)的運(yùn)算邏輯在多個(gè)位置重復(fù)出現(xiàn)。例如下面是沒(méi)有進(jìn)行共享資源的代碼:
進(jìn)行資源共享后的代碼如下所示:
上述代碼中,在各分支中只使用一個(gè)比較器和一個(gè)算術(shù)比較器就可以實(shí)現(xiàn)相同的功能,因此極大地減少了功耗。
此外,對(duì)于一些變化非常頻繁的信號(hào),我們利用數(shù)據(jù)編碼來(lái)降低開(kāi)關(guān)活動(dòng)(例如,用格雷碼比用二進(jìn)制碼翻轉(zhuǎn)更少,功耗更低)。
(3)操作數(shù)隔離
下面我們重點(diǎn)介紹另外一種常用的方法——操作數(shù)隔離(operand isolation,簡(jiǎn)稱(chēng)OI)的方法。
①操作數(shù)隔離的原理
我們先來(lái)看一個(gè)電路,如下所示:
上面的電路圖中,當(dāng)SEL_0≠1,SEL_1≠0時(shí),加法器Add_0的運(yùn)算結(jié)果并不能通過(guò)mux_0和mux_1到達(dá)寄存器reg_0的輸入端口,也就是說(shuō)寄存器reg_0將不會(huì)保存加法器Add_0的運(yùn)算結(jié)果,這就意味著加法器Add_0的運(yùn)算是不必要的。為了節(jié)省功耗,我們可以用操作數(shù)分離的方法,在某些條件下,使加法器不工作,保持靜態(tài),進(jìn)行操作隔離之后的電路如下所示:
因此,操作數(shù)隔離的原理就是:如果在某一段時(shí)間內(nèi),數(shù)據(jù)通路的輸出是無(wú)用的,則將它的輸入置成個(gè)固定值,這樣,數(shù)據(jù)通路部分沒(méi)有翻轉(zhuǎn),功耗就會(huì)降低。
下面我們?cè)倥e一個(gè)例子,對(duì)于下面的電路:
上圖所示的乘法器中,如果知道乘法操作延遲超過(guò)半個(gè)時(shí)鐘周期,則將乘法器的輸出與反相時(shí)鐘進(jìn)行與操作,可以保證在時(shí)鐘前半周期乘法器的輸出不會(huì)導(dǎo)致加法器的翻轉(zhuǎn)。這就是操作數(shù)隔離技術(shù)的基本思想。不過(guò)需要注意的是,采用這種方法,會(huì)增加面積,并影響到DFT,所以在使用前應(yīng)該對(duì)它的利弊進(jìn)行權(quán)衡。
②OI的物體選擇
OI并不是什么時(shí)候都可以進(jìn)行使用的(也就是說(shuō)不是所有的對(duì)象(物體)都符合操作數(shù)隔離的要求)。此外操作數(shù)隔離主要是:滿(mǎn)足一定條件下,通過(guò)指定操作數(shù)隔離的物體來(lái)實(shí)現(xiàn)的;指定操作數(shù)隔離的物體可以通過(guò)EDA工具自動(dòng)執(zhí)行(我們一般使用這種方法),也可以通過(guò)我們手動(dòng)進(jìn)行。下面我們就分別介紹一下這兩種方式。
·EDA工具自動(dòng)指定操作數(shù)隔離的物體
默認(rèn)情況下,如果操作數(shù)隔離的物體滿(mǎn)足下列條件,Power Compiler自動(dòng)選擇它(們):
1.OI物體是算術(shù)運(yùn)算器或?qū)哟谓M合單元。
2.OI物體的輸出是選擇性地使用。
3.運(yùn)算器必須有非零的翻轉(zhuǎn)率。
4.僅當(dāng)工具進(jìn)行功耗估算后,用操作數(shù)隔離具有潛在的功耗可節(jié)省,才把它(們)作為OI物體。
自動(dòng)進(jìn)行操作數(shù)隔離的腳本如下:
set do_operand_isolation true
set_operand_isolation_style
read_saif
……
compile
·手動(dòng)指定操作數(shù)隔離的物體
除了使用EDA工具自動(dòng)選擇IO物體,我們也可以手動(dòng)進(jìn)行指定,然后進(jìn)行操作數(shù)隔離。手動(dòng)完成操作數(shù)隔離大致可以分為兩步:
A:設(shè)定操作數(shù)隔離的風(fēng)格為手動(dòng)(用戶(hù)自定義模式):
在約束腳本中加入下面的命令,說(shuō)明是使用手動(dòng)的方式指定IO物體:
set_operand_isolation_style -user_directives
B:手動(dòng)指定IO物體:
手動(dòng)指定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兩步的設(shè)置之后,在使用compile命令進(jìn)行綜合時(shí),如果手動(dòng)指定的IO物體滿(mǎn)足前面的三點(diǎn):
1.OI物體是算術(shù)運(yùn)算器或?qū)哟谓M合單元。
2.OI物體的輸出是選擇性地使用。
3.運(yùn)算器必須有非零的翻轉(zhuǎn)率。
那么綜合器就會(huì)進(jìn)行操作數(shù)隔離。
③操作數(shù)隔離的范圍
有些時(shí)候,我們需要在整個(gè)設(shè)計(jì)中指定某些模塊要做操作數(shù)隔離,某些模塊不要做操作數(shù)隔離。這時(shí)候我就可以使用set_operand_isolation_scope命令來(lái)實(shí)現(xiàn)了。例如下面的分層模塊中:
我們只對(duì)SUB2模塊中的操作數(shù)做隔離,其他的模塊不做操作數(shù)隔離,那么就可以使用下面的示例腳本:
set_operand_isolation_scope [get_designs tops] false
set_operand_isolation_scope [get_designs sub1] false
set_operand_isolation_style
······
④隔離邏輯的設(shè)置
實(shí)現(xiàn)操作數(shù)隔離需要插入相應(yīng)的隔離邏輯,比如與門(mén)或者或門(mén)之類(lèi)的。這些邏輯可以由EDA自動(dòng)選擇,也可以由我們自己手動(dòng)指定。下面就來(lái)介紹這兩種方式。
·默認(rèn)的EDA工具選擇
默認(rèn)情況下,隔離邏輯由工具自動(dòng)選擇。工具根據(jù)輸入數(shù)據(jù)連線的靜態(tài)概率(SP)來(lái)選擇適合的隔離邏輯為“AND'’門(mén)或“OR”門(mén)。使用的命令如下所示:
set_operand_isolation_style -logic adaptive
如果SP > 0.5,選擇“OR”門(mén)作為隔離邏輯
如果SP < 0.5,選擇“AND”門(mén)作為隔離邏輯
·手動(dòng)
我們可以手工地選擇隔離邏輯,例如下面命令指定用“AND”門(mén)作為隔離邏輯:
set_operand_isolation_style -logic AND
通過(guò)前面的描述,我們知道操作隔離的實(shí)現(xiàn)可以通過(guò)EDA全自動(dòng)化實(shí)現(xiàn),也可以通過(guò)我們指定OI物體的半自動(dòng)化實(shí)現(xiàn)。完成操作數(shù)隔離后,我們可以用命令報(bào)告設(shè)計(jì)中的操作數(shù)隔離,例如:
report -operand_isolation -isolated -verb命令顯示如下的信息:
⑤操作數(shù)隔離的復(fù)原
加入隔離邏輯之后,如果時(shí)序變差達(dá)到不能滿(mǎn)足要求的情況,我們就要復(fù)原原來(lái)的邏輯。復(fù)原的方法也是有自動(dòng)和手動(dòng)的方法。
·自動(dòng)
一般情況下,如果加了隔離邏輯后,設(shè)計(jì)的時(shí)序變差了,即當(dāng)WNS(worst negative slack)大于指定的slack時(shí),EDA工具會(huì)使設(shè)計(jì)自動(dòng)復(fù)原到原來(lái)沒(méi)有操作數(shù)隔離的狀態(tài)。例如下面的腳本適用于如果WNS大于0. 5時(shí),設(shè)計(jì)自動(dòng)復(fù)原到原來(lái)的狀態(tài):
set_operand_isolation_slack 0.5
compile
compile -inc
·手動(dòng)
我們也可以用手工的方法復(fù)原操作數(shù)隔離。用手工的方法進(jìn)行操作數(shù)隔離的復(fù)原是在指定的時(shí)序路徑上刪除OI邏輯。這時(shí)候不考慮slack。需要執(zhí)行增量編輯去刪除OI邏輯。腳本如下:
remove_operand_isolation -fromto
compile -inc
······
最后,提供一個(gè)完整的加入操作數(shù)隔離的示例腳本,如下所示,使用了默認(rèn)的隔離邏輯類(lèi)型和操作數(shù)隔離的自動(dòng)恢復(fù):
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





