SOC參數(shù)自動配置設(shè)計方法與功耗優(yōu)化
引 言
片上系統(tǒng)( system ON chip ,SOC) 已經(jīng)成為21世紀全球矚目的關(guān)鍵核心技術(shù)。 SOC 具有垂直整合的特性,并注重創(chuàng)新和創(chuàng)意,產(chǎn)品非常個人化、應(yīng)用差異化、樣式多元化。 SOC 應(yīng)用需求的廣泛性,以及大部分SOC 應(yīng)用功能單一、性質(zhì)確定的特點,決定了SOC 目前大多是針對專門的應(yīng)用領(lǐng)域進行專門設(shè)計來滿足高性能、低成本和低功耗的要求。 目前SOC 的發(fā)展趨勢是: 體系結(jié)構(gòu)需要在新技術(shù)與產(chǎn)品、市場和應(yīng)用需求之間取得平衡;設(shè)計方法趨向于走專用、定制和自動化的道路。
一方面由于SOC 的專用化設(shè)計要求,另一方面由于IP 提供商的支持, SOC 的集成設(shè)計方法正向參數(shù)化設(shè)計發(fā)展。 SOC 的參數(shù)可能影響系統(tǒng)功耗、性能和面積,每個參數(shù)的選擇范圍是一個有限集合,因此一個SOC 設(shè)計可以理解為一組SOC 參數(shù)的選擇。 在系統(tǒng)結(jié)構(gòu)形成后,SOC 設(shè)計問題就轉(zhuǎn)變?yōu)閰?shù)配置問題。 隨著參數(shù)的增多,手工對代碼進行修改是不可接受的,這不僅效率低,而且會增加錯誤率。本文對原有的硬件描述語言進行擴展,并建立了參數(shù)自動配置環(huán)境,通過分析SOC 參數(shù)屬性,利用鄰域搜索算法針對功耗進行自動參數(shù)優(yōu)化。
參數(shù)自動配置設(shè)計方法
采用傳統(tǒng)的硬件描述語言(HDL) ,參數(shù)自動配置的難點在于:首先模塊本身的描述隨參數(shù)配置的改變而變化; 其次當模塊被更上層的父模塊例化(inSTance) 時,其接口邏輯在不同參數(shù)配置下也可能不同。 在進行參數(shù)化設(shè)計時,只能采用硬件描述語言的宏定義,這種方法不僅不夠靈活,而且代碼復(fù)雜,冗余很多。
參數(shù)自動配置環(huán)境由一組運行腳本組成,主要通過兩個工具Eperl 和Vperl 來進行參數(shù)配置,實現(xiàn)了代碼的即配置即生成。 Eperl 的作用是定制內(nèi)部的邏輯,Vperl 的作用是生成模塊間的連接關(guān)系。 基于Verilog 硬件描述語言的參數(shù)自動配置過程如下。
1) 參數(shù)首先被送到3.evp 文件,這是同時包括Eperl 語法和Vperl 語法的文件,因為Eperl 和Vperl 電路的語法非常簡潔,所以設(shè)計師不僅不用擔心會在這里陷入困境,反而會大大減少設(shè)計強度。
2) 3.evp 文件經(jīng)過Eperl 處理后生成3.vp 文件,這是只包含Vperl 語法的文件,這時所有的參數(shù)都被解析,模塊內(nèi)參數(shù)配置都已經(jīng)完成了。
3) 3.vp 經(jīng)過Vperl 處理后, 最后生成3.v 文件, 即電路的Verilog 描述。 因此在參數(shù)化設(shè)計中,與傳統(tǒng)設(shè)計不同,設(shè)計師的描述文件是3.evp 文件,而Verilog 代碼只是作為設(shè)計的中間代碼出現(xiàn)。 參數(shù)自動配置環(huán)境建立了一系列腳本程序來自動解析相關(guān)文件的相互關(guān)系,并生成整個系統(tǒng)的硬件描述語言描述。
Eperl 最初用作HTML 頁面生成,適合于靜態(tài)文本相當多,但是又有一部分代碼需要動態(tài)生成的場合。 因為大多數(shù)硬件描述是靜態(tài)代碼,只有一小部分需要可配置,所以Eperl 非常適用于電路的硬件描述。 Eperl 結(jié)合了Perl 的解釋功能,相當于在原文本結(jié)構(gòu)中插入了一段內(nèi)嵌代碼。 這段內(nèi)嵌代碼最終可以生成想要配置的硬件結(jié)構(gòu)。 Eperl 利用Print 結(jié)構(gòu)來傳遞所有的內(nèi)嵌代碼。 Eperl 所做的相當于程序員寫一個用于生成代碼的Perl 腳本。 下面所示程序段是從dma _fifo.evp 文件中提取的一部分代碼。
∥Synchronous FIFO.fifo_depth x fifo_width bit words.
&moduleBeg ;
&Ports ;
&Regs ;
&WIRes ;
< : $width_msb=$fifo_width21 ;
$depth_msb=$fifo_depth21 ;
$ptr_width=log ( $fifo_depth)/log (2) ;
$ptr_msb=$ptr_msb21 ;
: >
&Force ("mem","fifomem", < :=$width_msb : >,0,
< :=$depth_msb : >,0) ;
……
∥Update FIFO memory.
always @(posedge clk) begin
if ( rstp== 1′b0 & & writep== 1′b1 & &
fullp== 1′b0)
fifomem [ head ] <=din [ < :=$width_msb :
> :0 ] ;
end
∥Update the head register.
always @(posedge clk) begin
if ( rstp== 1’b1)
head [<:=$ptr_msb:>:0]<=<:=$ptr_width:>′b0 ;
else
if (writep== 1′b1 & & fullp== 1′b0)
head [ < :=$pt r_msb : > :0 ] < =
head [ < :=$pt r_msb : > :0 ] + 1 ;
end
..
在< :…… : > 中的就是Eperl 代碼,以& 開始的是Vperl 代碼, 如&ModuleBeg 表示模塊的開始。 在FIFO 中,可配置的參數(shù)主要是2 個: FIFO 深度和FIFO 寬度,所以dma_fif.evp 文件對外只有2 個參數(shù)可調(diào), 而其他的比如定義信號所需要的FIFO 寄存器的最高位width_msb 、head 指針的寬度ptr_width 等都可以用Eperl 腳本生成。 這與宏定義相比體現(xiàn)了Eperl 的靈活性。再比如可以通用寄存器組gpr.evp 文件利用for 循環(huán)來例化每一個寄存器,更充分地體現(xiàn)了使用Eperl 的靈活性。 for 循環(huán)的代碼如下所示。
for($i = 0;$i<$reg _num;$i++) {
print"&Instance ("iu_register","iu_register_$i " );n" ;
}
: >
……
3.evp 格式的文件經(jīng)過Eperl 解析后生成
3.vp格式的文件。 dma _fifo.evp 經(jīng)過Eperl 解析后生成的3.vp 文件如下所示。
∥Synchronous FIFO.fifo_depth x fifo _width bit words。
&ModuleBeg ;
&Ports ;
&Regs ;
&Wires ;
&Force ("mem" ,"fifomem" ,15 ,0 ,3 ,0) ;
……
∥Update FIFO memory。
always @(posedge clk) begin
if (rstp== 1′b0 & & writep==1′b1 & &fullp==1′b0)
fifomem [head]<= din [15 :0] ;
end
∥Update the head register。
always @(posedge clk) begin
if (rstp = = 1′b1)
head [1 :0 ] < = 2′b0 ;
else
if (writep = = 1′b1 & & fullp = = 1′b0)
head [1 :0 ] < = head [1 :0 ] + 1 ;
end
……
當然IP 模塊的不同配置會造成SOC 系統(tǒng)信號的不同。 如向系統(tǒng)中添加通用異步收發(fā)器(UART)模塊,SOC 系統(tǒng)就要增加輸入輸出端口,并且要增加很多內(nèi)部的連線,比如把IP 總線引入UART.Vperl 程序可以解決這個問題。
Vperl 的工作原理是通過分析模塊內(nèi)使用的信號的屬性來確定模塊的信號定義。 HDL 具有一定的語法結(jié)構(gòu),比如Verilog 有2 種信號類型,always 塊中的<= 操作符左邊一定是reg 類型信號,由此取reg 類型的補集就是wire 類型,除非顯式地通過&Force()聲明為其他類型,如在dma_fifo.vp 中的第6 行代碼,聲明為二維reg 數(shù)組類型。 分析模塊也可以確定模塊的輸入輸出,如果一個信號在模塊中自始至終沒有被賦值過,那么這個信號必然是input信號;同理,如果一個信號被賦值但從來沒被使用過,就是output 信號; 如果既被賦值過,又被使用過,那么這個信號有很大可能是這個模塊的內(nèi)部信號,不是模塊的端口,除非顯式地通過&Force ( ) 聲明為inout類型。 對于模塊中例化的子模塊(在3.vp 中用&Instance() 語句聲明) ,Vperl 程序首先分析模塊間的從屬關(guān)系,并先處理最底層的子模塊代碼,在自動分析子模塊接口的輸入輸出屬性后,缺省地把子模塊的輸入輸出信號作為上層模塊的接入信號,并在上層模塊中自動進行連接,當然Vperl 也提供了&Connect () 語句來更改子模塊接入上層模塊的信號名。 所以用Vperl 的格式書寫的文件3.vp不需要在文件頭部定義信號名。 如下所示是dma_fifo.vp 文件的示例代碼。
∥Synchronous FIFO.fifo _depth x fifo _width bit words。
module dma _fifo (clk,rstp,din,writep,readp,dout ,emptyp,fullp);
input clk;
input rstp;
input [15:0] din;
input readp;
input writep;
output [15:0]dout;
output emptyp;
output fullp;
reg emptyp;
reg fullp;
reg [15:0]dout;
reg [ (DEPTH-1):0 ] tail;
reg [ (DEPTH-1):0 ] head;
reg [ (DEPTH-1):0 ] count;
reg [15:0 ] fifomem [0:MAX_COUNT];
……
∥Update FIFO memory。
always @(posedge clk) begin
if ( rstp==1′b0 && writep==1′b1 &&fullp==1′b0)
fifomem [head]<= din [15:0];
end
∥Update the head register。
always @(posedge clk) begin
if ( rstp==1′b1)
head[1:0 ]<=2′b0;
else
if (writep==1′b1 & & fullp==1′b0)
head[1:0 ]<=head[1:0 ] + 1;
end
……
在上述程序段中, din [15:0 ] 對應(yīng)參數(shù)fifo_width=16 的情況, 如果在dma_top 模塊中用Vperl 語法例化了dma_fifo ( &Instance(dmafifo);) ,那么Vperl把din[15:0]連接進dma_top ,并進而生成dma_top.v 代碼,即dma_top.v 的信號定義。
Vperl 實際上是接管了模塊間的信號連接工作,使得設(shè)計師不用擔心參數(shù)改變對模塊間關(guān)系的影響。 另外,Vperl 的另一項優(yōu)點就是省去了每個HDL 文件中繁瑣的信號定義,避免因為信號定義引起的語法錯誤(比如信號忘記定義、信號名打錯等) ,大大加快源代碼的編寫速度。 當然,使用Vperl 需要遵循一定的語法。
在參數(shù)自動配置機制中,結(jié)合Eperl 和Vperl這兩種工具就可以由選定的參數(shù)組合自動地配置硬件結(jié)構(gòu)。 對于軟件而言,由C 語言編寫的應(yīng)用程序不需要修改,但是編譯器需要針對不同的執(zhí)行單元的配置增加減少指令并進行優(yōu)化。
SOC 參數(shù)優(yōu)化
一個SOC 中包括了P1 , P2 , P3 , ..., Pn 等參數(shù)。每個參數(shù)的值都可以從一個有限集合中選取。 為了選擇最優(yōu)的參數(shù)值,也就是為了達到最優(yōu)的系統(tǒng)配置,使功耗、性能和面積達到合理的目標,需要進行參數(shù)優(yōu)化。 一種方法是運行一次仿真后,記錄下指令序列(trace) ,將不同的參數(shù)配置結(jié)合指令序列通過純軟件的行為分析器進行分析。 這種方法的優(yōu)勢是速度快。 但是在不同的結(jié)構(gòu)參數(shù)下,指令序列差別很大,特別是當指令集都發(fā)生改變時,結(jié)果的可信度大大降低;而且行為分析器對一些動態(tài)參數(shù),比如動態(tài)電壓,對功耗的影響無法估計,所以可能不得不進行多次仿真來獲得較準確的功耗估計。 由于仿真時間一般較長,參數(shù)的優(yōu)化算法對設(shè)計周期的影響很大。
參數(shù)的屬性
在SOC 設(shè)計中的定制概念不再是晶體管級的定制,而是體現(xiàn)在模塊級層面上,具體表現(xiàn)為系統(tǒng)的結(jié)構(gòu)參數(shù)。 SOC 的系統(tǒng)參數(shù)具有一些屬性,如大多數(shù)系統(tǒng)參數(shù)是相互影響的,這些相關(guān)性必須在參數(shù)配置時予以考慮。 相關(guān)性可以區(qū)分為數(shù)值相關(guān)和性能相關(guān)。 參數(shù)自身也有單調(diào)性和層次性。
數(shù)值相關(guān)
兩參數(shù)的數(shù)值相關(guān)意味著一個參數(shù)的選擇限制了另一個參數(shù)的選擇范圍。 例如對于容量限制為64 ×8 bit s 的直接存儲器存取(DMA) 緩沖區(qū),可以緩沖64 個8 位數(shù)據(jù),但是當用于緩沖32 位數(shù)據(jù)時,只能放16 個數(shù)據(jù)。 在這里數(shù)據(jù)個數(shù)和數(shù)據(jù)格式是數(shù)值相關(guān)的。 再如可配置處理器的乘法器(MUL) 單元一般不會和乘累加器(MAC)單元一起出現(xiàn),因為兩者的功能是重疊的。 在進行參數(shù)選擇時,利用數(shù)值相關(guān)性可以去除一些不可能的參數(shù)值,縮小參數(shù)的選擇范圍。
性能相關(guān)
兩參數(shù)的性能相關(guān)意味著一個參數(shù)的改變會影響另一個參數(shù)的最優(yōu)選擇。性能相關(guān)是有方向性的,如果參數(shù)B 與A 性能相關(guān), 則參數(shù)A 是B 的主動參數(shù),參數(shù)B 是A 的隨動參數(shù)。 在參數(shù)選擇時,可以先確定A 再確定B 。如寄存器的個數(shù)相關(guān)與MUL 單元相關(guān)意味著MUL 單元是主動參數(shù),而寄存器個數(shù)是隨動參數(shù)。 兩個參數(shù)也可能互相相關(guān),也就是說參數(shù)A 和B 之間形成環(huán)路。 這時兩個參數(shù)必須同時調(diào)整才能得到最優(yōu)的方案。 例如高速緩存的組參數(shù)和每個緩存塊的容量參數(shù)的性能是相關(guān)的。 在進行參數(shù)選擇時,性能不相關(guān)的參數(shù)可以獨立選取最優(yōu)解。
單調(diào)性
很多參數(shù)對某一優(yōu)化目標而言是單調(diào)函數(shù)。 例如決定UART 緩沖區(qū)大小的參數(shù),對功耗這一優(yōu)化目標,一般是緩沖區(qū)越大功耗越大。 參數(shù)的方向性也可以縮小參數(shù)的選擇范圍。
層次性
模塊參數(shù)只影響模塊自身,比如Cache 容量、Cache 行大小和關(guān)聯(lián)組個數(shù)。 多個模塊參數(shù)可以形成一個系統(tǒng)參數(shù),比如從系統(tǒng)角度來看,Cache 失配率就是一個系統(tǒng)參數(shù)。 利用參數(shù)的層次性可以進行局部優(yōu)化。
鄰域搜索算法
參數(shù)的性能相關(guān)性是參數(shù)優(yōu)化的主要難題。 首先需要一種數(shù)據(jù)結(jié)構(gòu)來表征性能相關(guān)性。 圖1 較好地表示了參數(shù)的性能相關(guān)性。 其中,參數(shù)用節(jié)點表示,而節(jié)點與節(jié)點間的連線表示兩參數(shù)的性能相關(guān)。節(jié)點和節(jié)點之間的連線是有方向性的,從A 到B 的邊表示參數(shù)B 與A 的性能相關(guān)。
圖1 功耗性能相關(guān)圖
隨著SOC集成度的進一步提高,參數(shù)個數(shù)增多,導(dǎo)致設(shè)計選擇空間急劇擴大,完全地對每一個參數(shù)組合進行評價是不可能的。 由于每次計算代價函數(shù)需要很長的時間,一些進化優(yōu)化算法,如遺傳算法不再適用。 鄰域搜索算法是一種解決優(yōu)化問題的方法。 一般來說,鄰域搜索算法只能找到局部最優(yōu)解。但是與大多數(shù)優(yōu)化問題不同,SOC 的參數(shù)具有一定的方向性,系統(tǒng)設(shè)計師的經(jīng)驗可以幫助設(shè)計師找到一種較優(yōu)化的參數(shù)組合,SOC 參數(shù)優(yōu)化的主要目的是對系統(tǒng)性能進行微調(diào),因此鄰域搜索算法可以滿足SOC 參數(shù)優(yōu)化的要求。
以一個數(shù)據(jù)采集系統(tǒng)為例來驗證領(lǐng)域搜索算法的有效性,數(shù)據(jù)采集系統(tǒng)的參數(shù)如表1 所示。 在這個應(yīng)用中,系統(tǒng)從UART 接收數(shù)據(jù),利用DMA 運送到內(nèi)存,軟件進行32 點FIR 濾波處理。 UART 的接收速率是10kB/s ,參數(shù)的性能相關(guān)圖如圖1 所示。
首先建立功耗相關(guān)圖。在建圖過程中,可以利用參數(shù)的數(shù)值相關(guān)進行參數(shù)歸并,比如MUL的選用和MAC的選用可以歸并為一個參數(shù);以及區(qū)分參數(shù)的層次性,比如ICache 的失配參數(shù)N 由參數(shù)A 、B 、C 的一個子圖組成。 接著設(shè)立代價函數(shù)f ( K) =系統(tǒng)功耗, K 是一個參數(shù)組合。 選擇初始解Kbest.f best=f(Kbest ) 。 然后進行參數(shù)優(yōu)化,參數(shù)優(yōu)化的算法步驟如下。
1) 分析功耗相關(guān)圖的拓撲順序,包括較低層次的子圖。 一般可以采用鄰接表作為實現(xiàn)上述算法的數(shù)據(jù)結(jié)構(gòu)。 首先從圖中選一個入度為0 的節(jié)點并將其輸出,然后從圖中刪掉此節(jié)點及其所有的邊。 反復(fù)執(zhí)行這兩步,直至剩下的圖中再也沒有入度為0 的節(jié)點。 剩下的就是單個節(jié)點或環(huán)路。 分析拓撲順序是 為了確定參數(shù)優(yōu)化的順序。 拓撲序列的第一個節(jié)點就是第一個被優(yōu)化的參數(shù)。
表1 數(shù)據(jù)采集系統(tǒng)參數(shù)表
2) 鄰域映射定義為取當前優(yōu)化節(jié)點的最近可選值。 仿真得到功耗f ( K) 。 如果f ( K) < f best ,則Kbest = K , f best = f ( K) ;否則退回原來的值。 重復(fù)步驟2) ,直到最近的可選值都被仿真過。
3) 選擇下一個優(yōu)化的節(jié)點,一般選擇拓撲序列的下一個參數(shù),但是在環(huán)路中,如果一個參數(shù)發(fā)生改變,則需要重新遍歷一遍環(huán)路,這時應(yīng)取環(huán)路上的節(jié)點。 如果該節(jié)點包含較低層次的子圖,則選取子圖中的節(jié)點。 重復(fù)步驟2) 。
實驗結(jié)果
在進行優(yōu)化實驗前, 需要建立IP的功耗模型。 門級電路的功耗估計已經(jīng)比較成熟了。 因為門電路的結(jié)構(gòu)比較簡單,可以比較容易地測量靜態(tài)功耗,并根據(jù)標準單元的輸入建立動態(tài)功耗的查詢表。 但是門電路的功耗分析可能需要較大的運算量,而且門電路方法一般用于設(shè)計的后期,這時軟硬件劃分、硬件微結(jié)構(gòu)設(shè)計、寄存器傳輸級(RTL)設(shè)計、綜合都已經(jīng)完成了。 這種方法無法對系統(tǒng)設(shè)計提供幫助或參考,這對系統(tǒng)設(shè)計師來說是很大的擔心,也可能對設(shè)計周期產(chǎn)生影響。 當前功耗建模的方向主要是在RTL 或行為級領(lǐng)域。功耗常常與狀態(tài)相關(guān)。 對于狀態(tài)機電路來說,由于硬件模塊一般有幾個狀態(tài),在不同狀態(tài)下,每個時鐘周期上消耗的能量是不同的,可以利用IP 的狀態(tài)機建模。 狀態(tài)功耗模型并不一定和IP 核的電路狀態(tài)機完全一致,它還可以考慮電路中的一些組合邏輯輸出和關(guān)鍵輸入信號如門控時鐘信號等,只要這些信號的組合可以表示一個特殊的功耗狀態(tài)即可。本文采用常用的狀態(tài)功耗建模方法,利用TSMC0。18 工藝的門電路仿真數(shù)據(jù)對Cache 、GPR、各運算單元、DMA 和UART 進行建模。
在軟硬件仿真平臺上,對這個數(shù)據(jù)采集系統(tǒng)進行仿真。 由于應(yīng)用程序較短以及采樣速率不是很高,在實驗中,共經(jīng)過了28 個參數(shù)組合的仿真,得到的優(yōu)化解如表2 所示。 如果對整個設(shè)計空間進行仿真則需要1.92×107 次仿真。
表2 對參數(shù)進行鄰域搜索優(yōu)化的結(jié)果
結(jié) 語
原有的硬件描述語言難以適應(yīng)參數(shù)化設(shè)計的要求,Eperl 和Vperl 提供了硬件描述語言的擴展。 利用參數(shù)自動配置環(huán)境嵌入Eperl 和Vperl ,可以生成對應(yīng)特定參數(shù)配置的SOC 硬件語言描述。 參數(shù)優(yōu)化建立在參數(shù)自動配置環(huán)境的基礎(chǔ)上。 在分析SOC參數(shù)屬性基礎(chǔ)上提出的領(lǐng)域搜索算法可以大大減少SOC優(yōu)化周期。 該設(shè)計環(huán)境已應(yīng)用于一款嵌入式RISC處理器CK520和基于它的SOC開發(fā),并取得了滿意的效果。