夏冰潔,王琴
(上海交通大學(xué)電子信息與電氣工程學(xué)院,上海 200240)
集成電路的概念出現(xiàn)后,集成電路設(shè)計從早期簡單邏輯門的集成,逐漸地發(fā)展到了知識產(chǎn)權(quán)(Intellectual Property core,IP 核)的集成,人們對于更加微型且集成了更多功能的芯片要求越來越高。需求刺激了新技術(shù)的發(fā)展,新技術(shù)又刺激產(chǎn)生了新一輪的需求。到目前為止,已經(jīng)實現(xiàn)了在一方小小的芯片上集成十幾個IP 的功能。
當(dāng)涉及多個IP核同時運作時,對數(shù)據(jù)流的控制就顯得尤為重要。為了使數(shù)據(jù)能夠有條不紊地在各個IP 核之間流通,如何協(xié)調(diào)各個IP 之間的關(guān)系、對多個IP 進行全局控制成為了最重要的研究課題。
在卷積神經(jīng)網(wǎng)絡(luò)加速器的整體框架中,針對卷積神經(jīng)網(wǎng)絡(luò)計算量大、數(shù)據(jù)流動復(fù)雜等特點,在Vivado 2018.3 中搭建了一個整體的數(shù)據(jù)通路框架,其基本的數(shù)據(jù)流程如圖1 所示。

圖1 基本數(shù)據(jù)流程
目前,對SoC 接口設(shè)計的研究面較為廣泛,但多數(shù)研究仍然集中在已經(jīng)普及使用的AXI 總線協(xié)議對應(yīng)的接口設(shè)計。在對自定義IP 的研究方面,雖然許多功能因為經(jīng)常被調(diào)用而被封裝成了IP,但因為缺乏通用的協(xié)議而限制了對它的使用。
如圖1 所示,基本數(shù)據(jù)流框架是指首先在主控端中編寫接口的驅(qū)動代碼,這些代碼經(jīng)過AXI 總線與FPGA 進行通信,先通過AXI Quad SPI 這個接口轉(zhuǎn)接IP 操控SPI Flash 內(nèi)的數(shù)據(jù),并將其中的數(shù)據(jù)輸出至AXI總線。接著,主控端的C代碼繼續(xù)操控連在AXI總線上的DMA,利用DMA對DDR進行配置,就能將AXI總線上的數(shù)據(jù)讀取至DDR 中。然后,當(dāng)需要將DDR內(nèi)數(shù)據(jù)輸出至計算模塊時,再將DDR的地址配置進讀寫通道,將DDR 內(nèi)對應(yīng)地址中的數(shù)據(jù)讀取出來,經(jīng)由Data FIFO 輸入計算模塊頂層,供加速器算法使用。
AXI Quad SPI是一個用于接口轉(zhuǎn)換功能的IP。該IP 的一端以AXI4 Lite協(xié)議為接口,另一端則以SPI協(xié)議為接口。因此,這個IP實現(xiàn)了從AXI Lite協(xié)議到SPI協(xié)議的接口轉(zhuǎn)換功能。通過引入AXI Quad SPI 接在SPI Flash 和AXI 總線之間,可以將AXI Quad SPI 和SPI Flash 兩者視為一個以AXI 協(xié)議為接口的Flash存儲器,整體框架如圖2所示。

圖2 AXI Quad SPI與SPI Flash整體框架
在整體框架中,通過引入AXI DMA 這一IP,可以實現(xiàn)控制板上外圍設(shè)備。如圖3 所示,AXI DMA 通過配置外圍設(shè)備的讀寫通道,來對外設(shè)進行數(shù)據(jù)流的讀寫,在此處引入AXI DMA,可以利用其接在AXI總線上的S_AXI_Lite 實現(xiàn)與總線之間的數(shù)據(jù)交流。此處,為了能使數(shù)據(jù)流從SPI Flash 進入DDR,可以利用軟件工具開發(fā)包(Software Development Kit,SDK)內(nèi)的C 代碼對該DMA 進行配置。將DDR 的基地址配置進讀入數(shù)據(jù)的通道,就可以利用DMA 實現(xiàn)將AXI 總線上的數(shù)據(jù)讀取至DDR 對應(yīng)地址內(nèi)的操作。

圖3 從AXI到DDR數(shù)據(jù)通路
基于計算模塊本身的算法設(shè)計,其接口是自定義形成的,因此需要對該計算模塊的算法外加一個頂層,以保證計算模塊IP 能夠以AXI 協(xié)議為接口,準(zhǔn)確地卡在DMA 模塊和先進先出存儲器(First Input First Output,F(xiàn)IFO)模塊之間,如圖4所示。

圖4 從DDR到計算模塊數(shù)據(jù)通路
針對從DDR 中取出至Data FIFO 的數(shù)據(jù),計算模塊以AXI4 Stream 接口協(xié)議接收這部分?jǐn)?shù)據(jù),然后將數(shù)據(jù)送入計算模塊內(nèi)。為了能構(gòu)成一個回路,再將計算模塊連回DMA 以留出設(shè)計余地,以便實現(xiàn)計算模塊中的數(shù)據(jù)再次通過DMA 傳輸回DDR 中的過程。
如圖5 所示,在該項目的設(shè)計中,選用的是Xil_MemCpy(參數(shù)1、參數(shù)2、參數(shù)3)函數(shù)。參數(shù)1 是一個基地址,參數(shù)2 也是一個基地址。將參數(shù)1 基地址開始往后的參數(shù)中3 個字節(jié)的數(shù)據(jù)拷貝到參數(shù)2基地址下。

圖5 Flash傳輸數(shù)據(jù)至DDR
對于PingPong 操作中所用到的兩塊FIFO 而言,它們循環(huán)往復(fù)地進行讀或?qū)懙牟僮鳌ζ溥M行簡單的分類,可以分為4 種工作狀態(tài):
1)idle狀態(tài):兩塊FIFO均為既不讀也不寫的操作;
2)start狀態(tài):FIFO1 讀入數(shù)據(jù),F(xiàn)IFO2 無操作;
3)Ping 狀態(tài):FIFO1 讀入數(shù)據(jù),F(xiàn)IFO2 寫出數(shù)據(jù);
4)Pong 狀態(tài):FIFO1 寫出數(shù)據(jù),F(xiàn)IFO2 讀入數(shù)據(jù);
將以上4 種狀態(tài)的轉(zhuǎn)換展現(xiàn)在狀態(tài)機轉(zhuǎn)換圖中,如圖6 所示。

圖6 PingPong狀態(tài)機轉(zhuǎn)換流程
針對FIFO 的內(nèi)部邏輯而言,需要對控制信號分別進行控制。Data_valid 信號代表FIFO 內(nèi)部是否存在數(shù)據(jù),當(dāng)FIFO 內(nèi)存在數(shù)據(jù)時,Data_valid=1;當(dāng)FIFO 內(nèi)沒有數(shù)據(jù)時,Data_valid=0。當(dāng)FIFO 內(nèi)部沒有數(shù)據(jù)并且此時要將數(shù)據(jù)讀入FIFO,Data_valid 信號由0 置為1;當(dāng)FIFO 內(nèi)部已有數(shù)據(jù)并且此時要將數(shù)據(jù)寫出至計算模塊,Data_valid 信號由1 置為0。FIFO 內(nèi)的邏輯控制流程如圖7 所示。

圖7 FIFO內(nèi)邏輯控制流程
通過在Vivado 2018.3 平臺中進行綜合仿真,所得出的時序結(jié)果如表1 所示。該工程的時鐘周期為10 ns,時鐘頻率為100 MHz,最長延遲為5.5 ns。

表1 Vivado仿真時序報告
資源報告如表2 所示。

表2 Vivado仿真資源報告
除了上述時序報告和資源報告外,這個工程的帶寬是3 200 Mbits,即在1 s 內(nèi),有3 200 Mbits 的數(shù)據(jù)進入計算模塊被處理。
32 bits×100 MHz=3 200 Mbits
按照計算模塊的需求,不同的卷積層會用到不同大小的數(shù)據(jù)量。對于一個普通的具有8 層卷積的CNN 加速器而言,根據(jù)每一層所給出的數(shù)據(jù)量,可得到輸入用時,如表3 所示。

表3 每層卷積輸入數(shù)據(jù)量和輸入用時
文中依托一個典型的CNN 加速器結(jié)構(gòu),主要實現(xiàn)了在Vivado 2018.3 中設(shè)計底層硬件數(shù)據(jù)流通路,并對進入計算模塊算法部分的數(shù)據(jù)的通路進行優(yōu)化。在這個項目中,選擇了DMA 訪問來控制對外圍存儲設(shè)備的讀寫,并在計算模塊的頂層加入一個PingPong 的FIFO 來對進入計算模塊的數(shù)據(jù)進行流水化操作。最終實現(xiàn)了對數(shù)據(jù)流架構(gòu)的優(yōu)化,使得時鐘周期達到10 ns,并依次給出了資源報告和每層卷積的輸入用時。該項目對基于FPGA 的SoC 接口設(shè)計具有參考意義,提供了一種SoC 接口設(shè)計方法,為未來的研究提供了一個參考方向。