劉舜奎,蔡藝軍
(廈門大學 電子工程系,福建 廈門361005)
在數(shù)字集成電路的設(shè)計中,需要通過仿真來檢驗設(shè)計是否可實現(xiàn)預(yù)期的功能。仿真需要為設(shè)計項目建立一個測試平臺,為設(shè)計項目提供盡可能完備的測試激勵和可供觀測的輸出響應(yīng),根據(jù)輸出響應(yīng)信息可判斷設(shè)計項目是否可實現(xiàn)預(yù)期的功能。隨著系統(tǒng)設(shè)計復(fù)雜性的不斷增加,當設(shè)計集成度超過百萬門后,設(shè)計正確性的驗證就比設(shè)計本身還要困難,系統(tǒng)仿真的實時性很難滿足要求。在對復(fù)雜電路進行軟件仿真時,系統(tǒng)的仿真時間往往占據(jù)了設(shè)計的大部分,系統(tǒng)某些電路功能的仿真驗證常常需要幾個小時甚至幾天。因此,如何提高仿真效率、減少仿真復(fù)雜度、縮短仿真時間,成為系統(tǒng)設(shè)計中的關(guān)鍵問題。
為了方便而快速地實現(xiàn)仿真驗證,及時得到測試結(jié)果,本文提出運用硬件加速的思想,并以O(shè)penGL-ES算法中的坐標變換算法為例,將其作為待驗證的IP放在整個OpenGL-ES軟件平臺上進行測試。利用Handel-C語言對該IP進行FPGA實現(xiàn),并采用Bus Master DMA的通信方式在軟、硬件之間進行通信,實現(xiàn)軟硬件協(xié)同加速仿真。選用以O(shè)penGL-ES為例是因為該算法為開源的;采用C++實現(xiàn),存在大量矩陣運算,將其用 FPGA實現(xiàn),可充分利用硬件并行的特性。同時,也因為Handel-C與C語言的高度相似性,開發(fā)周期得到了明顯的縮短。
OpenGL ES 1.1的繪圖主要分兩個階段:幾何處理階段和光柵化處理階段[1-2],如圖1所示。
圖1 OpenGL ES 1.1繪圖流水線
本文關(guān)注的是幾何處理階段中的坐標轉(zhuǎn)換模塊。通過線性代數(shù)的方法將物件的三維空間模型進行移動、縮放和變形等,借助由控制物體上每個點的坐標變動,可以實現(xiàn)對物體的移動、縮放和旋轉(zhuǎn)。對應(yīng)的三種頂點坐標變換算法為平移變換、縮放變換和旋轉(zhuǎn)變換,均通過頂點坐標構(gòu)成的矩陣相乘來實現(xiàn),其中旋轉(zhuǎn)變換算法的運算量最大?,F(xiàn)以繞任意軸的旋轉(zhuǎn)變換算法為例,簡單介紹其實現(xiàn)步驟。
設(shè)旋轉(zhuǎn)軸 AB由任意一點A(xa,ya,za)及其方向向量(a,b,c)定義,空間一點Q(xq,yq,zq)繞 AB 軸旋轉(zhuǎn) θ角到Q′(xq′,yq′,zq′),則可以通過下列步驟來實現(xiàn)Q點的旋轉(zhuǎn):
(1)將A點移到坐標原點。
(2)使AB分別繞X軸、Y軸旋轉(zhuǎn)適當角度與Z軸重合。
(3)將 AB繞Z軸旋轉(zhuǎn) φ。
(4)作上述變換的逆變換,使AB回到原來位置。即:
其 中 ,RAB(θ)=T-1(xa,ya,za)Rx-1(α)Ry-1(β)Rz(θ)Rx(α)T(xa,ya,za),矩陣T為平移矩陣,R為繞某坐標軸的旋轉(zhuǎn)矩陣,而α、β分別為AB在YOZ平面與XOY平面的投影與Z軸的夾角。
該系統(tǒng)采用的演示程序中,旋轉(zhuǎn)軸為單位軸(nx,ny,nz),則旋轉(zhuǎn)矩陣 RAB(θ)為如下形式:
本設(shè)計采用Handel-C、硬件描述語言和C++協(xié)同開發(fā)的方式,其一般開發(fā)流程如圖2所示。
Handel-C的代碼默認從頂部開始串行執(zhí)行到底部,每一條語句占用一個時鐘周期[3]。但Handel-C同樣支持并行處理機制,這是通過使用關(guān)鍵字“par”來實現(xiàn)的。坐標變換算法中涉及到大量的矩陣乘法運算,而矩陣乘法運算中乘積矩陣的所有元素互相獨立、互不相關(guān),可以將其并行實現(xiàn)。因此該設(shè)計充分利用了Handel-C的并行機制,使矩陣乘法的效率大大提高。
Handel-C支持和C語言一樣的數(shù)組形式。Handel-C中的數(shù)組可以讓所有變量在一個時鐘周期內(nèi)被并行地訪問,從而提高變量的存儲和讀取效率。例如用來求定點數(shù)平方根倒數(shù)的函數(shù)EGL_InvSqrt()中用到了查表法,表的大小只有8×16 bit,而該函數(shù)在旋轉(zhuǎn)算法中被大量用到。因此為了提高效率,采用數(shù)組的形式定義該表。
但索引一個大數(shù)組將耗用大量的硬件資源,這時可以換成用RAM或ROM來實現(xiàn)。Handel-C提供了“ram”或“rom”關(guān)鍵字來解決該問題[4]。例如在旋轉(zhuǎn)變換算法中,涉及到三角函數(shù)運算sine和cosine,同樣采用查表法來實現(xiàn),而表的大小為1 024×16 bit,這時必須用ROM來實現(xiàn),使用“rom”關(guān)鍵字定義該表即可。
由以上特點可以看出,該設(shè)計采用Handel-C可以從開發(fā)流程的各個環(huán)節(jié)降低開發(fā)難度,從而縮短開發(fā)周期。
為了滿足整個系統(tǒng)的實時數(shù)據(jù)處理要求,該設(shè)計選用PCI Express接口在FPGA與PC之間實現(xiàn)數(shù)據(jù)傳輸。當采用8通道的PCI Express數(shù)據(jù)傳輸時,可實現(xiàn)4 GB/s的傳輸速率,滿足該系統(tǒng)對數(shù)據(jù)處理的實時性要求。
本設(shè)計采用BMD(Bus Master DMA)的實現(xiàn)方式,BMD的DMA引擎被內(nèi)嵌在PCI Express架構(gòu)的endpoint端,負責在系統(tǒng)內(nèi)存與endpoint之間移動數(shù)據(jù)。endpoint即為該系統(tǒng)的硬件部分,即內(nèi)嵌了DMA引擎的坐標變換模塊。
采用Handel-C與Verilog混合設(shè)計的方法對該系統(tǒng)的硬件平臺進行設(shè)計,其中較多涉及到調(diào)度及狀態(tài)轉(zhuǎn)換的模塊用Handel-C設(shè)計,涉及到較為嚴格的時序要求的模塊用Verilog設(shè)計。該系統(tǒng)的硬件整體框圖(省略BMD控制部分)如圖3所示。
其中PC部分為系統(tǒng)軟件部分,包括OpenGL-ES中除坐標變換算法以外的其他部分,以及DMA傳輸控制的軟件部分;RX和TX模塊分別為DMA的接收和發(fā)送引擎,即BMD架構(gòu)中Initiator Logic模塊里的 Rx和Tx??梢?,DMA已經(jīng)內(nèi)嵌在系統(tǒng)硬件設(shè)計中;myram1和myram2為雙口RAM,具有獨立的數(shù)據(jù)讀寫和時鐘端口,作為輸入和輸出緩存,同時隔離了用戶IP和PCIe兩部分的時鐘,為實現(xiàn)雙時鐘工作提供了條件;genclock為DCM模塊,對PCIe的輸入時鐘進行5分頻,得到50 MHz的時鐘供用戶 ip使用,除了 myram1的 clkb、myram2的clka以及myip的clk為50 MHz外,其他時鐘均為250 MHz;control模塊為控制信號的跨時鐘域轉(zhuǎn)換模塊,因為控制信號rx_done_output從頻率高的時鐘域輸出到頻率低的時鐘域,必須對其進行轉(zhuǎn)換,才能使其在頻率低的時鐘域內(nèi)被有效識別。
myip部分內(nèi)含myTransform IP核,這部分為用戶自定義的IP,其內(nèi)部結(jié)構(gòu)如圖4所示。
其中,myTransform模塊為由Handel-C轉(zhuǎn)換而來的坐標變換模塊,它有 4個數(shù)據(jù)輸入口(angle,x,y,z)和 10個數(shù)據(jù)輸出口(my_m_elements_1~my_m_elements_a)。而myip為1個數(shù)據(jù)輸入口和1個數(shù)據(jù)輸出口,即串行輸入和串行輸出。為了將myTransform模塊封裝成myip的串行輸入、輸出形式,在輸入、輸出端分別有一個4 bit串/并轉(zhuǎn)換模塊4-bit Serial2Par和10 bit并/串轉(zhuǎn)換模塊10-bit Par2Serial;而Control_Logic為myip模塊的邏輯控制模塊,主要實現(xiàn)以下功能:
(1)對各模塊的開始(start)與完成(done)信號進行處理,并根據(jù)這兩個信號對各模塊的工作進行調(diào)度。包括整個myip模塊、myTransform模塊、串/并模塊和并/串模塊。
(2)對外部兩個雙口ram的讀寫進行控制,包括地址和寫使能信號的控制。
這里的用戶IP即myTransform模塊,根據(jù)用戶IP的數(shù)據(jù)輸入、輸出形式,只要改變串/并轉(zhuǎn)換的位數(shù)和并/串轉(zhuǎn)換的位數(shù),即可實現(xiàn)用戶IP模塊與myip模塊的整合,而無需改變myip模塊的接口以及控制信號,為該系統(tǒng)的通用性提供了保證。
軟件包括兩部分:DMA通信部分和OpenGL-ES中除了坐標變換算法以外的其他部分。
DMA通信部分又分為驅(qū)動層和應(yīng)用層接口。驅(qū)動層的設(shè)計涉及到Windows下PCIe驅(qū)動程序的編寫,不是本文的討論重點;應(yīng)用層接口是在驅(qū)動層的基礎(chǔ)上生成API,用以在應(yīng)用程序中進行相關(guān)的 DMA操作(主要包括DMA器件的打開和關(guān)閉、讀寫DMA的設(shè)置、DMA啟動以及DMA各寄存器的讀寫操作等)。
將原始的OpenGL-ES中坐標變換模塊用DMA操作代替:首先打開 DMA器件、復(fù)位 DMA器件、設(shè)置DMA傳輸中各寄存器的值,再將輸入?yún)?shù)放到相應(yīng)內(nèi)存(TLPReadBuffer)中,然后啟動DMA操作,將該內(nèi)存的值通過PCIe傳到開發(fā)板上進行處理,處理完后的數(shù)據(jù)再通過DMA寫操作寫進PC相應(yīng)的內(nèi)存(TLPWriteBuffer)中。通過不斷讀取寫操作完成寄存器的值,來判斷寫操作是否完成。如果寫操作未完成,則繼續(xù)讀取該寄存器值來判斷,若讀取次數(shù)超出設(shè)定值,則重新啟動DMA。當寫操作完成時,從相應(yīng)內(nèi)存(TLPWriteBuffer)中讀取處理完的數(shù)據(jù),即為坐標變換模塊的返回值。軟件工作流程如圖5所示。
圖5 軟件工作流程
啟動DMA操作實際上包括啟動DMA讀和寫的操作。DMA硬件會先啟動讀操作,將內(nèi)存中的值讀入開發(fā)板,然后經(jīng)過用戶IP進行處理完后,寫回內(nèi)存。因此只需要確定DMA寫操作完成即可,此時整個DMA讀寫操作也一定完成。
經(jīng)過軟件仿真驗證各模塊功能完全正確之后,將該設(shè)計進行軟、硬件聯(lián)合驗證。
本設(shè)計采用的硬件驗證平臺為Avnet公司的AES-XLX-V5SXT-PCIE50-G開發(fā)板,該開發(fā)板的FPGA芯片型號為Xilinx公司Virtex5系列的xc5vsx50t[5]。
針對一些運行時間較長的單元,在Handel-C中加入par并行處理進行優(yōu)化,在ISE11.1中用XST進行綜合。表1體現(xiàn)了加入par之前和之后所耗資源的對比。
表1 資源使用情況
由表1可以看出,加入并行處理后資源消耗有所增加,但處于合理范圍內(nèi)。
用ISE11.1對綜合后的網(wǎng)表進行實現(xiàn),生成.bit文件并下載到開發(fā)板中,聯(lián)合軟件部分進行協(xié)同驗證。為了將其與傳統(tǒng)Modelsim仿真速度作對比,這里將模塊處理復(fù)雜度擴大10 000倍,即可明顯看出該驗證方法的速度優(yōu)勢。表2給出了在PC主頻2.66 GHz下,從Rst信號到Done信號之間仿真消耗的時間對比。由表中可看出,本文采用的驗證方法在仿真速度上是傳統(tǒng)ModelSim仿真的778倍,即使對經(jīng)過Modelsim優(yōu)化后的節(jié)點進行仿真,也快了202倍。
表2 仿真速度比較
本文用Handel-C設(shè)計和實現(xiàn)了OpenGL-ES的坐標變換算法,并將其與軟件平臺進行軟、硬件協(xié)同驗證。結(jié)果表明,Handel-C能夠用來實現(xiàn)復(fù)雜的算法,并且比傳統(tǒng)的HDL設(shè)計方法更為高效;通過該方法建立的軟、硬件仿真平臺對IP進行驗證,具有更高的效率。
[1]孫家廣.計算機圖形學(第三版)[M].北京:清華大學出版社,1999.
[2]Munshi.OpenGL ES common/common-lite profile specification[S].2004.
[3]Celoxica.Handel-C language reference manual[Z].2005.
[4]Celoxica.Handel-C code optimization[Z].2003.
[5]Xilinx.Virtex-5 FPGA user guide[Z].2009.