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