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