計(jì)策略收益與風(fēng)險(xiǎn)平衡:時(shí)鐘門控、電源門控、多電壓域與DVFS實(shí)戰(zhàn))
1. 低功耗設(shè)計(jì)不是把功耗表讀數(shù)壓到最低就完事很多剛接觸低功耗設(shè)計(jì)的工程師包括幾年前的我都會(huì)陷入一個(gè)特別樸素的思維定式低功耗嘛就是把電流降下來誰降得最低誰就最牛。于是拿到一顆芯片第一反應(yīng)是翻數(shù)據(jù)手冊(cè)找那幾個(gè)uA級(jí)的Stop、Standby模式恨不得讓系統(tǒng)永遠(yuǎn)待在最深的睡眠里能不進(jìn)中斷就不進(jìn)中斷能少喚醒一次就少喚醒一次。這個(gè)思路在只看功耗數(shù)字的評(píng)估階段看起來無懈可擊但一旦進(jìn)入真實(shí)產(chǎn)品問題就全冒出來了。我印象特別深的一個(gè)項(xiàng)目用的是一顆國產(chǎn)低功耗MCU具體型號(hào)就不點(diǎn)名了做的是一個(gè)電池供電的無線采集終端。當(dāng)時(shí)為了把平均功耗壓到極致我把喚醒周期拉得很長大部分外設(shè)時(shí)鐘全部關(guān)斷主控在兩次采集之間進(jìn)入最深的掉電模式。功耗表上的數(shù)字確實(shí)漂亮待機(jī)電流做到了零點(diǎn)幾微安理論上兩顆紐扣電池能撐好幾年。但實(shí)際部署之后現(xiàn)場(chǎng)反饋回來的問題讓人頭疼有些節(jié)點(diǎn)響應(yīng)遲鈍上位機(jī)下發(fā)的即時(shí)指令要等很久才被執(zhí)行有些節(jié)點(diǎn)在低溫環(huán)境下干脆喚不醒需要斷電重啟還有個(gè)別節(jié)點(diǎn)出現(xiàn)了數(shù)據(jù)丟失事后排查發(fā)現(xiàn)是喚醒后外設(shè)還沒穩(wěn)定就急著讀傳感器讀回來的是無效值。這些問題讓我意識(shí)到低功耗策略的本質(zhì)根本不是一場(chǎng)“誰更省電”的競(jìng)賽而是一場(chǎng)關(guān)于收益與風(fēng)險(xiǎn)的平衡博弈。你每省下一份功耗幾乎都對(duì)應(yīng)著犧牲掉一部分響應(yīng)速度、一部分可靠性、一部分設(shè)計(jì)余量甚至一部分可維護(hù)性。真正成熟的低功耗設(shè)計(jì)不是把功耗壓到理論最低而是在滿足產(chǎn)品功能、響應(yīng)、可靠性約束的前提下找到那個(gè)功耗與風(fēng)險(xiǎn)的最優(yōu)平衡點(diǎn)。這篇文章就想把我在電源門控、多電壓域、DVFS、時(shí)鐘門控這些策略上踩過的坑、算過的賬、總結(jié)出的判斷邏輯完整地?cái)傞_來講一講。關(guān)鍵詞里提到的低功耗、電源門控、多電壓域、DVFS、時(shí)鐘門控這幾個(gè)詞基本覆蓋了數(shù)字芯片和MCU系統(tǒng)里最主流的低功耗手段。熱搜詞里還出現(xiàn)了hc32l196低功耗、stm32l151c8t6a低功耗設(shè)計(jì)、gd32e503cc低功耗這些具體型號(hào)說明大家關(guān)心的不只是概念而是這些策略在真實(shí)芯片上到底怎么落地、會(huì)帶來什么副作用。下面我就按“策略收益—潛在風(fēng)險(xiǎn)—平衡手段”這條主線把每一類策略拆開講透。2. 時(shí)鐘門控收益最直接但門控粒度選錯(cuò)會(huì)反噬2.1 時(shí)鐘門控到底省的是什么電時(shí)鐘門控是低功耗設(shè)計(jì)里最基礎(chǔ)、最沒有爭(zhēng)議的一招也是幾乎所有人第一個(gè)上手的手段。它的原理說穿了特別簡(jiǎn)單數(shù)字電路里絕大部分動(dòng)態(tài)功耗都花在時(shí)鐘翻轉(zhuǎn)上因?yàn)闀r(shí)鐘樹要驅(qū)動(dòng)大量的觸發(fā)器每個(gè)時(shí)鐘沿到來時(shí)觸發(fā)器內(nèi)部節(jié)點(diǎn)都要充放電。如果某個(gè)模塊當(dāng)前不需要工作那就把送給它的時(shí)鐘掐掉觸發(fā)器不再翻轉(zhuǎn)動(dòng)態(tài)功耗立刻歸零。你可以把時(shí)鐘想象成工廠里的傳送帶觸發(fā)器就是傳送帶上的工位。傳送帶一直在轉(zhuǎn)哪怕工位上沒有零件要加工工位上的機(jī)械臂也會(huì)跟著節(jié)奏空動(dòng)作白白耗電。時(shí)鐘門控就是給某條傳送帶裝一個(gè)離合器不需要這條線干活的時(shí)候直接斷開動(dòng)力機(jī)械臂就停下來了。這個(gè)類比雖然粗糙但能幫你快速理解為什么時(shí)鐘門控的收益這么直接——它砍掉的是動(dòng)態(tài)功耗里占比最大的那一塊。在RTL層面時(shí)鐘門控通常有兩種做法。一種是綜合工具自動(dòng)插入的集成時(shí)鐘門控單元你在代碼里寫使能邏輯工具識(shí)別出“時(shí)鐘只在使能有效時(shí)才需要”的模式自動(dòng)幫你插入門控單元。另一種是手動(dòng)例化時(shí)鐘門控單元把時(shí)鐘和使能信號(hào)一起送進(jìn)去輸出門控后的時(shí)鐘。手動(dòng)方式控制粒度更細(xì)但容易出錯(cuò)尤其是門控單元的類型選錯(cuò)會(huì)導(dǎo)致毛刺或者時(shí)鐘偏移問題。2.2 門控粒度粗了省不動(dòng)細(xì)了收不回成本時(shí)鐘門控最大的坑不在“要不要做”而在“做到什么粒度”。我見過兩種極端。一種是粒度太粗整個(gè)外設(shè)模塊共用一個(gè)時(shí)鐘使能結(jié)果模塊里只有一小部分邏輯在跑其余部分跟著一起耗電省下來的功耗非常有限。另一種是粒度太細(xì)恨不得每個(gè)寄存器組都單獨(dú)門控綜合出來的門控單元數(shù)量爆炸時(shí)鐘樹變得極其復(fù)雜面積和布線資源被大量占用最后省下來的那點(diǎn)功耗還不夠抵消額外的門控邏輯自身功耗。這里有一個(gè)很實(shí)在的經(jīng)驗(yàn)判斷門控粒度應(yīng)該對(duì)齊到“功能上會(huì)獨(dú)立開關(guān)的最小模塊”。比如一個(gè)通信外設(shè)發(fā)送通道和接收通道如果不會(huì)同時(shí)使用那就分別門控但如果發(fā)送和接收在協(xié)議上必須同時(shí)活躍那把兩者拆開門控就沒有意義反而增加控制復(fù)雜度。判斷標(biāo)準(zhǔn)不是“能不能拆”而是“拆開之后實(shí)際運(yùn)行中是否存在一段時(shí)間只有其中一部分工作、另一部分完全空閑”。如果不存在這種時(shí)間窗口拆得再細(xì)也是白搭。還有一個(gè)容易被忽略的點(diǎn)門控單元本身也有功耗和延遲。門控單元里的鎖存器要維持使能狀態(tài)時(shí)鐘樹經(jīng)過門控單元會(huì)引入額外的插入延遲。如果門控粒度太細(xì)時(shí)鐘路徑上串了太多門控單元時(shí)鐘偏移會(huì)變得難以收斂時(shí)序違例的風(fēng)險(xiǎn)直線上升。我在一個(gè)項(xiàng)目里就吃過這個(gè)虧為了追求極致功耗把門控做得非常細(xì)結(jié)果時(shí)鐘樹綜合階段怎么調(diào)都收斂不了最后不得不回退把一部分細(xì)粒度門控合并成粗粒度才把時(shí)序壓住。那次教訓(xùn)讓我明白時(shí)鐘門控的收益是有上限的超過某個(gè)點(diǎn)之后每多省一點(diǎn)功耗付出的時(shí)序代價(jià)和驗(yàn)證代價(jià)都是指數(shù)級(jí)增長的。2.3 門控使能的生成邏輯才是風(fēng)險(xiǎn)源頭時(shí)鐘門控真正容易出問題的地方其實(shí)是使能信號(hào)的生成邏輯。門控單元本身很可靠但使能信號(hào)如果生成得不對(duì)就會(huì)出現(xiàn)兩種典型故障一種是使能該開的時(shí)候沒開模塊收不到時(shí)鐘功能直接失效另一種是使能該關(guān)的時(shí)候沒關(guān)模塊一直在跑功耗沒省下來不說還可能因?yàn)橐馔夥D(zhuǎn)導(dǎo)致狀態(tài)機(jī)跑飛。使能信號(hào)的生成必須滿足幾個(gè)條件。第一使能信號(hào)本身必須是同步的不能是異步信號(hào)直接拿來做門控否則門控輸出的時(shí)鐘會(huì)有毛刺觸發(fā)器可能誤觸發(fā)。第二使能信號(hào)的建立和保持時(shí)間要滿足門控單元的要求通常需要在使能路徑上打拍確保在時(shí)鐘沿附近使能是穩(wěn)定的。第三使能邏輯不能依賴被門控模塊自身的輸出否則會(huì)形成組合環(huán)模塊一旦被關(guān)掉就再也開不起來。我個(gè)人的習(xí)慣是所有門控使能都統(tǒng)一走一套同步化模板使能信號(hào)先經(jīng)過兩級(jí)觸發(fā)器同步再送到門控單元。雖然多打兩拍會(huì)引入一點(diǎn)延遲但這點(diǎn)延遲相對(duì)于功能失效的風(fēng)險(xiǎn)來說完全可以接受。另外在驗(yàn)證階段一定要專門針對(duì)門控使能做覆蓋率收集確保每個(gè)門控單元都經(jīng)歷過“開—關(guān)—開”的完整切換不能只驗(yàn)證一直開或者一直關(guān)的場(chǎng)景。3. 電源門控省電最狠但喚醒代價(jià)和狀態(tài)丟失是硬傷3.1 電源門控和時(shí)鐘門控的本質(zhì)區(qū)別如果說時(shí)鐘門控是掐斷傳送帶的動(dòng)力那電源門控就是直接把整條產(chǎn)線的電閘拉掉。時(shí)鐘門控關(guān)掉的是時(shí)鐘翻轉(zhuǎn)帶來的動(dòng)態(tài)功耗但電路依然接著電漏電流還在電源門控則是把整個(gè)電源域斷掉動(dòng)態(tài)功耗和靜態(tài)漏電一起歸零。在先進(jìn)工藝節(jié)點(diǎn)下漏電流占比越來越高電源門控的收益比時(shí)鐘門控大得多尤其是在長時(shí)間待機(jī)的場(chǎng)景里。但收益大意味著代價(jià)也大。電源門控最直接的代價(jià)就是狀態(tài)丟失。電都斷了觸發(fā)器里的值自然全沒了模塊醒來之后相當(dāng)于重新上電所有寄存器都回到復(fù)位值。如果你的系統(tǒng)需要保持某些狀態(tài)比如通信協(xié)議里的序列號(hào)、傳感器校準(zhǔn)系數(shù)、用戶配置參數(shù)那就必須在斷電之前把這些狀態(tài)保存到始終帶電的保持寄存器或者非易失存儲(chǔ)里喚醒后再恢復(fù)。這個(gè)保存和恢復(fù)的過程本身就要消耗時(shí)間和能量如果喚醒太頻繁保存恢復(fù)的開銷可能比省下來的漏電還大。3.2 喚醒延遲從微秒到毫秒的代價(jià)電源門控的另一個(gè)硬傷是喚醒延遲。斷電容易重新上電可沒那么快。電源開關(guān)管要重新導(dǎo)通電源網(wǎng)絡(luò)上的大電容要充電到穩(wěn)定電壓鎖相環(huán)要重新鎖定時(shí)鐘要重新穩(wěn)定模塊內(nèi)部的狀態(tài)機(jī)要重新初始化。這一套流程走下來喚醒時(shí)間從幾微秒到幾毫秒都有可能取決于電源域的規(guī)模和電源開關(guān)的設(shè)計(jì)。這個(gè)喚醒延遲直接決定了你的系統(tǒng)能響應(yīng)多快的外部事件。如果你的產(chǎn)品要求外部中斷到響應(yīng)之間不能超過某個(gè)時(shí)間那你就不能把負(fù)責(zé)響應(yīng)中斷的模塊放在需要長時(shí)間喚醒的電源域里。我見過一個(gè)設(shè)計(jì)為了省電把中斷控制器也放進(jìn)了可斷電域結(jié)果外部事件來了之后中斷控制器自己還沒醒過來中斷信號(hào)根本傳不進(jìn)去等它醒過來事件早就錯(cuò)過了。正確的做法是把始終需要響應(yīng)外部事件的邏輯放在常開域只把那些確定在待機(jī)期間不會(huì)有事件進(jìn)來的模塊放進(jìn)可斷電域。3.3 電源門控的隔離與保持別讓斷電域拖累常開域電源門控還有一個(gè)特別隱蔽的風(fēng)險(xiǎn)斷電域的信號(hào)在斷電期間會(huì)處于不確定狀態(tài)如果這些信號(hào)直接連到常開域就可能給常開域灌入不確定的電流甚至導(dǎo)致常開域的邏輯誤翻轉(zhuǎn)。所以電源門控設(shè)計(jì)里必須要有隔離單元在斷電域斷電期間把它的輸出鉗位到確定電平保護(hù)常開域不受影響。隔離單元的方向和使能時(shí)序也有講究。隔離必須在斷電之前生效在上電之后才能解除否則中間會(huì)有一段信號(hào)不確定的窗口。這個(gè)時(shí)序如果搞錯(cuò)了輕則漏電增加重則功能異常。另外如果斷電域里有些狀態(tài)需要保持那就需要用到保持寄存器這些寄存器在斷電期間由常開域的備用電源供電只維持狀態(tài)不參與運(yùn)算功耗比全速運(yùn)行低得多但比完全斷電高。保持寄存器的數(shù)量要仔細(xì)權(quán)衡保持得越多斷電期間省下來的功耗越少但喚醒后恢復(fù)狀態(tài)的時(shí)間越短。我自己的經(jīng)驗(yàn)是電源門控的域劃分一定要在架構(gòu)階段就定下來不能等到RTL寫完再回頭改。域劃分的核心依據(jù)是哪些模塊在待機(jī)期間絕對(duì)不需要工作且喚醒后可以接受重新初始化。滿足這兩個(gè)條件的模塊才適合放進(jìn)可斷電域。如果某個(gè)模塊待機(jī)期間雖然不工作但喚醒后必須立刻恢復(fù)之前的狀態(tài)且不能有初始化延遲那它更適合用保持寄存器或者干脆放在常開域用時(shí)鐘門控處理。4. 多電壓域與DVFS性能功耗可調(diào)但電壓切換的坑最深4.1 多電壓域解決的是什么問題多電壓域的思路是不同模塊對(duì)性能的要求不一樣那就給它們供不同的電壓。對(duì)性能要求高的模塊供高電壓讓它跑得快對(duì)性能要求低的模塊供低電壓讓它省電。因?yàn)閯?dòng)態(tài)功耗和電壓的平方成正比電壓降一點(diǎn)功耗降一大截。這個(gè)策略在SoC里非常常見比如CPU核和外圍低速接口就可以分屬不同的電壓域。多電壓域帶來的第一個(gè)問題是電平轉(zhuǎn)換。不同電壓域之間的信號(hào)不能直接相連高電壓域的輸出直接灌到低電壓域的輸入上可能會(huì)損壞低電壓域的器件低電壓域的輸出送到高電壓域的輸入可能達(dá)不到高電壓域的輸入高電平門限導(dǎo)致邏輯識(shí)別錯(cuò)誤。所以跨電壓域的信號(hào)必須經(jīng)過電平轉(zhuǎn)換器而且電平轉(zhuǎn)換器的方向、電壓范圍、使能時(shí)序都要仔細(xì)配置。第二個(gè)問題是上電時(shí)序。多個(gè)電壓域之間往往有依賴關(guān)系比如IO域必須先于核心域上電否則核心域的輸出信號(hào)送到還沒上電的IO域可能通過ESD保護(hù)二極管形成漏電通路。上電時(shí)序搞錯(cuò)輕則漏電超標(biāo)重則芯片閂鎖。所以多電壓域設(shè)計(jì)必須有一份明確的上電掉電時(shí)序規(guī)范并且用電源管理單元嚴(yán)格保證時(shí)序。4.2 DVFS的動(dòng)態(tài)調(diào)節(jié)邏輯與響應(yīng)延遲DVFS是在多電壓域的基礎(chǔ)上更進(jìn)一步根據(jù)當(dāng)前負(fù)載動(dòng)態(tài)調(diào)整電壓和頻率。負(fù)載重的時(shí)候升壓升頻負(fù)載輕的時(shí)候降壓降頻。聽起來很美好但實(shí)現(xiàn)起來復(fù)雜度很高。首先電壓和頻率的切換不是瞬間完成的降壓之前必須先降頻否則電壓還沒穩(wěn)定下來頻率已經(jīng)變了時(shí)序就崩了升頻之前必須先升壓否則頻率上去了電壓還沒跟上同樣會(huì)時(shí)序違例。這個(gè)“先降頻后降壓、先升壓后升頻”的順序是鐵律搞反了必出問題。其次電壓調(diào)節(jié)本身需要時(shí)間。無論是片外DCDC還是片內(nèi)LDO電壓從一個(gè)值變到另一個(gè)值都需要幾十到幾百微秒的建立時(shí)間。在這段時(shí)間里系統(tǒng)要么暫停工作等待電壓穩(wěn)定要么在中間電壓下以保守頻率運(yùn)行。這個(gè)切換開銷意味著DVFS不適合頻繁調(diào)節(jié)如果負(fù)載變化太快調(diào)節(jié)開銷可能比省下來的功耗還大。所以DVFS通常配合一個(gè)滯回策略負(fù)載超過高閾值一段時(shí)間才升頻低于低閾值一段時(shí)間才降頻避免在閾值附近反復(fù)橫跳。4.3 電壓頻率配對(duì)表別拍腦袋要實(shí)測(cè)DVFS最核心的一張表就是電壓頻率配對(duì)表也就是在某個(gè)電壓下芯片能穩(wěn)定運(yùn)行的最高頻率是多少。這張表絕對(duì)不能拍腦袋填必須通過實(shí)測(cè)或者拿到工藝廠提供的characterization數(shù)據(jù)。同一顆芯片在不同工藝角、不同溫度下同一個(gè)電壓能跑的最高頻率是不一樣的。如果你按典型角的數(shù)據(jù)填表到了慢工藝角或者高溫環(huán)境下系統(tǒng)就會(huì)在升頻后跑飛。我一般會(huì)要求按最差工藝角、最高工作溫度來定電壓頻率配對(duì)表留出足夠的時(shí)序余量。雖然這樣在典型條件下會(huì)顯得保守功耗不是最優(yōu)但可靠性有保障。如果產(chǎn)品對(duì)功耗極其敏感可以考慮在芯片里集成工藝和溫度監(jiān)測(cè)電路根據(jù)實(shí)測(cè)的工藝角和溫度動(dòng)態(tài)調(diào)整配對(duì)表但這又增加了設(shè)計(jì)復(fù)雜度和驗(yàn)證工作量需要權(quán)衡。還有一個(gè)特別容易踩的坑DVFS切換過程中如果發(fā)生中斷或者異常狀態(tài)機(jī)可能卡死。因?yàn)榍袚Q過程本身是一個(gè)多步驟的序列如果中途被打斷電壓和頻率可能處于不匹配的狀態(tài)。所以DVFS控制器必須設(shè)計(jì)成原子操作切換期間屏蔽相關(guān)中斷或者設(shè)計(jì)完善的異?;謴?fù)機(jī)制確保任何情況下都能回到一個(gè)安全的電壓頻率組合。5. 低功耗策略的收益風(fēng)險(xiǎn)量化用數(shù)據(jù)說話而不是憑感覺5.1 建立功耗賬本每一微安都要有出處做低功耗設(shè)計(jì)最忌諱的就是“感覺省了”或者“感覺沒省”。你必須建立一個(gè)功耗賬本把系統(tǒng)里每一個(gè)模塊在每一種工作模式下的功耗都列出來加起來得到系統(tǒng)總功耗然后針對(duì)每一項(xiàng)分析優(yōu)化空間和優(yōu)化代價(jià)。這個(gè)賬本不需要特別精確但量級(jí)必須對(duì)否則你根本不知道優(yōu)化的重點(diǎn)在哪里。功耗賬本通常按工作模式來分比如全速運(yùn)行、低速運(yùn)行、待機(jī)、深度睡眠、斷電。每個(gè)模式下列出各個(gè)電源域和時(shí)鐘域的功耗區(qū)分動(dòng)態(tài)功耗和靜態(tài)功耗。動(dòng)態(tài)功耗主要看時(shí)鐘頻率和翻轉(zhuǎn)率靜態(tài)功耗主要看漏電。做完這個(gè)賬本你會(huì)發(fā)現(xiàn)很多時(shí)候系統(tǒng)總功耗的大頭并不是你以為的那個(gè)模塊。我做過一個(gè)項(xiàng)目一直以為主控是耗電大戶結(jié)果賬本一拉出來發(fā)現(xiàn)待機(jī)時(shí)主控已經(jīng)降到微安級(jí)了反而是那個(gè)一直開著的傳感器偏置電路和LDO靜態(tài)電流占了大頭。優(yōu)化方向一下子就清晰了。5.2 喚醒能量預(yù)算頻繁喚醒會(huì)讓深度睡眠得不償失深度睡眠模式雖然待機(jī)電流極低但每次喚醒都要付出能量代價(jià)。這個(gè)代價(jià)包括電源重新穩(wěn)定、時(shí)鐘重新鎖定、狀態(tài)恢復(fù)、外設(shè)重新初始化。如果喚醒太頻繁每次喚醒的能量開銷乘以喚醒次數(shù)可能比一直待在淺睡眠模式還費(fèi)電。這里有一個(gè)簡(jiǎn)單的判斷公式深度睡眠平均功耗 深度睡眠待機(jī)功耗 (單次喚醒能量 / 喚醒周期)如果喚醒周期很短單次喚醒能量除以周期這一項(xiàng)就會(huì)很大深度睡眠的平均功耗可能反而高于淺睡眠。所以選擇睡眠深度時(shí)一定要結(jié)合實(shí)際的喚醒頻率來算不能只看數(shù)據(jù)手冊(cè)上的待機(jī)電流。我一般會(huì)畫一條曲線橫軸是喚醒周期縱軸是平均功耗分別畫出淺睡眠和深睡眠的曲線兩條線的交點(diǎn)就是切換睡眠深度的臨界周期。喚醒周期長于這個(gè)臨界值就用深睡眠短于就用淺睡眠。5.3 風(fēng)險(xiǎn)清單每一項(xiàng)收益背后都標(biāo)好代價(jià)低功耗策略的風(fēng)險(xiǎn)不是抽象的是可以具體列出來的。我習(xí)慣在項(xiàng)目里維護(hù)一份低功耗風(fēng)險(xiǎn)清單每采用一項(xiàng)低功耗策略就在清單上記錄它可能帶來的風(fēng)險(xiǎn)、影響范圍、緩解措施和驗(yàn)證方法。比如策略主要收益主要風(fēng)險(xiǎn)緩解手段時(shí)鐘門控降低動(dòng)態(tài)功耗使能邏輯錯(cuò)誤導(dǎo)致功能失效使能同步化、門控覆蓋率驗(yàn)證電源門控消除漏電狀態(tài)丟失、喚醒延遲保持寄存器、常開域隔離多電壓域按需供電電平轉(zhuǎn)換錯(cuò)誤、上電時(shí)序電平轉(zhuǎn)換器配置、時(shí)序規(guī)范DVFS動(dòng)態(tài)匹配負(fù)載切換時(shí)序違例、狀態(tài)機(jī)卡死先壓后頻、原子切換深度睡眠極低待機(jī)電流喚醒能量開銷、響應(yīng)遲鈍喚醒周期與能量預(yù)算匹配這份清單在項(xiàng)目評(píng)審的時(shí)候特別有用它能讓所有人清楚地看到我們?yōu)榱耸‰姷降壮袚?dān)了哪些風(fēng)險(xiǎn)這些風(fēng)險(xiǎn)有沒有被妥善處理。很多時(shí)候產(chǎn)品經(jīng)理看到功耗數(shù)字很漂亮就拍板了但看到風(fēng)險(xiǎn)清單之后會(huì)重新思考某些指標(biāo)是不是可以放寬。低功耗設(shè)計(jì)從來不是單方面的技術(shù)決策而是和產(chǎn)品需求、成本、可靠性一起做的綜合權(quán)衡。6. 從架構(gòu)到驗(yàn)證低功耗策略落地的完整鏈路6.1 架構(gòu)階段就要定下功耗域劃分低功耗設(shè)計(jì)最怕的就是“先做功能功耗后面再優(yōu)化”。等到RTL寫完、功能驗(yàn)證通過再回頭加低功耗你會(huì)發(fā)現(xiàn)電源域劃分根本改不動(dòng)時(shí)鐘門控插入點(diǎn)處處受限D(zhuǎn)VFS更是無從談起。所以功耗域劃分必須在架構(gòu)階段就完成和功能架構(gòu)同步設(shè)計(jì)。架構(gòu)階段要回答幾個(gè)問題系統(tǒng)有哪些工作模式每種模式下哪些模塊必須工作、哪些可以停哪些模塊需要保持狀態(tài)、哪些可以丟失狀態(tài)哪些模塊對(duì)喚醒延遲敏感、哪些不敏感這些問題的答案直接決定了電源域和時(shí)鐘域的劃分。劃分完之后還要定義清楚域之間的接口信號(hào)、電平轉(zhuǎn)換需求、隔離需求、保持需求形成一份功耗架構(gòu)規(guī)范。這份規(guī)范是后續(xù)RTL設(shè)計(jì)、綜合、驗(yàn)證的共同依據(jù)不能隨便改。6.2 RTL階段的低功耗編碼習(xí)慣到了RTL階段低功耗就體現(xiàn)在編碼習(xí)慣上。除了前面說的時(shí)鐘門控使能同步化還有幾個(gè)習(xí)慣能幫你少踩坑。第一寄存器能復(fù)位就復(fù)位尤其是跨電源域的寄存器上電后的初始狀態(tài)必須確定否則隔離和恢復(fù)邏輯沒法保證正確。第二狀態(tài)機(jī)設(shè)計(jì)要考慮低功耗模式每個(gè)狀態(tài)機(jī)都應(yīng)該有明確的空閑狀態(tài)空閑時(shí)能安全地停止時(shí)鐘或者斷電。第三避免組合邏輯跨電源域跨域信號(hào)必須經(jīng)過寄存器打拍否則隔離和電平轉(zhuǎn)換都沒法插入。還有一個(gè)特別實(shí)用的技巧在RTL里給每個(gè)電源域加一個(gè)域活躍指示信號(hào)這個(gè)信號(hào)由域內(nèi)所有模塊的空閑狀態(tài)匯總生成送到電源管理單元。電源管理單元根據(jù)這個(gè)信號(hào)判斷某個(gè)域是否可以斷電。這個(gè)信號(hào)本身必須放在常開域而且要做同步處理避免毛刺導(dǎo)致誤判斷電。6.3 驗(yàn)證階段必須覆蓋的低功耗場(chǎng)景低功耗驗(yàn)證和功能驗(yàn)證一樣重要但很多團(tuán)隊(duì)會(huì)忽略。低功耗驗(yàn)證至少要覆蓋以下幾類場(chǎng)景第一電源域上下電序列確保每個(gè)域按照規(guī)范順序上電掉電隔離和保持信號(hào)時(shí)序正確。第二低功耗模式進(jìn)出確保從任意工作模式進(jìn)入任意低功耗模式再喚醒功能都正常。第三喚醒源覆蓋確保每個(gè)可能的喚醒源都能正確喚醒系統(tǒng)喚醒后的狀態(tài)恢復(fù)正確。第四邊界場(chǎng)景比如在DVFS切換過程中來中斷、在電源域斷電過程中來喚醒事件這些邊界場(chǎng)景最容易出問題。低功耗驗(yàn)證的難點(diǎn)在于很多低功耗行為在RTL仿真里是看不出來的比如漏電、電源網(wǎng)絡(luò)壓降、喚醒延遲。這些需要借助專門的功耗仿真工具或者硬件加速平臺(tái)。如果條件有限至少要把數(shù)字邏輯層面的低功耗控制序列驗(yàn)證充分模擬層面的問題通過設(shè)計(jì)余量和保守策略來規(guī)避。7. 幾個(gè)真實(shí)項(xiàng)目里的平衡決策復(fù)盤7.1 無線采集終端為什么最后放棄了最深睡眠回到開頭提到的那個(gè)無線采集終端項(xiàng)目。最初的設(shè)計(jì)里節(jié)點(diǎn)在兩次采集之間進(jìn)入最深掉電模式待機(jī)電流確實(shí)做到了極低。但現(xiàn)場(chǎng)問題頻發(fā)之后我們重新做了權(quán)衡。采集周期是固定的但上位機(jī)偶爾需要下發(fā)即時(shí)指令要求節(jié)點(diǎn)在收到指令后短時(shí)間內(nèi)響應(yīng)。最深睡眠的喚醒延遲太長滿足不了這個(gè)即時(shí)響應(yīng)需求。最后的方案是把睡眠深度降了一級(jí)改用保持寄存器加時(shí)鐘門控的方案。主控核心斷電但保持關(guān)鍵狀態(tài)通信外設(shè)的接收通道保持在淺睡眠模式可以快速喚醒。待機(jī)電流從零點(diǎn)幾微安上升到了幾微安但換來了可靠的即時(shí)響應(yīng)能力。電池壽命從理論上的好幾年變成了實(shí)際可用的兩年多對(duì)于這個(gè)產(chǎn)品來說完全夠用。這個(gè)決策的核心邏輯是產(chǎn)品需求里的響應(yīng)指標(biāo)是硬約束功耗指標(biāo)是軟約束硬約束不能為了軟約束讓步。7.2 多電壓域SoC上電時(shí)序錯(cuò)誤導(dǎo)致的漏電排查另一個(gè)項(xiàng)目是一顆多電壓域的SoC流片回來之后發(fā)現(xiàn)待機(jī)漏電比預(yù)期高了一個(gè)數(shù)量級(jí)。排查了很久最后定位到是IO域和核心域的上電時(shí)序問題。IO域上電比核心域慢核心域上電后輸出信號(hào)送到還沒上電的IO域通過IO單元的ESD二極管形成了漏電通路。這個(gè)問題在仿真階段完全看不出來因?yàn)榉抡胬餂]有ESD二極管模型。修復(fù)方案是在電源管理單元里增加上電時(shí)序控制確保IO域先于核心域上電核心域的輸出在IO域上電之前保持隔離。這個(gè)案例讓我深刻體會(huì)到多電壓域設(shè)計(jì)里上電時(shí)序不是可選項(xiàng)而是必選項(xiàng)而且時(shí)序規(guī)范必須和芯片的物理實(shí)現(xiàn)一起評(píng)審不能只停留在架構(gòu)文檔里。7.3 DVFS切換卡死一個(gè)中斷引發(fā)的血案還有一個(gè)DVFS相關(guān)的案例。系統(tǒng)在負(fù)載變化時(shí)動(dòng)態(tài)調(diào)頻調(diào)壓大部分時(shí)候工作正常但偶爾會(huì)卡死。抓了很久波形發(fā)現(xiàn)是DVFS切換過程中來了一個(gè)高優(yōu)先級(jí)中斷中斷服務(wù)程序里又觸發(fā)了新的負(fù)載評(píng)估導(dǎo)致DVFS控制器狀態(tài)機(jī)重入電壓和頻率停在了一個(gè)不匹配的組合上系統(tǒng)時(shí)序違例直接跑飛。修復(fù)方案有兩層。第一層是在DVFS切換期間屏蔽負(fù)載評(píng)估中斷保證切換序列的原子性。第二層是在DVFS控制器里增加超時(shí)保護(hù)如果切換序列在預(yù)定時(shí)間內(nèi)沒有完成就強(qiáng)制回到安全電壓頻率組合并報(bào)錯(cuò)。這個(gè)案例說明DVFS的復(fù)雜度不在于調(diào)節(jié)算法本身而在于它和系統(tǒng)其他部分的交互。任何異步事件都可能打斷切換序列必須把所有可能的打斷路徑都考慮到。8. 寫在最后低功耗設(shè)計(jì)的判斷力比工具更重要做了這么多年低功耗設(shè)計(jì)我越來越覺得工具和流程固然重要但真正決定成敗的是判斷力。你得知道什么時(shí)候該省、什么時(shí)候不該省省下來的功耗值不值得付出的代價(jià)當(dāng)前的風(fēng)險(xiǎn)有沒有被充分識(shí)別和緩解。這些判斷沒有標(biāo)準(zhǔn)答案只能靠一個(gè)個(gè)項(xiàng)目積累出來的經(jīng)驗(yàn)。如果非要給一條最實(shí)在的建議那就是永遠(yuǎn)不要孤立地看功耗數(shù)字??吹酱龣C(jī)電流降了一個(gè)數(shù)量級(jí)先別高興問問自己狀態(tài)還能不能恢復(fù)、響應(yīng)還來不來得及、時(shí)序還收不收得住、驗(yàn)證還覆不覆蓋得了。把這些問題的答案和功耗數(shù)字放在一起看你才能做出真正靠譜的決策。低功耗策略的收益與風(fēng)險(xiǎn)平衡說到底就是把這些賬算清楚然后選一個(gè)自己睡得著覺的方案。