硬件架構的藝術(三)

低功耗設計

功耗源

浪湧、靜態功耗和動態功耗是主要的三個功耗源。

  • 浪湧: 湧電流指器件上電時產生的最大瞬時輸入電流,在應用中稱爲啓動電流。浪湧電流與設備有關(不同設備的浪湧電流是不同的),例如基於SRAM的FPGA有很突出的浪湧電流,因爲上電時這些器件沒有配置,所以需要從外部存儲器中下載數據來配置其編程資源(如佈線連接和查找表)
  • 靜態功耗: 關斷主電源或系統進入待機模式下產生的電流,由此電流產生的功耗稱爲待機功耗。這同樣與電氣特徵密切相關。靜態功耗也包含電路中由晶體管的漏電流所導致的功耗。
  • 動態功耗:門電路輸出切換時,由邏輯轉換所引起的功耗。
    動態功耗=翻轉次數 * 門寄生電容 供電電壓的平方時鐘頻率
    而ASIC的總功耗爲靜態功耗+動態功耗

在各設計抽象層次降低功耗

降低功耗應當在所有的設計層上進行。即,系統級,邏輯級和物理層。層次越高越有效。
各層次降低功耗圖不同層次功耗降低比例

系統級低功耗技術

在系統設計之前,必須對系統及其性能以及功耗作爲目標進行考慮。

片上系統

由於I/O使用比芯片內核邏輯更高的電壓供電(typical value 3.3v),使得其佔到總功耗的50%以上。所以如果整個系統包含多個芯片,這些芯片的連線就會消耗大量的功耗。這些方法主要關注降低功耗,縮減面積以及降低成本的方法。

硬件/軟件劃分

軟硬件結合方法系統的設計首先從性能規範開始,決定系統哪些部分使用不同的方法實現,有些使用硬件(verilog),有些使用軟件(C語言)。

還可以使用基於模型的方式,模型要麼完全自己建立要麼使用已複用的已有模型庫,隨着庫的增加,可以縮短設計時間。
基於模型的方法

低功耗軟件

就是修改應用軟件來降低功耗。
比如合併循環等

選擇處理器

處理器的選擇會對整體功耗產生明顯影響。

  1. 選擇合適數據寬度的處理器
    例如:使用8位的微控制器來處理16位數據會增加大量排序;對於16位乘法,使用16位處理器需要30條指令(加與移位),而使用8位處理器則需要127條指令;而更好的結構是使用乘加單元(MAC)或16*16位並行乘法器用一條指令執行乘法。
  2. 選擇節省功耗的系統體系結構
    使用節省功耗的系統體系結構,利用微處理器進行控制,同時用協處理器或DSP(Digital Signal Processor)進行數據處理(使任務在最小且能耗最高的機器中完成),大多數情況下,微控制器和協處理器不會並行運行。

體系結構級降低功耗

高級門控時鐘

  • 組合門控時鐘
    在輸出不變時使觸發器的時鐘失效,所以它可以降低5%~10%的動態功耗(在插入門控時鐘之前和插入之後電路的功能並沒有改變,所以可以用一致性檢查工具進行驗證)

組合門控時鐘

  • 時序門控時鐘
    時序門控時鐘能減少連接到帶有門控時鐘的寄存器塊的設計部分的冗餘切換(在不影響設計功能的情況下改變設計結構,由於需要多餘邏輯,不適用於多位寬的情況時序門控時鐘

DVFS

在對頻率不敏感的應用階段中降低時鐘速率和供電電壓,可以在性能適度損失的情況下大幅度降低功耗(但是降低供電電壓會降低系統的性能,所以需要作出權衡,而對於一般應用,一般只在很小的時間中需要高性能,而在其餘的大多數時間中使用低性能、低功耗的處理器就足夠)。現在也有功耗關係芯片控制。
注意:在實時嵌入式系統中,往往不能直接使用DVFS算法,因爲改變處理器的操作電壓將會影響到任務的執行時間並違反時效性要求(也可以將DVFS合併到OS調度程序和實時嵌入式系統任務管理服務中)

基於緩存的系統體系結構

對大多數DSP,FFT算法要求頻繁訪問系統存儲器的數據,可以在系統存儲器或RAM和處理器之間增加緩存。

對數FFT體系結構

對於大規模運算的應用,使用對數系統(LNS)比使用線性系統更好,LNS在降低平均位元活躍度的同時用加法和減法實現乘法運算,使其效率比線性系統更高,因此可能節省大量功耗。負面影響是加法器和減法器的寬度會增加-導致需要以指數級增大的查找表。

異步(無時鐘)設計

傳統的設計方法會形成大規模時鐘樹。可能存在時鐘偏移,需要增加額外的電路。
其中兩個模塊使用握手接口進行交互:(由於未工作元件幾乎不消耗能量,所以異步電路的動態功耗接近0)
基於握手接口的異步系統異步電路基於依賴延遲不敏感編碼,雙軌道編碼用兩根線傳輸每個數據位(單軌只使用一根線傳輸每個數據位)。“LL”=”無數據“,”LH"=“0”,“HL"=“1”,“HH”=無效。這裏L="0"且H=“1”.

電源門控

電源門控通常指在芯片上加入開關以根據應用要求選擇性切斷供電電源
1、細粒度電源門控
在每個門和地之間存在一個開關晶體管
2、粗粒度電源門控
創建一個電源開關網絡,各組開關晶體管能並行地將整個模塊打開或關閉。

多閾值電壓

多單元庫(包含至少兩組功能相同但閾值電壓不同)有助於處理漏電和動態功耗的問題。高閾值電壓單元較慢但是漏電較少;相反,低閾值電壓單元更快但是漏電較多。

多電壓供電

在多電壓供電(MSV)設計中,設計可以分割爲獨立的”電壓域”,根據每個區域對時序的要求而使用不同的供電電壓。

存儲器電源門控

在經典的SoC中,SRAM消耗了總功耗的1/3。

  • 使用多個小存儲器(一小部分存儲器常開)
  • 基底偏壓存儲器(提高了閾值電壓並降低了漏電功耗)
  • 使用多模式給存儲器供電(在讀寫時,存儲器使用全電壓供電;在存儲器不需要讀寫,降低供電電壓,只需保持數據不丟失即可)

在寄存器級傳輸降低功耗

在大規模ASIC中,在RTL完成時至少80%的功耗已經確定。

狀態機編碼和解碼

在各種狀態機編碼類型,格雷碼是最適合低功耗設計
1、格雷碼每次只有一個觸發器變化,消耗能量小。
2、格雷碼消除了依賴於狀態的組合等式中存在毛刺的風險。

二進制數表示法

在大多數應用中,用補碼來表示二進制數往往比有符號數更常用。然而對於某些只使用積分器進行求和的應用,補碼錶達法在0到1的轉變發生所有位都會發生變化(有較高的開關功耗),相比之下,有符號數只有兩個位發生變化

門控時鐘基礎

門控時鐘示例

獨熱碼多路器

mux選擇線路二進制編碼如果MUX的每個輸入都是多位總線,就會產生明顯的開關過程,由此產生功耗。如果使用獨熱碼方式,輸出就會更快、更穩定,而且在初期就能將未選中總線掩藏,實現低功耗效果。

獨熱編碼

除去多餘的轉換

如果轉換後的數據未被真實採樣,那麼它就是多餘的,將這樣的轉換去掉顯著可以降低功耗。
例如,如果load_out沒有置位,那麼前面的操作都是多餘的,浪費了能量。
冗餘轉換如果load_out沒有置爲有效,那麼load_op也不應置爲有效,這樣可以節省一部分功耗;僅當sel 爲0時纔讀入A和B,而僅當sel 爲1纔讀入C和D

壓縮冗餘轉換新增一些邏輯門,用來取消未選擇的總線分支的轉換,這些邏輯門會增加一些功耗,但保證了只有最終選中的目標纔有數據切換髮生,這樣就降低了功耗

資源共享

如果有同樣的操作在多處使用,必須避免相應的運算邏輯在多個位置重複出現。這可以減小面積和功耗。
未使用使用資源共享

使用行波計數器來降低功耗

相位延遲

總線翻轉

在當前數據和下一個數據之間的漢明距離大於N/2時,就要將一下個數據反向後傳輸,以減少總線上出現轉換的位數量。
反轉編碼

高度活躍網絡

將活躍度較高的網絡和較低的區分開開,置於邏輯雲中儘可能深的位置。

寄存器級別降低功耗

  • 技術水平:先進硅處理技術。
  • 版圖優化: 直接關聯的模塊在硅片上都應該緊密連接在一起。
  • 襯底偏壓:襯底偏壓減少漏電功耗。採用這種技術,可以將襯底電壓偏置,以提高晶體管閾值,因此減小漏電。
  • 減少氧化層厚度:降低與閾值電流
  • 多氧化層器件:
  • 利用訂製設計減小電容:

流水線的藝術

對於ASIC,可以通過流水線提高吞吐量,但是也會帶來系統延時和麪積的增加。流水線通過在較長的組合邏輯中插入寄存器降低組合邏輯的延遲,來提高時鐘頻率並提高性能。
非流水線的組合路徑
組合路徑延遲爲X個時間單位,在下圖中通過插入三個寄存器被分割爲多個小塊,寄存器間的延遲爲Y個時間單位,Y<X ;加入寄存器時鐘頻率明顯增加,但是同時也增加額外的開銷,並且增加了系統的延遲

流水線

影響最大時鐘頻率的因素

時鐘頻率是數據流入西太后在輸出端出現的速率。
理想情況對於沒有任何抖動的理想時鐘,時鐘信號同時到達兩個寄存器模塊。

時鐘偏移

在實際電路中,由於存在線路上的傳播延遲,寄存器B的時鐘輸入相對於寄存器A可能會有一些延遲,這種現象稱爲“時鐘偏移”,在相鄰兩個寄存器的時鐘延遲大於這兩個寄存器之間的數據路徑延遲,就會產生負時鐘偏移。這種情況下,先到的時鐘會引起競爭條件(即數據還未成功鎖存,時鐘就觸發了寄存器)。

時鐘抖動

到達電路中某一點的連續時鐘邊沿之間間隔的變化稱爲時鐘抖動。
時鐘抖動流水線真實路徑我們計算從寄存器bf到輸出o之間的精確的組合延時。
各時鐘源時鐘對延時貢獻的時序圖組合延遲部分可以通過添加多個觸發器來減小,來增大電路的最大頻率。

流水線

流水線使用存儲器件將時鐘週期內關鍵路徑(最大組合延遲的路徑)分割開來。減小了關鍵路徑上各階段延遲並使電路以更高頻率工作。但是使用並行電路進行同樣的k次操作,比重複使用某一邏輯k次在面積和功耗方面的開支更大,因爲使用了更多的觸發器和額外邏輯,導致了更多的連線。
8輸入加法器流水線流水線的延時是從數據進入流水線的輸入端到這些數據經過處理後從流水線的輸出端輸出所小號的時間。
插入流水線前邏輯對於非流水線電路的延時:
Tlatency = Tcomb + Tregister +Tclk
Tregister(寄存器開支) = Tcq + Tstep
Tclk(時鐘開支) = Tskw + Tjit

而插入流水線後,延時最大的流水器階段決定時鐘週期:
Tpipeline=max{Tcomb} + Tregister +Tclk
插入流水線 後邏輯而最終系統的延遲:
T=n*Tpipeline =Tcomb+n(Tregister + Tclk)
注意:在使用流水線會引入額外的開銷,如時鐘偏移和寄存器延遲,限制了流水線所能達到的加速值

DLX指令集的實現

DLX是新興學院派指標結構的理論32位RISC微處理器,每條DLX指令最多由5部分組成,最多用5個時候週期完成。

指令獲取(IF)

IR  < =  MEM[PC]
NPC < =PC+4

操作:
1、從存儲器獲取指令並放入指令寄存器(IR)
2、IR保存下個時鐘週期所需指令
3、PC值遞增4,指向下一個指令地址

解碼(ID)

A<=Reg[IR6...10]
B<=Reg[IR11...15]
IMM<={[IR16]16IR16...31}

操作:
1、分析IR中的指令並訪問寄存器堆以讀取寄存器
2、將通用寄存器的輸出讀入兩個臨時寄存器A和B
3、IR的高16位經過符號擴展保存到臨時寄存器IMM中供以後使用

執行(EX)

ALU對上一個時鐘週期準備好的操作數進行操作,根據DLX指令的類型進行下面一個功能的一個:

  • 訪問存儲器
    操作:ALU通過加法形成有效地址,並將結果放入寄存器ALUoutput中
  • 寄存器-寄存器ALU指令
    操作:根據操作碼對寄存器A和B的數值進行操作,把結果放在臨時寄存器ALUoutput中
  • 寄存器-立即數ALU指令
    操作:根據操作碼對寄存器A和IMM的數值進行操作,把結果放在臨時寄存器ALUoutput中
  • 分支指令
    操作:ALU計算出分支的目標地址,檢查寄存器A的值來決定是否進行分支

儲存器訪問(MEM)

  • load:從存儲器中返回的數值存入LMD寄存器中
  • store:將寄存器B寫入存儲器

寫回(WB)

  • 寄存器-寄存器ALU指令
  • 寄存器-立即數週期
  • 取指令

操作:將結果寫回寄存器堆中,結果可能來自存儲器或者ALU
單週期的DLX數據路徑

流水線對吞吐量的影響

使用流水線的DLX數據通路引入流水線時會帶來額外的開銷,需要控制。

流水線冒險

(1)結構冒險:由於資源衝突而使硬件無法支持所有的指令組合同時執行
(2)數據冒險:指令執行需要之前指令的計算結果,而這個結果在流水線還沒有計算出來
(3)控制冒險:分支的流水線和其他指令改變程序計數器的值
(4)存儲器的冒險
通用方法:停止流水線,阻塞。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章