1、低功耗設計策略
1)動態功耗和靜態功耗
動態功耗包括開關功耗(switching power)和內部功耗(internal power),前者來源於對負載電容的充放電,后者來源於短路電流。
靜態功耗包括亞閾值漏電、柵漏電、pn結到襯底的漏電。
2)降低功耗的方法
a)降低供電電壓
功耗與電源的二次方成正比,因此降低電源電壓是降低功耗的有效手段。但是帶來的負面影響是:降低了晶體管的切換速度,因此而降低了晶體管的閾值電壓,又會使得噪聲容限減小、亞閾值漏電增加
b)時鍾門控
c)使用多閾值庫單元
低閾值單元速度快,但漏電高;高閾值單元速度慢,但漏電低。可以在時序上的關鍵路徑使用低閾值單元提高速度,在非關鍵路徑上使用高閾值單元降低漏電。
d)多電壓域設計
速度要求高的模塊放在高電壓域,速度要求不高的放在低電壓域,兩者之間信號交互需要通過level-shifter 單元轉換
e)電源門控
可以同時降低動態和靜態功耗,存在的挑戰有:the need for a power controller, a power-switching network, isolation cells, and retention registers.
在Power-down模塊和Always-on模塊之間需要添加隔離單元,其作用是當被門控的模塊斷電之后可以為不斷電模塊提供一個穩定的輸入驅動,如圖所示的隔離單元在左邊模塊不斷電的情況下正常傳遞信號,當斷電時維持固定邏輯“0”
在Power-down模塊和Always-on模塊之間還需要添加保持寄存器,其作用是在模塊斷電之前拷貝主寄存器的數據到影子寄存器,在模塊重新上電之后再從影子寄存器中恢復數據到主寄存器。
f)動態電壓頻率調節
在運行過程中,為了滿足負載要求而動態地改變電源電壓和工作頻率,稱為動態電壓和頻率調節。
3)統一電壓格式(UPF)
使用UPF命令,可以為芯片設計指定電源網絡、電源開關、隔離、保持和電源管理等。
2、庫的要求
1)Liberty PG引腳語法
為每個單元的供電引腳指定供電電源。
2)時鍾門控單元
集成的時鍾門單元將時鍾門的各種組合和時序元素集成到單個庫單元中。
3)多閾值單元
可以使用屬性定義多閾值單元:
4)電平轉換器
雙向信號不能用電平轉換器
5)隔離單元
雙向信號不能用隔離單元。可以同時執行電平轉換和隔離功能的單元稱為enable level-shifter單元。
使用隔離單元的原因:
當左邊的Voltage Area處於關斷狀態,右邊的Voltage Area卻始終處於開啟狀態,左邊的PD關斷使電路輸出懸空,處於未知狀態X,則PMOS管和NMOS管可能同時導通,造成器件短路。(https://www.sohu.com/a/220628287_99933533)
6)電源門控單元
7)常開邏輯單元
作用:在shutdown電壓域中需要一直保持active的單元,比如保持寄存器、隔離單元、retention 控制路徑、isolation使能路徑。比如,一個save或者restore信號穿過shutdown電壓域並且需要加緩沖,那么就需要一個常開的buffer。與常規單元相比,它們多了一個備份電源。
8)保持寄存器單元
9)內部有生成電源的MACRO單元
10)將庫轉到PG Pin庫格式
a)使用FRAM View
b)使用Tcl命令
c)使用針對低功耗庫規格的命令
3、電源意圖規范
統一電源格式(UPF)提供了一種統一的方式來指定整個設計過程中的電源實現意圖,包括綜合、物理實現和驗證。這種一致性使得在給定設計中存在特定的低功耗特性時,更容易執行綜合、仿真、邏輯等價性檢查和設計驗證
1)電源意圖的概念
a)power domain:一塊電壓域中所有的單元共享同一組電源,通常被實現為物理芯片布局中的一個連續電壓區域。每個電壓域帶一個scope屬性和一個extent屬性,scope是這個電壓域被定義的邏輯層次,而extent則是屬於這個電壓域的邏輯元素集合。
b)supply net和supply port:設計中的每個scope在它定義的層次級別上都有supply net和supply port。supply net是在給定的電源區域內承載電源電壓或接地的導體,一個supply net穿過多個電壓域被稱為“reused”。supply port是設計層次結構的兩個相鄰層次之間、層次結構的父塊和子塊之間的電源連接點。從設計層次結構的一個層次跨越到下一個層次的supply net通過一個supply port。
c)supply set:它是supply net的一個抽象集合,supply set是domain-independent的,這意味着supply set中的電源地可以被它所定義的scope中的所有power domain共用。
d)supply set handle :
e)power switch:是一個針對於supply net開關電源的器件。一個switch有一個輸入的supply net,和一個可以被開啟或者關閉的輸出的supply net,以及至少一個輸入信號控制開關。
f)level shifter:電平移位器將信號從第一個域的電壓擺幅轉換為第二個域的電壓擺幅。
g)isolation cell:電平移位器在電壓域關閉期間生成一個已知的邏輯值。
h)retention registers:在具有電源開關的電源域中,在關機期間必須保留數據的任何寄存器都必須實現為保留寄存器。保留寄存器有一個單獨的、始終在線的供應網絡,有時稱為備份供電,它在域的主供電關閉時保持保留寄存器中的數據穩定。
示例1:
創建電壓域:
訪問某個電壓域、電壓端口、電壓網絡的方法:
示例2:
創建電壓域:
2)Synopsys 多電壓流程
power-related cells 是在綜合時加入的,而power switch則是在PR時加入的
3)UPF Commands Supported by Synopsys Tools
a)Basic Power Network Commands
基本電源命令定義設計的電壓域和每個域的電源端口、電源網絡和電源開關。
-create_power_domain
-create_supply_port
-create_supply_net
-connect_supply_net
電源端口在兩端只能連接一次,VCS和Formality對power流動的方向施加限制。
-set_domain_supply_net
The set_domain_supply_net command specifies the primary power net and primary ground net for an existing power domain. They are the default power nets connected to the logic elements (or inferred cells) of the power domain. At the gate level, the power and ground pins of inferred gates are connected to the primary power and ground nets unless specified otherwise by the connect_supply_net, set_retention, or set_isolation command.
指定primary power net 和 primary groud net,它們是邏輯單元的power pin和ground pin默認連接的nets。
-create_power_switch
b)Level Shifter Commands
-set_level_shifter
c)Power Supply Checking, Reporting, and Collection Commands
生成報表
-report_power_domains
-report_supply_nets
-report_supply_ports
-get_power_domains
-get_supply_nets
-get_supply_ports
d)Golden UPF flow
4)Supply set
一個supply set 包含某個instance 或power domain 所有的supply nets
4、UPF腳本示例
1)雙電壓域
可以看到,上述例子並沒有顯式地去創建CPU_1的電源端口VN和GN以及CPU_2的電源端口VN和GN,因為供電網絡PDSODIUM/VN1和PD_CPU_1/VN1都是在SODIUM這個scope中創建的,因此它們會自動創建端口進行跨層次連接。還少一個 create_supply_net VN2 -domain PD_SODIUM -reuse
2)Hierarchy and the get_supply_nets Command
5、特定工具的使用建議
1)Logic Synthesis Using Design Compiler
DC可以基於UPF命令和UPF指定的電源狀態自動插入level shifters,isolation cells,rentention registers。
DC的輸入文件包括RTL和用戶編寫的UPF,綜合之后會生成一個新的UPF,新的UPF包含了一些綜合過程中與電源管理單元相關的連接,如level shifters,isolation cells,rentention registers。
基本流程:
a)電壓域和層次
2)指定工作電壓
3)編譯
在運行編譯之前,將auto_insert_level_shifters_on_clocks變量設置為時鍾名稱列表或全部,這樣編譯器就會給時鍾也插level shifters