新聞中心

        EEPW首頁 > EDA/PCB > 設計應用 > SoC系統描述與SystemC

        SoC系統描述與SystemC

        作者:■ 東北微電子研究所 蘇舟 時間:2005-05-06 來源:電子設計應用 收藏

        摘    要:隨著VLSI工藝技術的發展,為了縮短開發周期,提高設計的可預見性,設計已經成為迫切需求。本文將比較C++、VHDL和,說明是一種非常好的系統描述語言。同時利用C++和VHDL的語法來深入介紹的語法。

        引言
        在早期的集成電路設計過程中,由于低抽象層次的設計問題比高抽象層次的設計問題手工處理更難,這迫使研究者首先把注意力集中到低層次設計問題上。例如:電路仿真、布局、布線和布局規劃。隨著低層次設計問題變得易于處理,邏輯仿真與綜合取得了成功的發展,并引進到設計過程中。隨著現代系統復雜性的日益增加和緊迫的上市時間的壓力,特別是技術的發展,利用上面的工具和設計方法已遇到了巨大的挑戰。工業界和學術界開始把注意力集中到系統設計。因為在系統級可以大大減少設計者需要考慮的對象的數目,這樣就可以在短時間內完成復雜系統的設計。
        用自然語言來描述一個系統,通常是模糊和不完備的,缺乏詳細說明任務的能力。因此,設計者需要用一些精確的語言來描述系統的功能。隨著與有關的設計復雜性的增加,設計者非常渴望有一個可執行的系統描述語言,能在綜合執行之前就能表示和驗證系統的中間實現。但是目前出現的很多語言都不能作為系統描述語言,因為每一種語言只能描述系統的一部分特性,不具備描述全部系統特性的能力。本文介紹的系統描述語言SystemC則較好地解決了上述問題。

        系統特性
        隨著功能需求的增加,現在的系統越來越復雜,并且具有許多特性。
        并發性:任何系統都可分解成許多稱為行為的功能塊。每一個功能塊通常可以用進程、子程序或狀態機的形式來描述。大部分情況下,系統的功能都能很容易地概述成并發行為的集合。因為用順序結構來描述將產生復雜的、難于理解的描述。
        層次性:在面對大的系統時,一個突出的問題就是系統太復雜而不能以整體來考慮。在這種情況下,人們只能以層次模型來分析。首先,層次模型允許系統概述成更小子系統的集合。這種分解系統的建模方式可以大大簡化系統的開發。而且,一旦得到了系統的概念概述,層次模型將大大促進設計者對系統功能的理解。
        時序:在系統說明中必須詳細說明時序關系。當一個部件在指定的時間范圍收到或產生一個事件時,必須能以實際的時間單位來測量。協議通常可用時序圖表來表示。時序信息對實時系統非常重要,它的性能通常根據實現滿足時序限制的程度來度量。
        通信:系統由一些相互作用的行為組成。這些行為必須與它們相互協作的行為進行通信。這樣一個通信模型對系統描述是必需的。
        進程同步:在一個可以概述為一些并發進程的系統中,進程很少完全與其它進程相互獨立。每個進程通常產生被其它進程考慮的數據和事件。當進程需要交換數據或者當某個操作同時要被不同的進程執行時,必須采取某種方式來使進程同步。
        當然,現代系統還有許多特性,如異常處理、行為完備性、編程結構等。
        傳統語言的缺陷
        傳統的C++語言是順序語言,不能處理硬件系統固有的并發性。它也缺少時間概念,不能描述時間順序,但是硬件系統必須以時間順序來進行操作。同時它缺少硬件類型的通信,缺少重啟機制,不支持各種硬件數據類型:例如Bit類型、多值邏輯類型、定點數據類型等。
        傳統的VHDL語言是專用的硬件描述語言,缺少描述各種機制的支持,因此不能作為系統描述語言。
        怎樣才能得到系統描述語言呢?目前有兩種方案,一種方案是以硬件描述語言為基礎,增加類C語言的結構來描述系統,如ICL Design Automation的VHDL+、Co-Design的Superlog;另一種方案是以軟件語言C++為基礎,增加對硬件特性的描述類庫,如Synopsys、Co-Ware等提出的SystemC語言。SystemC采用了源碼公開的形式,得到了很多設計公司和用戶的支持。

        SystemC語言
        SystemC使用C++面向對象的編程特點, 在沒有對C++增加新的語言構件的基礎上,利用類的概念對C++進行了擴充,加入了一個類庫和仿真核,用以支持硬件的建模和仿真概念。設計者能利用它有效地創建軟件算法、硬件結構、SoC接口和系統設計模型。可以用SystemC和標準的C++開發工具來創建一個系統級模型,通過快速地仿真來驗證和優化設計,探索各種各樣的算法,并且提供給軟硬件開發隊伍一個可執行的系統說明。一個可執行的說明本質上是一個C++程序,能展示與系統相同的行為。
        SystemC支持協同設計和由軟硬件部件組成的復雜系統的結構描述。在C++環境中,它支持軟件、硬件和接口描述。
        模塊
        模塊是SystemC中用來劃分設計的基本塊。模塊允許設計者把復雜的系統劃分成更小的、可以管理的塊。模塊能在一個設計隊伍中劃分復雜的系統,允許設計者隱藏內部數據和算法,迫使設計者采用公開接口與其它模塊進行通信,并且整個系統更容易測試和維護。
        模塊用SystemC的關鍵字:SC_MODULE來聲明。
        SC_MODULE(transmit)
        {......}
        這個模塊的名字為transmit。一個模塊可以包含端口(Ports)、局部信號(Local Signals)、局部數據(Local Data)、其它模塊、進程(Processes)和構造函數(Constructors)。這些元素實現了模塊要求的功能。
        模塊的端口用來傳遞模塊進程的數據。端口的模式有:sc_in、sc_out、sc_inout。端口的數據類型可以是C++的數據類型、SystemC的數據類型或者用戶定義的數據類型。端口的模式已經預定義在SystemC的類庫中。
        SystemC的模塊對應C++語言的類。模塊中的端口、局部信號、局部數據、其它模塊對應C++類的成員變量,模塊中的進程對應類的成員函數。
        SystemC的模塊也對應VHDL中的設計實體。模塊的端口、局部信號、局部數據部分對應實體說明。端口模式對應實體說明部分中的類屬和端口說明。模塊的進程對應設計實體的結構體。
        進程
        進程是SystemC中基本的運行單元,調用進程可以仿真目標設備或系統的行為。SystemC的進程有三種類型可以使用:method process、thread process、clocked thread process。有些進程的行為與函數相似,進程調用時開始運行,完成之后把結果返回到調用機制。其它的進程僅僅在仿真開始時調用一次,然后或者運行,或者掛起,等待一個條件變成真。進程不是層次的,因此進程不能直接調用其它進程,進程可以調用不是進程的方法或函數。
        進程有敏感列表,也就是能激活進程的信號列表。一個進程被觸發,進程的列表肯定有事件發生。
        方法進程(Method Process):當一個進程的敏感信號上發生事件時,進程就要被執行。一個方法執行并且把控制返回到仿真核中。方法進程不能被掛起或包含無窮循環,當一個方法進程被激活,它將一直執行直到結束。
        線程(Thread process):它能被掛起或重新激活,包含wait()函數。一個時間將重新激活線程,從上次掛起時的語句開始,繼續執行直到下一個wait()函數。敏感列表是在模塊的構造函數中說明。線程是最一般的進程,幾乎可以用來建模一切事物。一個方法進程用來建模同樣的設計,但要求更多的語句,并且難于理解和維護。
        線程是作為co-routines來實現的。這種實現比方法進程慢。如果提高仿真速度是當前的主要目的,那么應該限制線程的使用,而去維護最高的仿真速度。
        時鐘線程(Clocked thread process):它是線程中的一個特殊情形,它能更好地綜合結果,幫助設計者描述他們的設計。時鐘線程僅僅能被一個時鐘的邊沿所觸發,這與硬件用綜合工具實現的方式匹配。時鐘線程能用來創建隱式狀態機。這種設計所以創建的形式簡單且容易理解。一個顯式狀態機將在聲明中定義狀態機,并且用case語句從一個狀態移到另一個狀態。
        時鐘線程與線程在許多方面不同。首先,時鐘線程說明了一個時鐘對象,它不能與其它進程一樣有分開的敏感列表。敏感列表僅僅是特定的時鐘邊沿。無論什么時候到達了特定的時鐘邊沿,時鐘線程都會被激活。
        Wait Until
        在一個時鐘線程中,wait until()能用來控制進程的執行。wait until()將停止進程的執行,直到一個特定的事件發生。這個特定的事件是被wait until()的表達式所指定的。wait until()函數僅僅與sc_signal<bool>類型的表達式一起工作。
        Watching
        線程與時鐘線程中有無窮循環。一個典型設計需要某些方式來初始化循環行為,或者當某個條件發生時跳出循環。這些通過watching construct的使用來完成。watching construct將監控一個特定的條件。當這個條件發生時,控制從當前的執行點轉移到進程的開始點。那里需要處理watched condition,被watch的對象必須是布爾類型。
        Local Watching允許精確地說明進程的哪一個部分正觀察哪一個信號和事件處理者所定位的位置。它的功能用四個特定的宏來定義。
        W_BEGIN        // put the watching declarations here.
              watching (......);
              watching (......);
        W_DO           // This is where the process functionality goes.
              ..................;
        W_ESCAPE      // This is where the handler for the watched events go.
              if (...)  {.............};
        W_END
        W_BEGIN宏標記Local watching塊的開始。在W_BEGIN與W_DO宏之間放所有的watching聲明。這些聲明與全局watching事件看起來一樣。在W_DO與W_ESCAPE之間放入進程的功能,只要沒有watching事件發生,就會執行這些代碼。在W_ESCAPE與W_END之間放事件處理者。事件處理者將確保相關事件已發生,然后去執行這個事件的必要行動。W_END結束local watching塊。
        對于local watching,下面的情形需要注意:
        在聲明塊中,所有事件有相同的優先級。如果需要不同的優先級,Local watching塊將需要被嵌套(nested)。
        Local watching僅僅在時鐘線程中工作。
        在watching表達式中的信號僅僅在進程的活動邊沿取樣。在時鐘線程中,這僅僅意味著進程敏感塊什么時候改變。全局watched事件比局部watched 事件有更高的優先級。
        時鐘(Clocks)
        時鐘對象是SystemC中的特別對象,它產生時間信號,用來同步仿真中的事件。時鐘按時間順序排列,以致硬件上并行的時間能在順序計算機上適當地被仿真器建模。時鐘對象有許多數據成員來存儲時鐘環境和執行時鐘動作的方法。
        舉個例子:sc_clock  clock1(“clock1”,20,0.5,2,true)。這個聲明將創建一個名字為clock1的時鐘對象,它的周期為20個時間單位,占空比為50%,第一條時鐘邊沿在第二個時間單位,第一個值為真。除了時鐘的名字,所有的變量都有缺省值:周期為1,占空比為0.5,第一條時鐘邊沿為0,第一個值為真。
        事件(Events)
        事件類型sc_event是SystemC中基本的同步對象。一個進程能通知一個事件,也就是說導致一個事件發生,以致所有等待這個事件的進程將被激活。一個事件對象通常在模塊中聲明,并且被模塊中的進程使用。為了實現模塊重用,通過模塊的端口,應該總是能訪問一個外部時間對象。
        sc_event類型提供下列功能:
        構造函數:sc_event  mu_event。
        通知:my_event.notify(0);sc_time  t(10,sc_ps);my_event.notify(t)。
        Wait()方法
        wait()函數接收它等待的事件參數列表,能有多個wait()語句。它們有不同的參數。這意味著進程的敏感性能可以動態地改變。wait()方法能在線程執行的任何地方被調用。當它被調用時,指定的事件臨時覆蓋線程的靜態敏感列表。當一個或所有的時間被通知時,等待的線程被重新開始,調用的線程再一次對靜態敏感列表敏感。當wait()沒有參數時,這與以前一樣:當事件發生在線程的靜態敏感列表上時,wait()被激醒。
        主從通信庫
        主從通信庫的目標是利用主從總線通信協議的系統。由一個或多個CPU核、DSP、外圍設備和通過總線集進行通信的定制組成的系統特別適合這個庫。這個庫提供了一個從功能級可執行說明到RTL級的路徑,并且可以使用通信綜合的界面綜合工具。這個庫介紹了一個順序執行和進程之間的通信協議。這非常好地適合順序軟件-軟件通信的抽象功能級建模、硬件-軟件的界面和硬件-硬件的界面。
        利用這個庫,復雜的系統模型能被建模。作為一個順序通信功能塊的相互連接體,它允許快速模型開發、軟硬件劃分的權衡分析和資源分配決定。在設計過程的后期,功能通信被精煉到循環精確總線協議通信,然后通過在塊內的功能行為通信,到循環精確可綜合的形式。這個模型的一個重要特性是:功能級抽象通信能被精煉到循環精確總線協議通信,而保持順序通信和功能級的執行順序。這個特性是界面綜合工具的一個關鍵因素。這個庫也允許把模塊的通信從它的內部行為分開到一個大的程序,當然完全的分開是不可能的。

        結語
        系統描述是一個非常復雜的過程。為了能有效地描述一個系統,合適的系統描述語言是必不可少的。SystemC利用流行的C++編譯器,通過擴展類庫的方法,實現了硬件的高級語言描述。利用流行的C++編譯器,保證SystemC在語法上完全兼容標準C++,為系統開發者提供了統一的開發平臺。擴展類庫是SystemC的核心。它實現了硬件描述的并發性和模塊化的本質特點。通過使用面向對象的方法,可以方便地實現硬件的描述和IP核的復用。隨著芯片系統規模日益擴大,軟件工程的思想日益滲透到芯片的設計過程中,使用成熟的軟件工程方法,可以有力地支持芯片系統的設計。采用高級語言的芯片系統設計,將是未來的發展方向。■



        關鍵詞: SystemC SoC ASIC

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 达拉特旗| 德保县| 罗平县| 金塔县| 临沧市| 新巴尔虎右旗| 泾川县| 桐乡市| 鹤庆县| 滦南县| 辉县市| 新安县| 工布江达县| 无为县| 衢州市| 灵璧县| 修水县| 辉南县| 丰台区| 如皋市| 博客| 钦州市| 怀远县| 环江| 石屏县| 明水县| 且末县| 宁远县| 游戏| 永州市| 阿拉尔市| 东源县| 泾阳县| 贵德县| 青浦区| 台山市| 尼木县| 青铜峡市| 任丘市| 吉安县| 宝清县|