1 引言:功耗在芯片設計中的地位 長期以來,設計者面臨的最大挑戰是時序收斂,而功耗處于一個次要的地位。近年來,下面的因素使功耗日益得到設計者的關注: 1)移動應用的興起,使功耗的重要性逐漸顯現。大的功耗意味著更短的電池壽命。 2)芯片集成度的提高,使供電系統設計成為挑戰。 隨著工藝的進步,芯片內的電路密度成倍提高,并且運行在以前數倍的頻率之上,而片上連線則越來越細,片上供電網絡必須將更多的電力以更少的連線資源送至每個單元,如果不能做到這一點,芯片的穩定性和預定工作頻率都將成為問題。IR壓降和供電網絡消耗的大量布線資源成為困擾后端設計者的重要問題,現在這種壓力正在一步步傳導到前端設計者的身上,要求在設計階段減少需要的電力。 3)功耗對成本的影響日益顯著 功耗決定了芯片的發熱量,封裝結構需要及時把芯片產生的熱量傳遞走,否則溫度上升,造成電路不能穩定工作。因此,發熱量大的芯片需要選擇散熱良好的封裝形式,或者額外的冷卻系統,如風扇等,這意味著成本的增加。 基于以上原因,功耗成為產品的重要指標與約束。下面的因素在設計之初,就應當列入設計者的考慮范圍: 1)功耗目標的確定 a)產品的應用領域中功耗指標的商業價值; b)封裝,制程的成本影響; c)實現的可行度,復雜度,由此帶來的設計風險和時程影響的評估; d)參考值的選取:根據同類產品,經驗值,工具分析確定,并隨著設計的深入不斷修正。 2)優化方案(策略)的設定 在進一步分析之前,我們先看一下功耗的組成。 2 功耗的組成 2.1 core power 功耗的組成包含RAM、ROM、時鐘樹(clock tree)和核心邏輯電路(Core logic)等四部分,下面依次來分析。 1)RAM RAM功耗的計算是項復雜的任務,幸運的是,memory compiler可以為我們進行此項工作。關鍵點在存取每個端口的速率,這可以通過考慮存取pattern類型得到,或者通過仿真得到。建議在設計初期即生成不同參數(寬度,深度,速度,port數)的RAM/ROM的功耗數據,以利于設計探索。 2)時鐘樹 時鐘樹的功耗占到整個芯片功耗的40%~60%,因為它的高活動率(100%)和正負邊沿均消耗電力。 其中,電容包含寄存器的電容,驅動單元的電容和連線電容三部分。 3)核心邏輯電路 定義核心邏輯電路功耗為除時鐘樹外的組合與時序單元消耗的電力。由兩部分組成: leakage current 和 capacitive loads 4)宏單元(macro cell) 多數芯片包含PLL等模擬macro,可以從庫提供商的數據手冊找到其功耗參數。設計者可以通過切分系統模式關閉不需工作的模塊,以減小功耗。 2.2 IO power IO功耗包含IO單元、外部負載、外部終端等。因為需要驅動板級的連線,IO的電容會是內部單元的數百倍量級,因此消耗較多的電力。有時候,IO的功耗可以占到整體功耗的很大比例,系統架構可能因之改變,如:重新定義系統的劃分,以減少芯片-芯片的連接;選擇不同的IO接口協議,以減少能量消耗。IO功耗通常由系統架構,接口帶寬與協議要求決定。一旦庫選定,設計者可以優化的空間很小,但是核心的功耗是設計者可以減小的,在后面的篇幅中,我們將以核心功耗的估算與優化作為主題。 3 功耗估算 功耗估算的價值是盡可能早地以定量方式看到優化結果,以助于設計者的初期架構探索。在每個階段, 如產品規劃、架構制訂、代碼書寫、綜合、P&R等,設計者都面臨若干選擇,能馬上看到選擇的結果,而不是到設計流程的末尾,可以有效減少開發時間。 3.1估算的方法 功耗的估算可以在設計流程的各個階段進行,對應設計表征的不同形式。 software level ->behavior level -> RT -> gate -> circuit 越早的階段,抽象層次越高,其精確度越差,但可以更早給設計者反饋,同時得到估算結果消耗的時間越少。 1. 軟件級 首先,定義系統將執行的典型程序。典型的程序通常會有上百萬的機器周期,進行一次完整的RTL級的仿真可能需要數月時間,這是不可接受的。解決的方法是在更高層次建立基本組成單元的功耗模型。 比較實用的方法是根據特定的硬件平臺,統計出每條指令對應的功耗數據,進行指令級的仿真。 2. 行為級 在進行分析前,我們首先應了解電路的功率消耗原理,實際電路的電力消耗如圖1所示。 Prms = 1/2 * f * Vdd^2 * sigma(Ci * Ai) --- f : clock frequency --- Vdd : voltage --- Ci is capacitance load of node, --- Ai is the average switching activity of their node 在行為級設計表征中,物理電路單元尚未建立,難點是得到電容與活動率的值。存在兩種思路: 1)理論估計: 根據電路復雜度得到C,復雜度由算術,邏輯操作的數量,狀態的數目與轉換率衡量。 complex = f (arith ope, boolean ope, state, transition) 可以根據信息理論估算活動率。 2)實驗估計:由快速綜合得到寄存器傳輸級的原型,進而估計電容與活動率。 3. 寄存器傳輸級 第一步是在庫中為高層的設計組件建立功耗信息算式,得到方式是在不同環境變量組合下通過仿真,統計功耗數據,繪制成曲線形式。然后,通過靜態分析電路結構或動態仿真,收集電路動作幾率數據,代入上述算式,得到各個組件的功耗值。最后,把所有組件的功耗值求和,得到總功耗。 4. 門級 與寄存器傳輸級的區別在于,基本單元是工藝庫中的標準單元,功耗方程通過電路仿真得到,所以更精確。 5. 晶體管與版圖層 所有的連線的電容、單元的負載,驅動都已得到,根據晶體管和連線模型的電壓、電流方程,可以算出精確的功耗數據。 3.2估算的流程 因為指令與行為級估算的精確度太差,電路級估算的耗時過多,所以在業界的實踐中采用較少。RTL與gate級估算是常用的選擇。實際功耗分析的執行必須借助工具的輔助,目前業界通常的選擇是在RTL級采用power compiler,在門級采用primepower。 下面以power compiler為例,說明門級估算的步驟。 在dc compile前,設置下面的變量: power_preserve_rtl_hier_names = false/true 編譯 寫出ddc文件 仿真生成vcd 文件 vcd2saif轉化為.saif文件 (注意vcd2saif由csh調用,而不是在dc_shell界面調用) 讀入ddc網表 read_saif report_power 4 功耗的優化 4.1優化的原則 圖3是幾個典型設計中功耗分布數據: 我們的目標是減少時鐘樹、標準單元和存儲器的功耗。功耗與性能通常是充滿矛盾的: 1)使時鐘變慢(更少的轉換),但我們想要更快的處理速度。 2)減小Vdd,但Vdd變小會限制時鐘速度。 3)更少的電路,但更多的晶體管可以做更多的工作。 簡言之,我們想用最少的能量完成最大量的任務。實現方式是對電路動作的控制精細化,僅讓恰好需要的電路,在需要的時間內動作,而不浪費分毫。完成這一任務,需要設計者有效率地管理電路的動作。 現代系統是如此復雜,以致設計者必須切分為若干層次,分步前行才能把握: 軟件 -> 架構 -> 邏輯 -> 電路 每一層次中,設計者對電路動作的控制范圍和手段都是不同的。軟件是硬件動作的總調度師,設計者可以根據特定應用,關掉整個模塊或減少無效的動作。進入架構層,視角轉為怎樣將設定任務合理分配到各個模塊,協調動作最有效率,如pipeline、分布式計算、并行計算等。在邏輯層,則考慮怎樣實現一步動作僅使需要的電路動作。電路層的視角更為精細,通過調節平衡信號到達時間,驅動單元大小等手段,使電路的動作耗能最小。這里存在一個重要規律,稱作效率遞減率: 在高的抽象層次減少功耗的效率會比低的層次更高。 所以,降低功耗是一個系統工程,需要軟件、硬件、電路、工藝等人員的共同努力。這里,我們將采用架構與邏輯的視角進行下面的討論。 4.2 架構考慮 1)切分工作模式,硬件要可以提供一個接口,以使軟件可以控制電路模塊的動作與否。不工作的模塊掛起。 2)分布式計算:將整個任務切分到不同模塊,在內部處理高活動性信號。雖然總計算量沒有改變,但對單個模塊,時間要求降低,可以降頻或降壓。 3)并行計算:相同時間內計算量相同,但可降頻/壓。(計算量=開關的次數,開關次數沒變,但每次開關的功耗成本降了) 4)pipeline:每步的計算量減少,可以在性能相同的情況下,降低工作頻率。 5)可編程性與hard-wire的權衡:可編程性越強,完成相同的任務耗電越多。 4.3 RAM的功耗優化 很明顯,大的RAM比小的RAM耗電要多,將整塊的RAM分成小塊可以降低存取功耗。 值得注意的一點是,多數設計者認為片選信號無效,RAM即進入最小功耗。實際上,若此時其數據/地址端口信號有翻轉,會耗費相當的電力(約占激活功耗的20%)。在不存取時,最佳的方式是,保持片選無效,地址、數據是恒定值。 4.4時鐘樹單元/連線 4.4.1 時鐘門控的原理 在典型的數字芯片中,時鐘網絡的功耗可以占到總量的50%,這是一個龐大的數字。一個行之有效的方案是使用時鐘門控,將當前未工作邏輯的時鐘樹關閉。比如下面的邏輯,在EN是0時,可以將右側的register bank的時鐘關閉。 時鐘門控邏輯加入的方式有兩種:手動和自動。 a) 手動方式 在每個IP模塊的時鐘根節點加入,EN信號可以由程序設定產生。 b) 自動方式 dc_shell > set_clock_gating_style (options) 選擇時鐘門控的方式和條件 dc_shell > analyze -f design.v 讀入設計 dc_shell > elaborate MY_DESIGN 構造設計 dc_shell > insert_clock_gating 將符合條件的邏輯門控 dc_shell > create_clock -period 10 -name CLK 創建時鐘 dc_shell > propagate_constraints -gate_clock 加入時鐘門控單元的時序約束 手動和自動結合的方式可以達到最好的效率。 4.4.2 gating 單元的選擇 a)latch-based(圖7) b)latch-free(圖8) 通過set_clock_gating_style的下列選擇,設計者可以控制門控單元的選取,如圖9所示。 選擇考慮: 1)latch:用還是不用,是個問題。 latch-free的方案中,EN信號必須在時鐘負沿前穩定,否則時鐘會出現毛刺, 造成只留給EN產生邏輯半個時鐘周期的時間。latch-based方案則不存在這個限制,但引入latch使時序分析,測試復雜性增加。故選擇哪種方案需要設計者權衡決定。 2)正沿/負沿寄存器需要指定不同的門控單元 比如latch-based方案:正沿FF用and門,負沿FF用or門 3)integrated clock-gating cell/普通單元 在生成庫的過程中,可以創建專門的集成時鐘門控單元,以獲得較好的時序。 4.4.3 時序分析 通過set_clock_gating_style -setup -hold 或 set_clock_gating_check指定。 AND門(圖10) OR 門(圖11) 數值需要考慮到時鐘歪斜的影響。 4.4.4 與dft流程的配合 1)加入控制點(圖12) 控制點的位置和控制信號可通過下面指令控制: dc_shell> set_clock_gating_style -control_point before -control_signal scan_enable 2)加入觀察點(圖13) 在測試中,EN信號和control logic中的信號是測不到的,解決方式是加入觀測邏輯。 dc_shell> set_clock_gating_style -control_signal test_mode \ -observation_point true \ -observation_logic_depth depth_value 在測試模式,觀察邏輯允許觀測ENL信號,在正常操作模式,XOR樹不消耗能量。 3)測試信號與頂層測試端口連接 時鐘門控單元的測試信號需要和頂層的測試端口相連,通過下指令進行,如圖14所示。 如果頂層有指定端口,將直接相連,否則,會創建此端口,并連接。 4.4.5 結果 在插入時鐘樹后,可以用report_clock_tree_power來獲得時鐘網絡的功耗信息。 時鐘門控經設計實踐證明是一個行之有效的降低功耗手段,下圖是基于一項真實設計的評估:(見參考文獻[6]) 5 結語 在現代芯片設計中,功耗越來越引起設計者的關注。在本文中,我們首先分析了功耗的組成部分,然后闡述了功耗估算的方法,通過功耗估算可以使設計者在設計初期及時評估設計方案的效率,以便做出最優的選擇。最后,重點分析了功耗優化的手段,包括架構優化,RAM功耗降低,時鐘門控三種技術,并對引進時鐘門控技術時若干難點逐一提出了解決方案,如門控單元選擇,時序分析,測試支持等。功耗分析與優化二者相輔相成,設計者善加使用,方可事半功倍。 |