SOC參數(shù)自動配置設計方法與功耗優(yōu)化
引 言
本文引用地址:http://www.ex-cimer.com/article/189803.htm片上系統(tǒng)( system ON chip ,SOC) 已經(jīng)成為21世紀全球矚目的關鍵核心技術。 SOC 具有垂直整合的特性,并注重創(chuàng)新和創(chuàng)意,產(chǎn)品非常個人化、應用差異化、樣式多元化。 SOC 應用需求的廣泛性,以及大部分SOC 應用功能單一、性質(zhì)確定的特點,決定了SOC 目前大多是針對專門的應用領域進行專門設計來滿足高性能、低成本和低功耗的要求。 目前SOC 的發(fā)展趨勢是: 體系結構需要在新技術與產(chǎn)品、市場和應用需求之間取得平衡;設計方法趨向于走專用、定制和自動化的道路。
一方面由于SOC 的專用化設計要求,另一方面由于IP 提供商的支持, SOC 的集成設計方法正向參數(shù)化設計發(fā)展。 SOC 的參數(shù)可能影響系統(tǒng)功耗、性能和面積,每個參數(shù)的選擇范圍是一個有限集合,因此一個SOC 設計可以理解為一組SOC 參數(shù)的選擇。 在系統(tǒng)結構形成后,SOC 設計問題就轉變?yōu)閰?shù)配置問題。 隨著參數(shù)的增多,手工對代碼進行修改是不可接受的,這不僅效率低,而且會增加錯誤率。本文對原有的硬件描述語言進行擴展,并建立了參數(shù)自動配置環(huán)境,通過分析SOC 參數(shù)屬性,利用鄰域搜索算法針對功耗進行自動參數(shù)優(yōu)化。
參數(shù)自動配置設計方法
采用傳統(tǒng)的硬件描述語言(HDL) ,參數(shù)自動配置的難點在于:首先模塊本身的描述隨參數(shù)配置的改變而變化; 其次當模塊被更上層的父模塊例化(inSTance) 時,其接口邏輯在不同參數(shù)配置下也可能不同。 在進行參數(shù)化設計時,只能采用硬件描述語言的宏定義,這種方法不僅不夠靈活,而且代碼復雜,冗余很多。
參數(shù)自動配置環(huán)境由一組運行腳本組成,主要通過兩個工具Eperl 和Vperl 來進行參數(shù)配置,實現(xiàn)了代碼的即配置即生成。 Eperl 的作用是定制內(nèi)部的邏輯,Vperl 的作用是生成模塊間的連接關系。 基于Verilog 硬件描述語言的參數(shù)自動配置過程如下。
1) 參數(shù)首先被送到3.evp 文件,這是同時包括Eperl 語法和Vperl 語法的文件,因為Eperl 和Vperl 電路的語法非常簡潔,所以設計師不僅不用擔心會在這里陷入困境,反而會大大減少設計強度。
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ù)化設計中,與傳統(tǒng)設計不同,設計師的描述文件是3.evp 文件,而Verilog 代碼只是作為設計的中間代碼出現(xiàn)。 參數(shù)自動配置環(huán)境建立了一系列腳本程序來自動解析相關文件的相互關系,并生成整個系統(tǒng)的硬件描述語言描述。
Eperl 最初用作HTML 頁面生成,適合于靜態(tài)文本相當多,但是又有一部分代碼需要動態(tài)生成的場合。 因為大多數(shù)硬件描述是靜態(tài)代碼,只有一小部分需要可配置,所以Eperl 非常適用于電路的硬件描述。 Eperl 結合了Perl 的解釋功能,相當于在原文本結構中插入了一段內(nèi)嵌代碼。 這段內(nèi)嵌代碼最終可以生成想要配置的硬件結構。 Eperl 利用Print 結構來傳遞所有的內(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
..
評論