新聞中心

        EEPW首頁 > EDA/PCB > 設計應用 > SOC參數自動配置設計方法與功耗優化

        SOC參數自動配置設計方法與功耗優化

        作者: 時間:2012-10-29 來源:網絡 收藏

        引 言

        本文引用地址:http://www.104case.com/article/189803.htm

        片上系統( system ON chip ,) 已經成為21世紀全球矚目的關鍵核心技術。 具有垂直整合的特性,并注重創新和創意,產品非常個人化、應用差異化、樣式多元化。 應用需求的廣泛性,以及大部分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

        ..


        上一頁 1 2 3 4 下一頁

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 莒南县| 岱山县| 高邮市| 咸宁市| 吉安市| 天水市| 方城县| 定西市| 鲜城| 桓台县| 南乐县| 若尔盖县| 吉林省| 定安县| 康定县| 紫金县| 龙海市| 讷河市| 阳城县| 霍城县| 禄丰县| 雅安市| 静安区| 泰顺县| 白沙| 许昌县| 新竹市| 乐业县| 黑山县| 册亨县| 绥滨县| 天全县| 房产| 临朐县| 廉江市| 阿克苏市| 鄂尔多斯市| 白山市| 大新县| 云安县| 汨罗市|