與架構(gòu)級低功耗設(shè)計(jì):從能量賬本到電源域劃分的工程實(shí)踐)
1. 從晶體管到系統(tǒng)為什么架構(gòu)級決策能省下80%的功耗很多剛?cè)胄袛?shù)字IC的朋友一提到低功耗腦子里第一反應(yīng)就是門控時(shí)鐘、多閾值電壓、電源關(guān)斷這些電路層面的手段。這些技術(shù)當(dāng)然重要但如果你只盯著這些很容易陷入一個(gè)尷尬的局面RTL代碼寫得再精細(xì)后端布局布線優(yōu)化得再極致功耗該超標(biāo)還是超標(biāo)。原因很簡單——芯片的功耗天花板在架構(gòu)設(shè)計(jì)階段就已經(jīng)被釘死了。我舉個(gè)實(shí)際項(xiàng)目中的例子。早些年參與過一款面向可穿戴設(shè)備的SoC項(xiàng)目當(dāng)時(shí)團(tuán)隊(duì)在RTL階段花了大量精力做時(shí)鐘門控優(yōu)化綜合報(bào)告出來一看動態(tài)功耗只降了不到15%。后來復(fù)盤發(fā)現(xiàn)真正的大頭在于架構(gòu)上選擇了“always-on”的傳感器采集通路導(dǎo)致主控核心和總線矩陣長期處于活躍狀態(tài)。如果當(dāng)初在架構(gòu)階段就引入事件驅(qū)動的喚醒機(jī)制讓系統(tǒng)在大部分時(shí)間處于深度休眠整體功耗至少能砍掉一半以上。這個(gè)教訓(xùn)讓我深刻理解了一件事系統(tǒng)與架構(gòu)級低功耗設(shè)計(jì)才是低功耗戰(zhàn)役中投入產(chǎn)出比最高的戰(zhàn)場。所謂系統(tǒng)與架構(gòu)級低功耗設(shè)計(jì)說白了就是在你還沒有寫一行RTL代碼之前從系統(tǒng)功能劃分、工作模式定義、電源域規(guī)劃、數(shù)據(jù)流調(diào)度等維度出發(fā)決定這顆芯片“怎么工作、什么時(shí)候工作、工作時(shí)用多少資源”。它解決的不是某個(gè)門電路的漏電問題而是整個(gè)系統(tǒng)在時(shí)間軸和空間軸上的能量分配問題。適合誰來參考如果你正在做SoC架構(gòu)評估、正在寫系統(tǒng)規(guī)格書、正在為功耗指標(biāo)焦頭爛額或者你是一名想從RTL前端往架構(gòu)方向發(fā)展的工程師那這部分內(nèi)容就是你必須要啃下來的硬骨頭。接下來的內(nèi)容我會按照“設(shè)計(jì)思路拆解→核心細(xì)節(jié)解析→實(shí)操過程實(shí)現(xiàn)→常見問題排查”的脈絡(luò)把系統(tǒng)與架構(gòu)級低功耗設(shè)計(jì)這件事講透。每個(gè)環(huán)節(jié)都會結(jié)合我實(shí)際踩過的坑和驗(yàn)證過的方案盡量讓你看完就能在自己的項(xiàng)目里落地。2. 系統(tǒng)與架構(gòu)級低功耗設(shè)計(jì)的整體思路拆解2.1 功耗從哪里來先搞清楚能量賬本在動手做任何低功耗設(shè)計(jì)之前你必須先建立一個(gè)清晰的“能量賬本”概念。芯片的總功耗由動態(tài)功耗和靜態(tài)功耗兩部分構(gòu)成。動態(tài)功耗包括翻轉(zhuǎn)功耗和短路功耗公式大家都熟P_dynamic αCV2f P_short。靜態(tài)功耗則主要來自亞閾值漏電、柵氧漏電和結(jié)漏電跟工藝節(jié)點(diǎn)強(qiáng)相關(guān)。但在架構(gòu)層面你不需要精確計(jì)算每一個(gè)門的功耗你需要的是建立功耗與架構(gòu)決策之間的映射關(guān)系。我習(xí)慣用一個(gè)簡化的模型來思考功耗來源架構(gòu)層面的影響因素典型優(yōu)化手段動態(tài)翻轉(zhuǎn)功耗工作頻率、活動因子、負(fù)載電容多電壓域、動態(tài)調(diào)頻、數(shù)據(jù)流優(yōu)化短路功耗輸入翻轉(zhuǎn)速率、供電電壓電壓調(diào)節(jié)、輸入信號整形亞閾值漏電供電電壓、溫度、晶體管閾值電源關(guān)斷、體偏置、多閾值庫柵氧漏電工藝節(jié)點(diǎn)、柵極面積工藝選擇、高K金屬柵這張表的關(guān)鍵在于架構(gòu)師能直接控制的主要是動態(tài)翻轉(zhuǎn)功耗和亞閾值漏電這兩塊。頻率和電壓是架構(gòu)階段就能定下來的大方向活動因子則取決于你的系統(tǒng)調(diào)度策略而電源關(guān)斷更是典型的架構(gòu)級決策。2.2 三種主流架構(gòu)級低功耗策略的取舍在實(shí)際項(xiàng)目中系統(tǒng)與架構(gòu)級低功耗設(shè)計(jì)主要圍繞三條技術(shù)路線展開多電壓域設(shè)計(jì)、動態(tài)電壓頻率調(diào)節(jié)、以及電源門控與休眠策略。這三者不是互斥的而是需要根據(jù)產(chǎn)品形態(tài)靈活組合。多電壓域設(shè)計(jì)的核心思想是“讓不同的模塊工作在各自最合適的電壓下”。比如CPU核心需要高性能跑在1.0V而傳感器接口只需要低速采集跑在0.6V就夠了。這樣在滿足性能需求的前提下低壓模塊的功耗可以大幅降低。但代價(jià)是引入了電平轉(zhuǎn)換器和電壓域之間的時(shí)序收斂復(fù)雜度。動態(tài)電壓頻率調(diào)節(jié)則是在時(shí)間維度上做文章。系統(tǒng)繁忙時(shí)升頻升壓空閑時(shí)降頻降壓。這個(gè)策略對軟件調(diào)度依賴很強(qiáng)需要操作系統(tǒng)或固件配合。我見過不少項(xiàng)目在硬件上支持了DVFS但軟件調(diào)度策略寫得一塌糊涂結(jié)果功耗收益微乎其微。電源門控是最直接的手段——不用的時(shí)候就斷電。但斷電意味著狀態(tài)丟失喚醒后需要重新初始化這會帶來喚醒延遲和能量開銷。所以電源門控的粒度劃分非常講究關(guān)得太細(xì)喚醒開銷抵消了省電收益關(guān)得太粗又起不到省電效果。我的經(jīng)驗(yàn)是先做系統(tǒng)工作模式分析畫出完整的狀態(tài)機(jī)再根據(jù)每個(gè)狀態(tài)的駐留時(shí)間和功耗預(yù)算決定用哪種策略組合。不要一上來就堆技術(shù)而是要從場景出發(fā)。2.3 架構(gòu)級低功耗設(shè)計(jì)的評估維度做架構(gòu)級低功耗設(shè)計(jì)你不能只看功耗數(shù)字還要同時(shí)評估三個(gè)維度性能影響、面積開銷、設(shè)計(jì)復(fù)雜度。我見過一個(gè)極端案例某團(tuán)隊(duì)為了追求極致低功耗把電源域切得極其細(xì)碎結(jié)果芯片面積增加了30%驗(yàn)證周期翻了一倍最后產(chǎn)品上市時(shí)間推遲了半年。這就是典型的“過度設(shè)計(jì)”。我的建議是建立一個(gè)簡單的評分矩陣對每個(gè)低功耗方案從功耗收益、性能損失、面積代價(jià)、驗(yàn)證復(fù)雜度四個(gè)維度打分加權(quán)后選擇最優(yōu)方案。權(quán)重根據(jù)產(chǎn)品定位來定——如果是電池供電的IoT設(shè)備功耗收益權(quán)重最高如果是插電的高性能計(jì)算芯片性能權(quán)重可能更大。3. 核心細(xì)節(jié)解析與實(shí)操要點(diǎn)3.1 工作模式定義低功耗設(shè)計(jì)的第一張圖任何系統(tǒng)與架構(gòu)級低功耗設(shè)計(jì)都應(yīng)該從一張系統(tǒng)工作模式狀態(tài)機(jī)圖開始。這張圖定義了芯片所有可能的工作狀態(tài)以及狀態(tài)之間的遷移條件。沒有這張圖后面的電源域劃分、時(shí)鐘規(guī)劃、軟件調(diào)度都是空中樓閣。以一款典型的無線傳感器節(jié)點(diǎn)SoC為例它的工作模式可能包括深度休眠模式只有極少數(shù)always-on邏輯和喚醒檢測電路工作供電電壓最低時(shí)鐘幾乎全關(guān)。輕量采集模式傳感器接口和ADC工作MCU處于低速運(yùn)行狀態(tài)定期采集數(shù)據(jù)。數(shù)據(jù)處理模式MCU全速運(yùn)行對采集到的數(shù)據(jù)進(jìn)行濾波、壓縮、加密等處理。無線發(fā)射模式射頻模塊工作功耗最高但持續(xù)時(shí)間最短。故障安全模式檢測到異常時(shí)進(jìn)入以最低功耗維持基本監(jiān)控功能。定義這些模式時(shí)你需要回答幾個(gè)關(guān)鍵問題每個(gè)模式的駐留時(shí)間是多少模式切換的延遲要求是多少切換過程中的能量開銷有多大這些問題的答案直接決定了電源域和時(shí)鐘域的劃分策略。實(shí)操心得我習(xí)慣用Excel做一個(gè)“模式-時(shí)間-功耗”的表格把每個(gè)模式的平均功耗和典型駐留時(shí)間填進(jìn)去然后計(jì)算加權(quán)平均功耗。這個(gè)表格在后續(xù)和系統(tǒng)團(tuán)隊(duì)、軟件團(tuán)隊(duì)溝通時(shí)非常有用大家一看就明白功耗預(yù)算花在哪里了。3.2 電源域劃分的粒度與邊界確定電源域劃分是架構(gòu)級低功耗設(shè)計(jì)中最考驗(yàn)功力的環(huán)節(jié)。劃得太粗省電效果有限劃得太細(xì)面積和驗(yàn)證成本飆升。我的經(jīng)驗(yàn)法則是以“功能獨(dú)立性”和“使用頻率相關(guān)性”作為劃分依據(jù)。具體來說如果兩個(gè)模塊在系統(tǒng)運(yùn)行中幾乎總是同時(shí)工作或同時(shí)休眠那它們就應(yīng)該放在同一個(gè)電源域。反之如果一個(gè)模塊頻繁使用而另一個(gè)長期空閑那就應(yīng)該分開。比如CPU核心和總線矩陣通常放在同一電源域因?yàn)榭偩€矩陣的活動跟CPU強(qiáng)相關(guān)而傳感器接口和射頻模塊則應(yīng)該獨(dú)立供電因?yàn)樗鼈兊墓ぷ鞴?jié)奏完全不同。電源域邊界確定后還需要考慮幾個(gè)工程約束電平轉(zhuǎn)換器插入不同電壓域之間的信號需要電平轉(zhuǎn)換這會引入延遲和面積開銷。盡量讓跨域信號數(shù)量最少。隔離單元電源關(guān)斷時(shí)輸出信號必須被鉗位到確定電平防止浮空信號導(dǎo)致下游電路漏電或誤翻轉(zhuǎn)。狀態(tài)保持寄存器如果某個(gè)模塊斷電后需要快速恢復(fù)狀態(tài)就需要使用帶保持功能的寄存器這些寄存器的面積比普通寄存器大不少。電源域劃分方案功耗收益面積開銷驗(yàn)證復(fù)雜度適用場景粗粒度2-3個(gè)域中等低低低成本MCU中粒度4-6個(gè)域較高中等中等主流SoC細(xì)粒度7個(gè)域以上高高高高端移動芯片3.3 時(shí)鐘域規(guī)劃與動態(tài)頻率調(diào)節(jié)策略時(shí)鐘是動態(tài)功耗的直接驅(qū)動因素。架構(gòu)級的時(shí)鐘規(guī)劃包括兩個(gè)層面時(shí)鐘域劃分和頻率調(diào)節(jié)策略。時(shí)鐘域劃分的原則跟電源域類似但更關(guān)注時(shí)序收斂的便利性。一般來說異步時(shí)鐘域越多跨時(shí)鐘域同步的復(fù)雜度就越高。所以我的建議是在滿足功能需求的前提下盡量合并時(shí)鐘域減少異步邊界。頻率調(diào)節(jié)策略則需要結(jié)合工作模式來設(shè)計(jì)。比如在數(shù)據(jù)處理模式下CPU可以跑在最高頻率在輕量采集模式下可以降到1/4頻率在深度休眠模式下時(shí)鐘完全關(guān)閉。這里的關(guān)鍵是頻率切換的過渡過程要平滑不能出現(xiàn)頻率突變導(dǎo)致的時(shí)序違例或數(shù)據(jù)丟失。我通常會在架構(gòu)規(guī)格書中明確定義一個(gè)“頻率-電壓-模式”對照表工作模式CPU頻率核心電壓總線頻率外設(shè)時(shí)鐘高性能400MHz1.0V200MHz全開標(biāo)準(zhǔn)200MHz0.9V100MHz按需低速50MHz0.7V25MHz最小集休眠關(guān)閉0.5V關(guān)閉僅喚醒這張表是后續(xù)RTL設(shè)計(jì)、后端實(shí)現(xiàn)和軟件開發(fā)的共同基準(zhǔn)必須盡早確定并凍結(jié)。3.4 數(shù)據(jù)流優(yōu)化讓數(shù)據(jù)少走路很多人忽略了一點(diǎn)數(shù)據(jù)搬運(yùn)本身就是功耗大戶。在架構(gòu)層面優(yōu)化數(shù)據(jù)流減少不必要的存儲訪問和總線傳輸往往能帶來意想不到的功耗收益。舉個(gè)例子在圖像處理SoC中如果架構(gòu)設(shè)計(jì)成“傳感器→DDR→CPU→DDR→顯示”這樣的數(shù)據(jù)通路那DDR的讀寫功耗會非??捎^。但如果改成“傳感器→行緩存→處理單元→行緩存→顯示”的流水線架構(gòu)數(shù)據(jù)在片上緩存中流轉(zhuǎn)DDR只在必要時(shí)才介入功耗可以降低40%以上。數(shù)據(jù)流優(yōu)化的核心原則是讓數(shù)據(jù)在離計(jì)算單元最近的地方存儲和處理減少長距離、高頻率的數(shù)據(jù)搬運(yùn)。具體手段包括增加片上緩存和FIFO減少對主存的訪問頻次。采用數(shù)據(jù)壓縮技術(shù)降低總線翻轉(zhuǎn)活動。設(shè)計(jì)專用的數(shù)據(jù)通路避免通用總線成為瓶頸。對數(shù)據(jù)進(jìn)行分塊處理提高局部性。注意數(shù)據(jù)流優(yōu)化需要和算法團(tuán)隊(duì)緊密配合。很多時(shí)候算法的一點(diǎn)點(diǎn)調(diào)整就能讓硬件的數(shù)據(jù)搬運(yùn)量大幅下降。架構(gòu)師不能只懂硬件還要理解上層算法的工作方式。4. 實(shí)操過程與核心環(huán)節(jié)實(shí)現(xiàn)4.1 從系統(tǒng)規(guī)格到功耗預(yù)算的分解過程假設(shè)我們現(xiàn)在要設(shè)計(jì)一款低功耗藍(lán)牙傳感器SoC目標(biāo)是用一顆紐扣電池運(yùn)行兩年以上。第一步就是做功耗預(yù)算分解。首先計(jì)算總能量預(yù)算。一顆CR2032紐扣電池的容量大約是220mAh標(biāo)稱電壓3V總能量約為660mWh。兩年是17520小時(shí)那么平均功耗預(yù)算就是660mWh / 17520h ≈ 0.0377mW也就是約38μW。這個(gè)數(shù)字非常苛刻意味著系統(tǒng)絕大部分時(shí)間必須處于深度休眠。接下來我們把38μW分解到各個(gè)工作模式。假設(shè)系統(tǒng)的工作周期是1秒其中深度休眠占990ms輕量采集占9ms無線發(fā)射占1ms。那么深度休眠模式功耗預(yù)算假設(shè)占平均功耗的10%即3.8μW。輕量采集模式功耗預(yù)算假設(shè)占20%即7.6μW折算到9ms內(nèi)的瞬時(shí)功耗約為0.84mW。無線發(fā)射模式功耗預(yù)算假設(shè)占70%即26.6μW折算到1ms內(nèi)的瞬時(shí)功耗約為26.6mW。這個(gè)分解結(jié)果直接告訴架構(gòu)師無線發(fā)射是功耗大頭必須盡量縮短發(fā)射時(shí)間或降低發(fā)射功率深度休眠的漏電必須控制在微瓦級別否則電池壽命會大打折扣。4.2 電源域與時(shí)鐘域的詳細(xì)規(guī)劃實(shí)例基于上面的功耗預(yù)算我們來規(guī)劃電源域。我通常會畫出這樣一張電源域劃分圖用文字描述PD_AlwaysOn包含喚醒檢測電路、實(shí)時(shí)時(shí)鐘、少量配置寄存器。這個(gè)域永遠(yuǎn)不斷電電壓0.5V使用高閾值晶體管控制漏電。PD_CPU包含MCU核心、指令緩存、總線矩陣。這個(gè)域在采集和處理模式下工作休眠時(shí)斷電。電壓可調(diào)0.6V-1.0V。PD_Sensor包含傳感器接口、ADC、模擬前端。僅在采集模式下工作其余時(shí)間斷電。電壓0.6V。PD_Radio包含射頻收發(fā)器、基帶處理。僅在發(fā)射模式下工作其余時(shí)間斷電。電壓1.0V。時(shí)鐘域方面PD_AlwaysOn使用32kHz低速時(shí)鐘PD_CPU在采集模式下使用1MHz時(shí)鐘處理模式下使用16MHz時(shí)鐘PD_Radio使用獨(dú)立的射頻時(shí)鐘??鐣r(shí)鐘域的信號全部通過異步FIFO或握手同步器處理。4.3 低功耗狀態(tài)機(jī)的RTL實(shí)現(xiàn)要點(diǎn)雖然本文重點(diǎn)在架構(gòu)級但架構(gòu)決策最終要落到RTL上。這里分享一個(gè)低功耗狀態(tài)機(jī)的實(shí)現(xiàn)框架用Verilog描述// 低功耗狀態(tài)機(jī)核心框架 module power_fsm ( input wire clk_slow, // 低速時(shí)鐘always-on input wire rst_n, input wire wakeup_event, // 喚醒事件 input wire data_ready, // 數(shù)據(jù)就緒 input wire tx_done, // 發(fā)射完成 output reg cpu_pwr_en, // CPU電源使能 output reg sensor_pwr_en, // 傳感器電源使能 output reg radio_pwr_en, // 射頻電源使能 output reg cpu_clk_en, // CPU時(shí)鐘使能 output reg sensor_clk_en, // 傳感器時(shí)鐘使能 output reg radio_clk_en // 射頻時(shí)鐘使能 ); // 狀態(tài)編碼 localparam S_DEEP_SLEEP 3b000; localparam S_SENSOR_ACQ 3b001; localparam S_DATA_PROC 3b010; localparam S_RADIO_TX 3b011; localparam S_FAULT_SAFE 3b100; reg [2:0] cur_state, nxt_state; // 狀態(tài)寄存器 always (posedge clk_slow or negedge rst_n) begin if (!rst_n) cur_state S_DEEP_SLEEP; else cur_state nxt_state; end // 下一狀態(tài)組合邏輯 always (*) begin nxt_state cur_state; case (cur_state) S_DEEP_SLEEP: begin if (wakeup_event) nxt_state S_SENSOR_ACQ; end S_SENSOR_ACQ: begin if (data_ready) nxt_state S_DATA_PROC; end S_DATA_PROC: begin if (tx_done) nxt_state S_DEEP_SLEEP; else if (data_ready) nxt_state S_RADIO_TX; end S_RADIO_TX: begin if (tx_done) nxt_state S_DEEP_SLEEP; end S_FAULT_SAFE: begin // 故障安全模式等待外部復(fù)位 nxt_state S_FAULT_SAFE; end default: nxt_state S_DEEP_SLEEP; endcase end // 輸出控制邏輯 always (*) begin // 默認(rèn)全部關(guān)閉 cpu_pwr_en 1b0; sensor_pwr_en 1b0; radio_pwr_en 1b0; cpu_clk_en 1b0; sensor_clk_en 1b0; radio_clk_en 1b0; case (cur_state) S_SENSOR_ACQ: begin sensor_pwr_en 1b1; sensor_clk_en 1b1; end S_DATA_PROC: begin cpu_pwr_en 1b1; cpu_clk_en 1b1; sensor_pwr_en 1b1; sensor_clk_en 1b1; end S_RADIO_TX: begin cpu_pwr_en 1b1; cpu_clk_en 1b1; radio_pwr_en 1b1; radio_clk_en 1b1; end default: begin // 深度休眠全部關(guān)閉 end endcase end endmodule這段代碼的關(guān)鍵點(diǎn)在于狀態(tài)機(jī)本身運(yùn)行在always-on的低速時(shí)鐘域確保任何時(shí)候都能響應(yīng)喚醒事件。電源使能和時(shí)鐘使能分開控制因?yàn)橛行┠K需要先上電再給時(shí)鐘順序不能亂。實(shí)際項(xiàng)目中電源開關(guān)的時(shí)序還需要插入適當(dāng)?shù)难舆t等待電源穩(wěn)定后再釋放時(shí)鐘。4.4 電源關(guān)斷與喚醒的時(shí)序控制電源關(guān)斷不是簡單地把使能信號拉低就完事了。一個(gè)完整的電源關(guān)斷序列包括停止時(shí)鐘先關(guān)閉模塊時(shí)鐘防止在斷電過程中產(chǎn)生毛刺。保存狀態(tài)將需要保持的寄存器值寫入保持寄存器或備份SRAM。隔離輸出使能隔離單元將輸出鉗位到安全電平。斷開電源關(guān)閉電源開關(guān)模塊徹底斷電。等待放電等待電源軌上的電荷泄放完畢通常需要幾個(gè)微秒。喚醒序列則相反接通電源打開電源開關(guān)等待電源穩(wěn)定。釋放隔離關(guān)閉隔離單元恢復(fù)信號通路?;謴?fù)狀態(tài)從保持寄存器或備份SRAM中恢復(fù)狀態(tài)。使能時(shí)鐘重新提供時(shí)鐘模塊開始工作。這個(gè)序列的每一步都需要精確的時(shí)序控制通常用一個(gè)專門的電源管理狀態(tài)機(jī)來實(shí)現(xiàn)。我見過不少項(xiàng)目因?yàn)殡娫搓P(guān)斷時(shí)序不對導(dǎo)致芯片在休眠后無法喚醒或者喚醒后狀態(tài)錯(cuò)亂。這個(gè)坑一定要在架構(gòu)階段就通過仿真驗(yàn)證清楚。5. 常見問題與排查技巧實(shí)錄5.1 電源域劃分不合理導(dǎo)致的典型故障在實(shí)際項(xiàng)目中電源域劃分不合理引發(fā)的故障五花八門。我整理了一個(gè)常見問題速查表故障現(xiàn)象可能原因排查思路解決方案休眠后無法喚醒喚醒電路被誤關(guān)斷檢查always-on域是否包含喚醒邏輯將喚醒檢測移到always-on域喚醒后數(shù)據(jù)錯(cuò)亂狀態(tài)保持寄存器未正確恢復(fù)對比喚醒前后寄存器值檢查保持寄存器的保存/恢復(fù)時(shí)序功耗高于預(yù)期隔離單元漏電或浮空信號測量斷電域的輸出電平確保隔離單元正確鉗位跨域通信失敗電平轉(zhuǎn)換器缺失或配置錯(cuò)誤檢查跨域信號的電平匹配插入正確的電平轉(zhuǎn)換器電源開關(guān)燒毀浪涌電流過大測量電源開關(guān)的峰值電流增加軟啟動電路或分步上電實(shí)操心得電源域驗(yàn)證一定要做“極端場景”測試比如在電源關(guān)斷的瞬間觸發(fā)喚醒事件或者在高頻工作模式下突然斷電。這些邊界情況最容易暴露設(shè)計(jì)缺陷。5.2 DVFS策略失效的排查方法DVFS失效通常表現(xiàn)為頻率切換后系統(tǒng)不穩(wěn)定或者功耗沒有明顯下降。排查時(shí)可以從以下幾個(gè)角度入手首先確認(rèn)頻率切換的握手協(xié)議是否正確。頻率切換通常需要經(jīng)歷“停止時(shí)鐘→切換頻率源→穩(wěn)定等待→釋放時(shí)鐘”的過程任何一步時(shí)序不對都會導(dǎo)致系統(tǒng)崩潰。我習(xí)慣在仿真中專門構(gòu)造一個(gè)頻率切換的測試用例用波形確認(rèn)每個(gè)步驟的時(shí)序。其次檢查電壓切換是否跟頻率匹配。頻率升高時(shí)電壓必須先升高頻率降低時(shí)電壓可以后降低。如果順序反了輕則時(shí)序違例重則芯片無法工作。這個(gè)順序在架構(gòu)規(guī)格書中必須明確寫清楚。最后確認(rèn)軟件調(diào)度策略是否合理。硬件支持DVFS不代表軟件會用。我見過一個(gè)項(xiàng)目硬件DVFS功能做得很完善但軟件團(tuán)隊(duì)為了省事直接把頻率固定在最高檔導(dǎo)致功耗優(yōu)化形同虛設(shè)。所以架構(gòu)師一定要和軟件團(tuán)隊(duì)對齊調(diào)度策略最好能提供一個(gè)參考實(shí)現(xiàn)。5.3 低功耗設(shè)計(jì)中的驗(yàn)證盲區(qū)低功耗設(shè)計(jì)的驗(yàn)證比普通功能驗(yàn)證復(fù)雜得多因?yàn)楹芏嗟凸南嚓P(guān)的缺陷在常規(guī)仿真中根本不會暴露。以下是我總結(jié)的幾個(gè)驗(yàn)證盲區(qū)電源關(guān)斷后的浮空信號在常規(guī)仿真中斷電域的電源仍然存在信號不會浮空。只有帶電源感知的仿真才能暴露這個(gè)問題。保持寄存器的恢復(fù)值如果保持寄存器在保存時(shí)采樣到了錯(cuò)誤的值喚醒后系統(tǒng)就會帶著錯(cuò)誤狀態(tài)繼續(xù)運(yùn)行。這個(gè)需要專門的保存/恢復(fù)測試用例。電源開關(guān)的時(shí)序競爭多個(gè)電源域同時(shí)上電或斷電時(shí)可能出現(xiàn)時(shí)序競爭。需要做多域聯(lián)合仿真。低功耗狀態(tài)機(jī)的死鎖如果狀態(tài)機(jī)在某個(gè)狀態(tài)下等待一個(gè)永遠(yuǎn)不會到來的事件系統(tǒng)就會死鎖。需要做狀態(tài)覆蓋分析。我的建議是在架構(gòu)階段就制定低功耗驗(yàn)證計(jì)劃明確哪些場景需要帶電源感知仿真哪些需要形式驗(yàn)證哪些需要FPGA原型驗(yàn)證。不要等到RTL凍結(jié)了才想起來驗(yàn)證低功耗功能。5.4 架構(gòu)級低功耗設(shè)計(jì)的經(jīng)驗(yàn)法則最后分享幾條我在多個(gè)項(xiàng)目中總結(jié)出來的經(jīng)驗(yàn)法則都是踩坑換來的法則一功耗預(yù)算要留余量。架構(gòu)階段估算的功耗到后端實(shí)現(xiàn)時(shí)通常會超標(biāo)20%-30%。所以做預(yù)算時(shí)至少要留30%的余量否則后期會非常被動。法則二電源域數(shù)量不是越多越好。每增加一個(gè)電源域就增加一套電源開關(guān)、隔離單元、電平轉(zhuǎn)換器和相關(guān)的驗(yàn)證工作。除非功耗收益明確超過5%否則不值得增加新的電源域。法則三軟件配合是DVFS成功的關(guān)鍵。硬件提供能力軟件決定效果。架構(gòu)階段就要和軟件團(tuán)隊(duì)一起定義調(diào)度策略最好能做一個(gè)軟件功耗模型來評估效果。法則四always-on域的漏電是電池壽命的隱形殺手。對于電池供電的設(shè)備always-on域的漏電必須控制在納安級別。選擇高閾值晶體管、減小always-on域的規(guī)模、降低其供電電壓都是有效手段。法則五低功耗設(shè)計(jì)是一個(gè)迭代過程。不要指望一次就把所有事情做對。架構(gòu)階段做初步規(guī)劃RTL階段做細(xì)化優(yōu)化后端階段做最終收斂。每個(gè)階段都要重新評估功耗及時(shí)調(diào)整策略。我在最近一個(gè)項(xiàng)目中按照這套方法論把一款傳感器SoC的休眠功耗從最初的15μA降到了2.3μA電池壽命從預(yù)期的8個(gè)月延長到了3年以上。這個(gè)過程中最大的體會是架構(gòu)級低功耗設(shè)計(jì)的核心不是堆技術(shù)而是做取舍。你要在性能、功耗、面積、成本、上市時(shí)間之間找到最佳平衡點(diǎn)而這個(gè)平衡點(diǎn)只有對系統(tǒng)有深刻理解的架構(gòu)師才能找到。