裴 佩 盧立丹
(中國(guó)船舶重工集團(tuán)公司第722研究所 武漢 430079)
隨著集成電路設(shè)計(jì)的發(fā)展,SoC時(shí)代已經(jīng)到來(lái)。為了滿足SoC設(shè)計(jì)的要求,一種能夠同時(shí)實(shí)現(xiàn)較高層次的軟件和硬件描述的系統(tǒng)級(jí)設(shè)計(jì)語(yǔ)言,可以大大提高設(shè)計(jì)效率。SystemC正是這樣一種適于系統(tǒng)級(jí)設(shè)計(jì)的硬件描述語(yǔ)言。它支持門級(jí)、RTL級(jí)、系統(tǒng)級(jí)等各個(gè)抽象層次上的硬件的建模和仿真,而且支持軟硬件協(xié)同設(shè)計(jì),能夠描述由硬件和軟件組成的復(fù)雜系統(tǒng)結(jié)構(gòu),支持在C++環(huán)境下對(duì)硬件、軟件和接口的描述[1]。
自1999年提出后,SystemC在 Synopsys、ARM 、Mentor Graphics、Coware 、Cadence 、Intel等微電子業(yè)內(nèi)主流公司的支持下得到了很大的發(fā)展,由于其開放性等特點(diǎn),已經(jīng)得到全世界工程師的歡迎和認(rèn)可,并已經(jīng)于2005年成為IEEE標(biāo)準(zhǔn)。
SystemC是完全免費(fèi)并且開放的,它的源代碼可以使用任何標(biāo)準(zhǔn)C++編譯環(huán)境進(jìn)行編譯,生成可執(zhí)行文件。SystemC本質(zhì)上時(shí)在C++的基礎(chǔ)上添加的硬件擴(kuò)展庫(kù)和仿真核,通過(guò)使用SystemC類庫(kù),設(shè)計(jì)者可以根據(jù)不同的需求編寫目標(biāo)系統(tǒng)的系統(tǒng)級(jí)(system level)、行為級(jí)(behavioral level)或RT L級(jí)的SystemC模型代碼。
SystemC具有所有硬件描述語(yǔ)言所共有的基本特征,包括模塊、端口、進(jìn)程和信號(hào)等。SystemC中的模塊用關(guān)鍵字SC MODULE來(lái)定義,其端口定義與Verilog類似。在SystemC中,進(jìn)程是一個(gè)基本的執(zhí)行單元,它被調(diào)用來(lái)仿真目標(biāo)系統(tǒng)的行為。進(jìn)程的行為是多樣化的,可以實(shí)現(xiàn)某個(gè)函數(shù)的功能,也可以在運(yùn)行過(guò)程中被掛起,并且進(jìn)程是并行執(zhí)行的,一個(gè)進(jìn)程中不能包含或直接調(diào)用其他進(jìn)程。SystemC的進(jìn)程主要有兩種,事件進(jìn)程(SC_MET HOD)和線程進(jìn)程(SC T HREAD)。事件進(jìn)程是惟一可以綜合的RTL進(jìn)程,它的特點(diǎn)是當(dāng)敏感表上有事件發(fā)生時(shí),它就被調(diào)用,調(diào)用后立即返回。只有該類進(jìn)程返回后,仿真系統(tǒng)的時(shí)間才有可能前進(jìn),因此該類進(jìn)程不能被掛起(類似于Verilog中的always)。線程進(jìn)程不是RTL級(jí)進(jìn)程,它可以被掛起和重新激活,所以它的一個(gè)重要用途是用來(lái)描述驗(yàn)證平臺(tái)(testbench)。
圖1 SystemC描述加法器的簡(jiǎn)單實(shí)例
SystemC描述加法器的一個(gè)簡(jiǎn)單例子如圖1所示,該例是一個(gè)簡(jiǎn)單的加法器的描述。在 my_adder.h中定義了一個(gè)名為my_adder的模塊,輸入端口為int類型的a、b和時(shí)鐘類型的clk,輸出信號(hào)為int類型的c。此外,模塊里面定義了一個(gè)類型為SC_METHOD的進(jìn)程,其對(duì)時(shí)鐘的上升沿敏感。每當(dāng)時(shí)鐘上升沿到來(lái)時(shí),該進(jìn)程被激活,完成將兩輸入端口上的數(shù)據(jù)相加再?gòu)妮敵龆丝谒统龅墓δ?。進(jìn)程entry的實(shí)現(xiàn)在adder.cpp中。
SystemC語(yǔ)言必須可以綜合才能投入實(shí)用,目前許多支持SystemC綜合的軟件已經(jīng)投入商用。Agility Compiler軟件就是比較好的一種,它是由Agility公司和Celoxica ESL business所共同開發(fā)的。Agility Compiler可以將SystemC語(yǔ)言綜合成適合指定目標(biāo)芯片的Verilog、VHDL、EDIF等文件,進(jìn)而進(jìn)行下一步的設(shè)計(jì),實(shí)現(xiàn)了與傳統(tǒng)硬件描述語(yǔ)言的無(wú)縫銜接[2]。
本設(shè)計(jì)就是利用SystemC語(yǔ)言設(shè)計(jì)pn序列發(fā)生器,具體實(shí)現(xiàn)一個(gè)m序列發(fā)生器的功能,然后在Agility Compiler中進(jìn)行綜合生成Verilog語(yǔ)言,再利用ModelSim等軟件仿真。
一個(gè)偽隨機(jī)(或PN)序列是一個(gè)1和0的碼序列,由于它具有類似白噪聲的隨機(jī)特性但是又能重復(fù)產(chǎn)生,所以稱為偽隨機(jī)序列,并且可以代替白噪聲用于需要隨機(jī)信號(hào)的場(chǎng)合,例如測(cè)試系統(tǒng)性能。更重要的是,它具有良好的相關(guān)特性,可以用于碼分復(fù)用、多址接入、測(cè)距、密碼、擴(kuò)頻通信和分離多徑信號(hào)等許多領(lǐng)域[3]。
通常情況下,擴(kuò)頻序列具有如下性質(zhì):
1)具有尖銳的自相關(guān)性;
2)有盡可能小的互相關(guān)性,互相關(guān)性最好為零;
3)有盡可能大的序列復(fù)雜度,即足夠長(zhǎng)的碼周期保證保密和抗干擾要求;
4)有足夠多的獨(dú)立地址數(shù),以實(shí)現(xiàn)碼分多址的要求;
5)工程上易于產(chǎn)生、加工復(fù)制和控制。
偽隨機(jī)序列不止一種,其中以m序列最為重要,因此設(shè)計(jì)中,將對(duì)m序列發(fā)生器進(jìn)行設(shè)計(jì)。一個(gè)m序列的長(zhǎng)度為L(zhǎng)=2m-1比特,周期為L(zhǎng),并由一個(gè)m級(jí)的帶有線性反饋的移位寄存器產(chǎn)生,每個(gè)周期內(nèi)有2m-1個(gè) 1和 2m-1-1個(gè)0[4]。
設(shè)計(jì)中,將設(shè)計(jì)通信中常用的12級(jí),周期為4095的m序列發(fā)生器。
一般要產(chǎn)生一個(gè)m序列主要有以下幾個(gè)步驟[5]:
1)根據(jù)m序列產(chǎn)生原理得到m序列的生成多項(xiàng)式;
2)根據(jù)生成多項(xiàng)式的級(jí)數(shù)確定要實(shí)現(xiàn)的m序列產(chǎn)生器所需要的移位寄存器的長(zhǎng)度;
3)實(shí)現(xiàn)移位寄存器鏈;
4)按照生成多項(xiàng)式對(duì)移位寄存器鏈抽頭;
5)將抽頭信號(hào)進(jìn)行“異或”,結(jié)果反饋到移位寄存器的輸入端。
本次設(shè)計(jì)中采用的生成多項(xiàng)式為:f(x)=x12+x6+x4+x+1。
3.2.1 m序列的systemc主要程序設(shè)計(jì)
/************************
模塊功能:該模塊是周期為4095(12級(jí))的m序列發(fā)生器,采用線性反饋移位寄存器實(shí)現(xiàn)。
…
************************/
#define bit_size 12
#include"systemc.h"
SC_MODULE(m_gen){
sc_in<bool> clk,rst;
…
void prc_m_gen();
SC_CTOR(m_gen){
SC_M ETHOD(prc_m_gen);
sensitive_pos<<clk;
}
};
void m_gen::prc_m_gen(){
…
if(!rst.read()){
shift_reg=4095;//設(shè)定寄存器的初始狀態(tài),不能為0
m_out=0;
}
else if((ena==1)&&(rst==1)){
shift_temp=shift_reg;
shift_reg.range(bit_size-1,1)=shift_temp.range(10,0);
shift_reg[0]=shift_temp[0]?shift_temp[3]?shift_temp[5]?shift_temp[11];
}
m_out=shift_reg[bit_size-1];//最高位輸出}
3.2.2 m序列程序綜合
在Agility Compiler軟件“工程設(shè)置”中,設(shè)置綜合的目標(biāo)芯片為 Altera Stratix II系列的ep2s130f1020c4。
Agility Compiler綜合出的信息見(jiàn)圖2所示。由圖可見(jiàn),優(yōu)化綜合后共用到14個(gè)觸發(fā)器,3277個(gè)與非門,0bit寄存器。
圖2 m序列發(fā)生器綜合信息圖
為了驗(yàn)證結(jié)果的準(zhǔn)確性,利用ModelSim軟件和Quartus II軟件對(duì)綜合出的Verilog HDL程序進(jìn)行仿真,得到仿真結(jié)果如圖3所示。
圖3 m序列發(fā)生器的ModelSim仿真結(jié)果
利用Quartus仿真綜合出的Verilog代碼后的部分仿真結(jié)果如圖4所示,綜合出的資源等信息如圖5所示,RTL部分圖如圖6所示。
圖4 m序列發(fā)生器的Quartus仿真結(jié)果
3.2.3 m序列仿真結(jié)果分析
為了分析結(jié)果的正確性,將考察從三個(gè)時(shí)間處的連續(xù)32比特m_out信號(hào)序列。結(jié)果見(jiàn)表1。經(jīng)統(tǒng)計(jì),一個(gè)周期內(nèi)有2048個(gè)1,2047個(gè)0。
表1 m序列輸出統(tǒng)計(jì)
由此可見(jiàn),生成的周期為4095的該m序列符合設(shè)計(jì)要求。
從這個(gè)實(shí)例可以看出,利用SystemC完成設(shè)計(jì)相比于傳統(tǒng)的硬件描述語(yǔ)言具有很多優(yōu)點(diǎn):
1)SystemC語(yǔ)言更加靈活,因?yàn)槠浔举|(zhì)上是C++語(yǔ)言,所以設(shè)計(jì)更加靈活。
2)SystemC語(yǔ)言的設(shè)計(jì)效率更高。
3)SystemC語(yǔ)言對(duì)于具有C語(yǔ)言基礎(chǔ)卻熟悉Verilog語(yǔ)言的技術(shù)人員更有優(yōu)勢(shì)。
4)SystemC語(yǔ)言能夠?qū)崿F(xiàn)實(shí)現(xiàn)較高層次如系統(tǒng)級(jí)的軟件和硬件描述,較好地實(shí)現(xiàn)軟硬件的協(xié)同設(shè)計(jì),而且它使得系統(tǒng)級(jí)設(shè)計(jì)和RTL級(jí)設(shè)計(jì)均可以在同一平臺(tái)下完成。
SystemC已經(jīng)成為IEEE標(biāo)準(zhǔn),這將促進(jìn)SystemC更快的發(fā)展。相信不久的將來(lái),其一定會(huì)成為業(yè)內(nèi)主流的設(shè)計(jì)工具。
[1][美]巴斯克.SystemC入門[M].夏宇聞,等譯.北京:北京航空航天大學(xué)出版社,2008
[2]Agility公司.agility_manual
[3]西瑞克斯(北京)通信設(shè)備有限公司.無(wú)線通信的Matlab和FPGA實(shí)現(xiàn)[M].北京:人民郵電出版社,2009,6
[4]樊昌信.通信原理教程[M].北京:電子工業(yè)出版社,2005,7
[5][美]John G.Proakis,等.現(xiàn)代通信系統(tǒng)(MATLAB版)[M].第二版.北京:電子工業(yè)出版社,2008,1