SoC系統描述與SystemC
摘 要:隨著(zhù)VLSI工藝技術(shù)的發(fā)展,為了縮短開(kāi)發(fā)周期,提高設計的可預見(jiàn)性,SoC設計已經(jīng)成為迫切需求。本文將比較C++、VHDL和SystemC,說(shuō)明SystemC是一種非常好的系統描述語(yǔ)言。同時(shí)利用C++和VHDL的語(yǔ)法來(lái)深入介紹SystemC的語(yǔ)法。
引言
在早期的集成電路設計過(guò)程中,由于低抽象層次的設計問(wèn)題比高抽象層次的設計問(wèn)題手工處理更難,這迫使研究者首先把注意力集中到低層次設計問(wèn)題上。例如:電路仿真、布局、布線(xiàn)和布局規劃。隨著(zhù)低層次設計問(wèn)題變得易于處理,邏輯仿真與綜合取得了成功的發(fā)展,并引進(jìn)到設計過(guò)程中。隨著(zhù)現代系統復雜性的日益增加和緊迫的上市時(shí)間的壓力,特別是SoC技術(shù)的發(fā)展,利用上面的工具和設計方法已遇到了巨大的挑戰。工業(yè)界和學(xué)術(shù)界開(kāi)始把注意力集中到系統設計。因為在系統級可以大大減少設計者需要考慮的對象的數目,這樣就可以在短時(shí)間內完成復雜系統的設計。
用自然語(yǔ)言來(lái)描述一個(gè)系統,通常是模糊和不完備的,缺乏詳細說(shuō)明任務(wù)的能力。因此,設計者需要用一些精確的語(yǔ)言來(lái)描述系統的功能。隨著(zhù)與SoC有關(guān)的設計復雜性的增加,設計者非??释幸粋€(gè)可執行的系統描述語(yǔ)言,能在綜合執行之前就能表示和驗證系統的中間實(shí)現。但是目前出現的很多語(yǔ)言都不能作為系統描述語(yǔ)言,因為每一種語(yǔ)言只能描述系統的一部分特性,不具備描述全部系統特性的能力。本文介紹的系統描述語(yǔ)言SystemC則較好地解決了上述問(wèn)題。
系統特性
隨著(zhù)功能需求的增加,現在的系統越來(lái)越復雜,并且具有許多特性。
并發(fā)性:任何系統都可分解成許多稱(chēng)為行為的功能塊。每一個(gè)功能塊通??梢杂眠M(jìn)程、子程序或狀態(tài)機的形式來(lái)描述。大部分情況下,系統的功能都能很容易地概述成并發(fā)行為的集合。因為用順序結構來(lái)描述將產(chǎn)生復雜的、難于理解的描述。
層次性:在面對大的系統時(shí),一個(gè)突出的問(wèn)題就是系統太復雜而不能以整體來(lái)考慮。在這種情況下,人們只能以層次模型來(lái)分析。首先,層次模型允許系統概述成更小子系統的集合。這種分解系統的建模方式可以大大簡(jiǎn)化系統的開(kāi)發(fā)。而且,一旦得到了系統的概念概述,層次模型將大大促進(jìn)設計者對系統功能的理解。
時(shí)序:在系統說(shuō)明中必須詳細說(shuō)明時(shí)序關(guān)系。當一個(gè)部件在指定的時(shí)間范圍收到或產(chǎn)生一個(gè)事件時(shí),必須能以實(shí)際的時(shí)間單位來(lái)測量。協(xié)議通??捎脮r(shí)序圖表來(lái)表示。時(shí)序信息對實(shí)時(shí)系統非常重要,它的性能通常根據實(shí)現滿(mǎn)足時(shí)序限制的程度來(lái)度量。
通信:系統由一些相互作用的行為組成。這些行為必須與它們相互協(xié)作的行為進(jìn)行通信。這樣一個(gè)通信模型對系統描述是必需的。
進(jìn)程同步:在一個(gè)可以概述為一些并發(fā)進(jìn)程的系統中,進(jìn)程很少完全與其它進(jìn)程相互獨立。每個(gè)進(jìn)程通常產(chǎn)生被其它進(jìn)程考慮的數據和事件。當進(jìn)程需要交換數據或者當某個(gè)操作同時(shí)要被不同的進(jìn)程執行時(shí),必須采取某種方式來(lái)使進(jìn)程同步。
當然,現代系統還有許多特性,如異常處理、行為完備性、編程結構等。
傳統語(yǔ)言的缺陷
傳統的C++語(yǔ)言是順序語(yǔ)言,不能處理硬件系統固有的并發(fā)性。它也缺少時(shí)間概念,不能描述時(shí)間順序,但是硬件系統必須以時(shí)間順序來(lái)進(jìn)行操作。同時(shí)它缺少硬件類(lèi)型的通信,缺少重啟機制,不支持各種硬件數據類(lèi)型:例如Bit類(lèi)型、多值邏輯類(lèi)型、定點(diǎn)數據類(lèi)型等。
傳統的VHDL語(yǔ)言是專(zhuān)用的硬件描述語(yǔ)言,缺少描述各種機制的支持,因此不能作為系統描述語(yǔ)言。
怎樣才能得到系統描述語(yǔ)言呢?目前有兩種方案,一種方案是以硬件描述語(yǔ)言為基礎,增加類(lèi)C語(yǔ)言的結構來(lái)描述系統,如ICL Design Automation的VHDL+、Co-Design的Superlog;另一種方案是以軟件語(yǔ)言C++為基礎,增加對硬件特性的描述類(lèi)庫,如Synopsys、Co-Ware等提出的SystemC語(yǔ)言。SystemC采用了源碼公開(kāi)的形式,得到了很多設計公司和用戶(hù)的支持。
SystemC語(yǔ)言
SystemC使用C++面向對象的編程特點(diǎn), 在沒(méi)有對C++增加新的語(yǔ)言構件的基礎上,利用類(lèi)的概念對C++進(jìn)行了擴充,加入了一個(gè)類(lèi)庫和仿真核,用以支持硬件的建模和仿真概念。設計者能利用它有效地創(chuàng )建軟件算法、硬件結構、SoC接口和系統設計模型??梢杂肧ystemC和標準的C++開(kāi)發(fā)工具來(lái)創(chuàng )建一個(gè)系統級模型,通過(guò)快速地仿真來(lái)驗證和優(yōu)化設計,探索各種各樣的算法,并且提供給軟硬件開(kāi)發(fā)隊伍一個(gè)可執行的系統說(shuō)明。一個(gè)可執行的說(shuō)明本質(zhì)上是一個(gè)C++程序,能展示與系統相同的行為。
SystemC支持協(xié)同設計和由軟硬件部件組成的復雜系統的結構描述。在C++環(huán)境中,它支持軟件、硬件和接口描述。
模塊
模塊是SystemC中用來(lái)劃分設計的基本塊。模塊允許設計者把復雜的系統劃分成更小的、可以管理的塊。模塊能在一個(gè)設計隊伍中劃分復雜的系統,允許設計者隱藏內部數據和算法,迫使設計者采用公開(kāi)接口與其它模塊進(jìn)行通信,并且整個(gè)系統更容易測試和維護。
模塊用SystemC的關(guān)鍵字:SC_MODULE來(lái)聲明。
SC_MODULE(transmit)
{......}
這個(gè)模塊的名字為transmit。一個(gè)模塊可以包含端口(Ports)、局部信號(Local Signals)、局部數據(Local Data)、其它模塊、進(jìn)程(Processes)和構造函數(Constructors)。這些元素實(shí)現了模塊要求的功能。
模塊的端口用來(lái)傳遞模塊進(jìn)程的數據。端口的模式有:sc_in、sc_out、sc_inout。端口的數據類(lèi)型可以是C++的數據類(lèi)型、SystemC的數據類(lèi)型或者用戶(hù)定義的數據類(lèi)型。端口的模式已經(jīng)預定義在SystemC的類(lèi)庫中。
SystemC的模塊對應C++語(yǔ)言的類(lèi)。模塊中的端口、局部信號、局部數據、其它模塊對應C++類(lèi)的成員變量,模塊中的進(jìn)程對應類(lèi)的成員函數。
SystemC的模塊也對應VHDL中的設計實(shí)體。模塊的端口、局部信號、局部數據部分對應實(shí)體說(shuō)明。端口模式對應實(shí)體說(shuō)明部分中的類(lèi)屬和端口說(shuō)明。模塊的進(jìn)程對應設計實(shí)體的結構體。
進(jìn)程
進(jìn)程是SystemC中基本的運行單元,調用進(jìn)程可以仿真目標設備或系統的行為。SystemC的進(jìn)程有三種類(lèi)型可以使用:method process、thread process、clocked thread process。有些進(jìn)程的行為與函數相似,進(jìn)程調用時(shí)開(kāi)始運行,完成之后把結果返回到調用機制。其它的進(jìn)程僅僅在仿真開(kāi)始時(shí)調用一次,然后或者運行,或者掛起,等待一個(gè)條件變成真。進(jìn)程不是層次的,因此進(jìn)程不能直接調用其它進(jìn)程,進(jìn)程可以調用不是進(jìn)程的方法或函數。
進(jìn)程有敏感列表,也就是能激活進(jìn)程的信號列表。一個(gè)進(jìn)程被觸發(fā),進(jìn)程的列表肯定有事件發(fā)生。
方法進(jìn)程(Method Process):當一個(gè)進(jìn)程的敏感信號上發(fā)生事件時(shí),進(jìn)程就要被執行。一個(gè)方法執行并且把控制返回到仿真核中。方法進(jìn)程不能被掛起或包含無(wú)窮循環(huán),當一個(gè)方法進(jìn)程被激活,它將一直執行直到結束。
線(xiàn)程(Thread process):它能被掛起或重新激活,包含wait()函數。一個(gè)時(shí)間將重新激活線(xiàn)程,從上次掛起時(shí)的語(yǔ)句開(kāi)始,繼續執行直到下一個(gè)wait()函數。敏感列表是在模塊的構造函數中說(shuō)明。線(xiàn)程是最一般的進(jìn)程,幾乎可以用來(lái)建模一切事物。一個(gè)方法進(jìn)程用來(lái)建模同樣的設計,但要求更多的語(yǔ)句,并且難于理解和維護。
線(xiàn)程是作為co-routines來(lái)實(shí)現的。這種實(shí)現比方法進(jìn)程慢。如果提高仿真速度是當前的主要目的,那么應該限制線(xiàn)程的使用,而去維護最高的仿真速度。
時(shí)鐘線(xiàn)程(Clocked thread process):它是線(xiàn)程中的一個(gè)特殊情形,它能更好地綜合結果,幫助設計者描述他們的設計。時(shí)鐘線(xiàn)程僅僅能被一個(gè)時(shí)鐘的邊沿所觸發(fā),這與硬件用綜合工具實(shí)現的方式匹配。時(shí)鐘線(xiàn)程能用來(lái)創(chuàng )建隱式狀態(tài)機。這種設計所以創(chuàng )建的形式簡(jiǎn)單且容易理解。一個(gè)顯式狀態(tài)機將在聲明中定義狀態(tài)機,并且用case語(yǔ)句從一個(gè)狀態(tài)移到另一個(gè)狀態(tài)。
時(shí)鐘線(xiàn)程與線(xiàn)程在許多方面不同。首先,時(shí)鐘線(xiàn)程說(shuō)明了一個(gè)時(shí)鐘對象,它不能與其它進(jìn)程一樣有分開(kāi)的敏感列表。敏感列表僅僅是特定的時(shí)鐘邊沿。無(wú)論什么時(shí)候到達了特定的時(shí)鐘邊沿,時(shí)鐘線(xiàn)程都會(huì )被激活。
Wait Until
在一個(gè)時(shí)鐘線(xiàn)程中,wait until()能用來(lái)控制進(jìn)程的執行。wait until()將停止進(jìn)程的執行,直到一個(gè)特定的事件發(fā)生。這個(gè)特定的事件是被wait until()的表達式所指定的。wait until()函數僅僅與sc_signal<bool>類(lèi)型的表達式一起工作。
Watching
線(xiàn)程與時(shí)鐘線(xiàn)程中有無(wú)窮循環(huán)。一個(gè)典型設計需要某些方式來(lái)初始化循環(huán)行為,或者當某個(gè)條件發(fā)生時(shí)跳出循環(huán)。這些通過(guò)watching construct的使用來(lái)完成。watching construct將監控一個(gè)特定的條件。當這個(gè)條件發(fā)生時(shí),控制從當前的執行點(diǎn)轉移到進(jìn)程的開(kāi)始點(diǎn)。那里需要處理watched condition,被watch的對象必須是布爾類(lèi)型。
Local Watching允許精確地說(shuō)明進(jìn)程的哪一個(gè)部分正觀(guān)察哪一個(gè)信號和事件處理者所定位的位置。它的功能用四個(gè)特定的宏來(lái)定義。
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塊的開(kāi)始。在W_BEGIN與W_DO宏之間放所有的watching聲明。這些聲明與全局watching事件看起來(lái)一樣。在W_DO與W_ESCAPE之間放入進(jìn)程的功能,只要沒(méi)有watching事件發(fā)生,就會(huì )執行這些代碼。在W_ESCAPE與W_END之間放事件處理者。事件處理者將確保相關(guān)事件已發(fā)生,然后去執行這個(gè)事件的必要行動(dòng)。W_END結束local watching塊。
對于local watching,下面的情形需要注意:
在聲明塊中,所有事件有相同的優(yōu)先級。如果需要不同的優(yōu)先級,Local watching塊將需要被嵌套(nested)。
Local watching僅僅在時(shí)鐘線(xiàn)程中工作。
在watching表達式中的信號僅僅在進(jìn)程的活動(dòng)邊沿取樣。在時(shí)鐘線(xiàn)程中,這僅僅意味著(zhù)進(jìn)程敏感塊什么時(shí)候改變。全局watched事件比局部watched 事件有更高的優(yōu)先級。
時(shí)鐘(Clocks)
時(shí)鐘對象是SystemC中的特別對象,它產(chǎn)生時(shí)間信號,用來(lái)同步仿真中的事件。時(shí)鐘按時(shí)間順序排列,以致硬件上并行的時(shí)間能在順序計算機上適當地被仿真器建模。時(shí)鐘對象有許多數據成員來(lái)存儲時(shí)鐘環(huán)境和執行時(shí)鐘動(dòng)作的方法。
舉個(gè)例子:sc_clock clock1(“clock1”,20,0.5,2,true)。這個(gè)聲明將創(chuàng )建一個(gè)名字為clock1的時(shí)鐘對象,它的周期為20個(gè)時(shí)間單位,占空比為50%,第一條時(shí)鐘邊沿在第二個(gè)時(shí)間單位,第一個(gè)值為真。除了時(shí)鐘的名字,所有的變量都有缺省值:周期為1,占空比為0.5,第一條時(shí)鐘邊沿為0,第一個(gè)值為真。
事件(Events)
事件類(lèi)型sc_event是SystemC中基本的同步對象。一個(gè)進(jìn)程能通知一個(gè)事件,也就是說(shuō)導致一個(gè)事件發(fā)生,以致所有等待這個(gè)事件的進(jìn)程將被激活。一個(gè)事件對象通常在模塊中聲明,并且被模塊中的進(jìn)程使用。為了實(shí)現模塊重用,通過(guò)模塊的端口,應該總是能訪(fǎng)問(wèn)一個(gè)外部時(shí)間對象。
sc_event類(lèi)型提供下列功能:
構造函數:sc_event mu_event。
通知:my_event.notify(0);sc_time t(10,sc_ps);my_event.notify(t)。
Wait()方法
wait()函數接收它等待的事件參數列表,能有多個(gè)wait()語(yǔ)句。它們有不同的參數。這意味著(zhù)進(jìn)程的敏感性能可以動(dòng)態(tài)地改變。wait()方法能在線(xiàn)程執行的任何地方被調用。當它被調用時(shí),指定的事件臨時(shí)覆蓋線(xiàn)程的靜態(tài)敏感列表。當一個(gè)或所有的時(shí)間被通知時(shí),等待的線(xiàn)程被重新開(kāi)始,調用的線(xiàn)程再一次對靜態(tài)敏感列表敏感。當wait()沒(méi)有參數時(shí),這與以前一樣:當事件發(fā)生在線(xiàn)程的靜態(tài)敏感列表上時(shí),wait()被激醒。
主從通信庫
主從通信庫的目標是利用主從總線(xiàn)通信協(xié)議的系統。由一個(gè)或多個(gè)CPU核、DSP、外圍設備和通過(guò)總線(xiàn)集進(jìn)行通信的定制ASIC組成的系統特別適合這個(gè)庫。這個(gè)庫提供了一個(gè)從功能級可執行說(shuō)明到RTL級的路徑,并且可以使用通信綜合的界面綜合工具。這個(gè)庫介紹了一個(gè)順序執行和進(jìn)程之間的通信協(xié)議。這非常好地適合順序軟件-軟件通信的抽象功能級建模、硬件-軟件的界面和硬件-硬件的界面。
利用這個(gè)庫,復雜的系統模型能被建模。作為一個(gè)順序通信功能塊的相互連接體,它允許快速模型開(kāi)發(fā)、軟硬件劃分的權衡分析和資源分配決定。在設計過(guò)程的后期,功能通信被精煉到循環(huán)精確總線(xiàn)協(xié)議通信,然后通過(guò)在塊內的功能行為通信,到循環(huán)精確可綜合的形式。這個(gè)模型的一個(gè)重要特性是:功能級抽象通信能被精煉到循環(huán)精確總線(xiàn)協(xié)議通信,而保持順序通信和功能級的執行順序。這個(gè)特性是界面綜合工具的一個(gè)關(guān)鍵因素。這個(gè)庫也允許把模塊的通信從它的內部行為分開(kāi)到一個(gè)大的程序,當然完全的分開(kāi)是不可能的。
結語(yǔ)
系統描述是一個(gè)非常復雜的過(guò)程。為了能有效地描述一個(gè)系統,合適的系統描述語(yǔ)言是必不可少的。SystemC利用流行的C++編譯器,通過(guò)擴展類(lèi)庫的方法,實(shí)現了硬件的高級語(yǔ)言描述。利用流行的C++編譯器,保證SystemC在語(yǔ)法上完全兼容標準C++,為系統開(kāi)發(fā)者提供了統一的開(kāi)發(fā)平臺。擴展類(lèi)庫是SystemC的核心。它實(shí)現了硬件描述的并發(fā)性和模塊化的本質(zhì)特點(diǎn)。通過(guò)使用面向對象的方法,可以方便地實(shí)現硬件的描述和IP核的復用。隨著(zhù)芯片系統規模日益擴大,軟件工程的思想日益滲透到芯片的設計過(guò)程中,使用成熟的軟件工程方法,可以有力地支持芯片系統的設計。采用高級語(yǔ)言的芯片系統設計,將是未來(lái)的發(fā)展方向?!?/P>
評論