葉友鵬,卜 剛,張 龑
(南京航空航天大學(xué),江蘇 南京 211106)
現(xiàn)代片上系統(tǒng)的設(shè)計難度來源于其復(fù)雜性,而片上系統(tǒng)正在變得越來越復(fù)雜。設(shè)計復(fù)雜性的不斷增加促使電子系統(tǒng)設(shè)計(electronic system level,ESL)方法學(xué)System C和Verilog/System Verilog相結(jié)合,提供了當(dāng)今芯片設(shè)計所需的一套從ESL到RTL的標(biāo)準(zhǔn)解決方案[1]。
對于未來的復(fù)雜系統(tǒng),在進(jìn)行RTL設(shè)計前需要考慮更多的因素,包括總線帶寬能否滿足吞吐量、存儲資源是否足夠、系統(tǒng)架構(gòu)是否恰當(dāng)?shù)?。所以系統(tǒng)級仿真就變得尤為重要。這些仿真還要考慮模型上需要運(yùn)行大量的軟件,覆蓋系統(tǒng)所需要的所有功能[2]。
在傳統(tǒng)的設(shè)計方法中,系統(tǒng)級或者高層次算法往往使用C、C++等進(jìn)行描述和設(shè)計,而在寄存器傳輸級使用硬件描述語言進(jìn)行描述?,F(xiàn)在使用最廣泛的兩種硬件描述語言分別是VHDL和Verilog HDL,從系統(tǒng)級設(shè)計到具體的電路級時C和C++的描述必須手工轉(zhuǎn)化為使用VHDL和Verilog HDL。這種設(shè)計方法學(xué)存在一個非常大的缺點(diǎn),即使用不同的語言進(jìn)行系統(tǒng)描述的不一致性。系統(tǒng)的復(fù)雜度在提高,人們非常迫切需要一種能實現(xiàn)全部設(shè)計的語言。這種語言能夠描述不同的抽象級別和實現(xiàn)不同層次的設(shè)計,能夠?qū)崿F(xiàn)軟硬件的協(xié)同設(shè)計和驗證,而且仿真速度要足夠快。這就需要一種全新的能夠描述所謂系統(tǒng)級的語言[3]。文中基于ISO/IEC 18000-6C協(xié)議,采用系統(tǒng)級設(shè)計語言System C建立基帶數(shù)字信號處理算法的模型,劃分進(jìn)程,搭建數(shù)字基帶處理單元的SoC系統(tǒng),仿真驗證得到正確的系統(tǒng)模型,最后通過綜合產(chǎn)生算法模型對應(yīng)的具體電路和設(shè)計報告。
System C是由Synopsys提出的,目的是以一種系統(tǒng)設(shè)計的思想進(jìn)行系統(tǒng)設(shè)計。它將軟件算法與硬件實現(xiàn)很好地結(jié)合在一起,提高了整個系統(tǒng)設(shè)計的效率和正確性。System C是一個C++類庫,可以讓設(shè)計人員在設(shè)計硬件的同時開始著手于軟件設(shè)計,既可以描述軟件算法,還可以實現(xiàn)對硬件結(jié)構(gòu)的描述。在C++的開發(fā)工具中加入System C類庫就可以實現(xiàn)對系統(tǒng)級模型的開發(fā),而且能夠?qū)崿F(xiàn)快速的仿真和驗證。作為一種新的設(shè)計方法學(xué),提供了系統(tǒng)級設(shè)計的方法,同時作為一種可執(zhí)行規(guī)范,為設(shè)計人員提供了一個設(shè)計的標(biāo)準(zhǔn)[4]。
System C具有所有硬件描述語言所共有的基本特征,包括模塊、進(jìn)程、端口和信號等。在System C中,時鐘信號由特殊的庫函數(shù)進(jìn)行描述,可以直接配置,簡化了對時鐘信號的定義和描述。為了描述電路中的實際行為,System C采用與傳統(tǒng)硬件描述語言基本的調(diào)度模型一基于(delay)延遲。為了實現(xiàn)多個進(jìn)程同步、通信和其他特性,System C支持自定義不同的接口(Interface)、端口(Port)和通道(Channel)。接口作為方法(Method)的集合,沒有具體實現(xiàn)這些方法,在C++中是純虛函數(shù)。在System C中,進(jìn)程只調(diào)用通道提供的接口方法,接口方法調(diào)用和支持不同抽象級別的混合建模是通信細(xì)化的基礎(chǔ)[5]。System C創(chuàng)建的進(jìn)程可以是靜態(tài)也可以是動態(tài)的。進(jìn)程描述了事物的行為,可以是一個復(fù)雜的狀態(tài)機(jī),也可以是一個特定應(yīng)用的軟件模型。多個動態(tài)創(chuàng)建的軟件進(jìn)程可以進(jìn)行同步。為了支持驗證,System C在核心語法的基礎(chǔ)上擴(kuò)展了一個專門的驗證庫。為了支持ESL建模,System C在核心語法的基礎(chǔ)上擴(kuò)展了TLM2.0事物處理級建模庫,支持非定時、近似定時和松散定時事物處理級模型[6]??傊琒ystem C提供了一整套完整的建模方案,主要包括的內(nèi)容如圖1所示。
驗證庫、事物處理級建模庫基本通道信號、互斥、信號量、FIFO模塊(Module)端口(Port、Export)進(jìn)程(Process)接口(Interface)通道(Channel)事件(Event)數(shù)據(jù)類型4值數(shù)據(jù)類型4值向量數(shù)據(jù)類型比特和比特向量任意精度整形定點(diǎn)數(shù)據(jù)類型C++用戶自定義數(shù)據(jù)類型C++語言標(biāo)準(zhǔn)
圖1 System C架構(gòu)
System C可以在Windows和Linux系統(tǒng)中搭建開發(fā)環(huán)境,System C的開發(fā)工具有很多,但是實質(zhì)上System C只是C++增加的一個類庫,因此任何一個符合ANSI標(biāo)準(zhǔn)的C++編譯工具都可以對System C程序進(jìn)行編譯鏈接,從而生成可執(zhí)行文件。需要做的則是如何把System C的頭文件和庫文件整合到C++開發(fā)環(huán)境中去。文中采用的System C版本是SystemC-2.0.1,通過在Visual C++ 6.0中添加System C庫來搭建開發(fā)環(huán)境。先建立一個空白的C++工程,然后在設(shè)置選項中選中C++語言并勾選支持時間類型信息(RTL),軟件上設(shè)置支持RTL級描述,如圖2所示。
設(shè)置完工程支持的選項后還需要添加System C的庫函數(shù)使編譯器識別System C。通過添加包含路徑來添加System C的庫函數(shù),添加路徑選擇到SystemC-2.0.1的src目錄,設(shè)置后再添加仿真庫systemc.lib文件到工程目錄下,開發(fā)環(huán)境就算搭建完成了。
圖2 System C環(huán)境配置
文中設(shè)計的RFID的SoC系統(tǒng),主要包括了基帶數(shù)字處理單元和運(yùn)行在指定處理器上的軟件。數(shù)字基帶鏈路主要把處理器要發(fā)送的數(shù)據(jù)根據(jù)協(xié)議按照特定的格式發(fā)送到射頻端,軟件主要實現(xiàn)對接受數(shù)據(jù)的識別和處理以及特定數(shù)據(jù)的發(fā)送[7]。以閱讀器的基帶處理鏈路設(shè)計為例,鏈路對數(shù)據(jù)進(jìn)行并轉(zhuǎn)串,CRC校驗,PIE編碼,添加同步碼和數(shù)據(jù)發(fā)送,根據(jù)系統(tǒng)的輸入和輸出建立基帶處理模型[8]。
根據(jù)模型的輸入輸出以及硬件時序的要求,對輸入的時鐘進(jìn)行分頻,采用異步復(fù)位的方式,總線輸出數(shù)據(jù)位寬為32位。因為編碼和檢驗時鐘和發(fā)送時鐘的不一致,采用一個FIFO模塊來對數(shù)據(jù)進(jìn)行異步處理和數(shù)據(jù)緩存[9]。最后采用模塊化的建模思路針對具體的應(yīng)用平臺采用APB總線對模塊進(jìn)行讀寫,構(gòu)造的電路大致如圖3所示。
圖3 數(shù)字基帶發(fā)送鏈路
系統(tǒng)建模采用System C設(shè)計,而System C本質(zhì)是C++庫。所以模型設(shè)計的功能是否滿足要求可以通過支持C++語法的編譯器通過添加System C的可執(zhí)行類庫來實現(xiàn)功能驗證。不僅可以通過C++編譯環(huán)境對模型進(jìn)行功能驗證,還可以借助于EDA工具M(jìn)odelsim對模型進(jìn)行時序的仿真來觀察模型的時序設(shè)計結(jié)果。
文中采用的是Visual C++ 6.0編譯環(huán)境,在Visual C++ 6.0驗證功能的正確性。通過Modelsim對模型的時序進(jìn)行仿真,如圖4所示。
設(shè)計模型經(jīng)過仿真和驗證滿足要求后,可采用Mentor的高層次綜合工具Catapult C對模型進(jìn)行綜合。實現(xiàn)直接由定點(diǎn)的C/C++/System C代碼得到可綜合的RTL代碼,可以在較短的時間得到大概的設(shè)計系統(tǒng)時序和面積等信息,從而為系統(tǒng)的可行性分析以及實現(xiàn)具體時間表上提供客觀依據(jù)[10]。通過對比在硬件模型和軟件模型中的算法和功能來實現(xiàn)軟硬件的劃分,根據(jù)系統(tǒng)要求適當(dāng)?shù)胤峙溆布蛙浖膶崿F(xiàn)部分。可以在保持代碼不變的前提下,通過Catapult C上施加不同的約束,即可得到不同效率的RTL代碼[11]。
采用Catapult C實現(xiàn)C/C++/System C算法模型到具體RTL以及門級電路的流程如圖5所示。
通過對數(shù)字基帶處理單元進(jìn)行建模,分析模型的具體參數(shù)。以設(shè)計好的PIE編解碼模型為例,通過Catapult綜合如何得到模型的參數(shù),將設(shè)計好的System C模型放入到Catapult C建立的工程中,選擇工藝參數(shù)、全局約束、邏輯綜合工具、時鐘頻率、復(fù)位信號和兼容庫等,編譯生成甘特圖、RTL電路以及資源使用報告等輸出文件[12]。
圖4 Modelsim仿真基帶模型
圖5 Catapult設(shè)計流程
由生成的甘特圖可知,程序的運(yùn)行時鐘周期有實際上進(jìn)行運(yùn)算的周期和冗余周期,但是可以通過設(shè)置流水線來消除冗余周期。然后根據(jù)程序可以生成RTL網(wǎng)表文件和其他輸出文件,包括資源利用率、關(guān)鍵路徑報告和VHDL代碼等等[13]。其中PIE編碼模塊System C算法程序生成的RTL文件如圖6所示,圖6是模塊內(nèi)部的門級電路圖。
根據(jù)程序?qū)λ惴ǖ木幾g綜合后生成的報告,可以看到設(shè)計模型使用的資源包括了乘法器、加法器等資源的報告,根據(jù)甘特圖還可以看到運(yùn)行占用的時鐘數(shù)從而改善設(shè)計,通過RTL網(wǎng)表文件觀察生成的具體電路結(jié)構(gòu),其中包括了電路的關(guān)鍵路徑報告等。最后生成的VHDL代碼還可以移植到其他平臺上,實現(xiàn)從C/C++/System C算法直接到RTL級的設(shè)計流程,快速可行而且簡便[14]。
圖6 PIE編碼程序模塊具體門級電路
從算法的C/C++/System C代碼開發(fā),到生成RTL級代碼都可以在Catapult中完成。算法的優(yōu)化實現(xiàn)通過Catapult綜合之后將直接反映到硬件實現(xiàn)上,無需耗費(fèi)大量時間在編寫RTL級代碼上,使設(shè)計者能更多地專注于算法本身。模型設(shè)計完成后,可以通過修改約束條件或者對系統(tǒng)的架構(gòu),就可以生成對應(yīng)條件的RTL級代碼,生成不同的設(shè)計方案[15]。通過對比不同設(shè)計方案的報告,包括面積、功耗、關(guān)鍵路徑等信息,得出最好的實現(xiàn)方案。
現(xiàn)代片上系統(tǒng)的設(shè)計難度來源于其復(fù)雜性,設(shè)計復(fù)雜性促使電子設(shè)計系統(tǒng)設(shè)計方法學(xué)System C和Verilog/System Verilog相結(jié)合,提供了當(dāng)今芯片設(shè)計所需的一套從ESL到RTL的標(biāo)準(zhǔn)解決方案[16]。ESL設(shè)計方法學(xué)的目標(biāo)是在一種更高的層次上對系統(tǒng)級芯片進(jìn)行描述和設(shè)計的方法,在這種更高層次上,對事物的描述非常抽象,可以對芯片的特性進(jìn)行功能性描述就可以,而沒有必要考慮具體的RTL級細(xì)節(jié)是如何實現(xiàn)的[17]。事物處理級建模是ESL設(shè)計的關(guān)鍵,對事務(wù)處理級的建模能夠在芯片設(shè)計的早期實現(xiàn)對抽象層次原型的描述,描述了系統(tǒng)各種抽象行為和每個功能單元所要實現(xiàn)的具體操作(事物處理)。這種事物處理級模型因為抽象層次高,所以仿真速度要比具體的RTL級電路的仿真速度快出若干個數(shù)量級[4]。文中采用ESL設(shè)計和驗證方法學(xué),根據(jù)ISO/IEC 18000-6C協(xié)議標(biāo)準(zhǔn),實現(xiàn)了從System C算法到RTL級設(shè)計和驗證。針對具體的算法設(shè)計特定的硬件架構(gòu),不僅速度快而且資源使用率低,比傳統(tǒng)的設(shè)計快好幾個周期。利用高層次綜合工具Catapult還可以實現(xiàn)算法到具體工藝或者器件的實現(xiàn)。總之,作為一種先進(jìn)的SoC設(shè)計方法,面對未來更加復(fù)雜的片上系統(tǒng),完全能夠勝任設(shè)計帶來的挑戰(zhàn)。