夏冰潔,王琴
(上海交通大學(xué)電子信息與電氣工程學(xué)院,上海 200240)
集成電路的概念出現(xiàn)后,集成電路設(shè)計(jì)從早期簡(jiǎn)單邏輯門(mén)的集成,逐漸地發(fā)展到了知識(shí)產(chǎn)權(quán)(Intellectual Property core,IP 核)的集成,人們對(duì)于更加微型且集成了更多功能的芯片要求越來(lái)越高。需求刺激了新技術(shù)的發(fā)展,新技術(shù)又刺激產(chǎn)生了新一輪的需求。到目前為止,已經(jīng)實(shí)現(xiàn)了在一方小小的芯片上集成十幾個(gè)IP 的功能。
當(dāng)涉及多個(gè)IP核同時(shí)運(yùn)作時(shí),對(duì)數(shù)據(jù)流的控制就顯得尤為重要。為了使數(shù)據(jù)能夠有條不紊地在各個(gè)IP 核之間流通,如何協(xié)調(diào)各個(gè)IP 之間的關(guān)系、對(duì)多個(gè)IP 進(jìn)行全局控制成為了最重要的研究課題。
在卷積神經(jīng)網(wǎng)絡(luò)加速器的整體框架中,針對(duì)卷積神經(jīng)網(wǎng)絡(luò)計(jì)算量大、數(shù)據(jù)流動(dòng)復(fù)雜等特點(diǎn),在Vivado 2018.3 中搭建了一個(gè)整體的數(shù)據(jù)通路框架,其基本的數(shù)據(jù)流程如圖1 所示。
圖1 基本數(shù)據(jù)流程
目前,對(duì)SoC 接口設(shè)計(jì)的研究面較為廣泛,但多數(shù)研究仍然集中在已經(jīng)普及使用的AXI 總線協(xié)議對(duì)應(yīng)的接口設(shè)計(jì)。在對(duì)自定義IP 的研究方面,雖然許多功能因?yàn)榻?jīng)常被調(diào)用而被封裝成了IP,但因?yàn)槿狈νㄓ玫膮f(xié)議而限制了對(duì)它的使用。
如圖1 所示,基本數(shù)據(jù)流框架是指首先在主控端中編寫(xiě)接口的驅(qū)動(dòng)代碼,這些代碼經(jīng)過(guò)AXI 總線與FPGA 進(jìn)行通信,先通過(guò)AXI Quad SPI 這個(gè)接口轉(zhuǎn)接IP 操控SPI Flash 內(nèi)的數(shù)據(jù),并將其中的數(shù)據(jù)輸出至AXI總線。接著,主控端的C代碼繼續(xù)操控連在AXI總線上的DMA,利用DMA對(duì)DDR進(jìn)行配置,就能將AXI總線上的數(shù)據(jù)讀取至DDR 中。然后,當(dāng)需要將DDR內(nèi)數(shù)據(jù)輸出至計(jì)算模塊時(shí),再將DDR的地址配置進(jìn)讀寫(xiě)通道,將DDR 內(nèi)對(duì)應(yīng)地址中的數(shù)據(jù)讀取出來(lái),經(jīng)由Data FIFO 輸入計(jì)算模塊頂層,供加速器算法使用。
AXI Quad SPI是一個(gè)用于接口轉(zhuǎn)換功能的IP。該IP 的一端以AXI4 Lite協(xié)議為接口,另一端則以SPI協(xié)議為接口。因此,這個(gè)IP實(shí)現(xiàn)了從AXI Lite協(xié)議到SPI協(xié)議的接口轉(zhuǎn)換功能。通過(guò)引入AXI Quad SPI 接在SPI Flash 和AXI 總線之間,可以將AXI Quad SPI 和SPI Flash 兩者視為一個(gè)以AXI 協(xié)議為接口的Flash存儲(chǔ)器,整體框架如圖2所示。
圖2 AXI Quad SPI與SPI Flash整體框架
在整體框架中,通過(guò)引入AXI DMA 這一IP,可以實(shí)現(xiàn)控制板上外圍設(shè)備。如圖3 所示,AXI DMA 通過(guò)配置外圍設(shè)備的讀寫(xiě)通道,來(lái)對(duì)外設(shè)進(jìn)行數(shù)據(jù)流的讀寫(xiě),在此處引入AXI DMA,可以利用其接在AXI總線上的S_AXI_Lite 實(shí)現(xiàn)與總線之間的數(shù)據(jù)交流。此處,為了能使數(shù)據(jù)流從SPI Flash 進(jìn)入DDR,可以利用軟件工具開(kāi)發(fā)包(Software Development Kit,SDK)內(nèi)的C 代碼對(duì)該DMA 進(jìn)行配置。將DDR 的基地址配置進(jìn)讀入數(shù)據(jù)的通道,就可以利用DMA 實(shí)現(xiàn)將AXI 總線上的數(shù)據(jù)讀取至DDR 對(duì)應(yīng)地址內(nèi)的操作。
圖3 從AXI到DDR數(shù)據(jù)通路
基于計(jì)算模塊本身的算法設(shè)計(jì),其接口是自定義形成的,因此需要對(duì)該計(jì)算模塊的算法外加一個(gè)頂層,以保證計(jì)算模塊IP 能夠以AXI 協(xié)議為接口,準(zhǔn)確地卡在DMA 模塊和先進(jìn)先出存儲(chǔ)器(First Input First Output,F(xiàn)IFO)模塊之間,如圖4所示。
圖4 從DDR到計(jì)算模塊數(shù)據(jù)通路
針對(duì)從DDR 中取出至Data FIFO 的數(shù)據(jù),計(jì)算模塊以AXI4 Stream 接口協(xié)議接收這部分?jǐn)?shù)據(jù),然后將數(shù)據(jù)送入計(jì)算模塊內(nèi)。為了能構(gòu)成一個(gè)回路,再將計(jì)算模塊連回DMA 以留出設(shè)計(jì)余地,以便實(shí)現(xiàn)計(jì)算模塊中的數(shù)據(jù)再次通過(guò)DMA 傳輸回DDR 中的過(guò)程。
如圖5 所示,在該項(xiàng)目的設(shè)計(jì)中,選用的是Xil_MemCpy(參數(shù)1、參數(shù)2、參數(shù)3)函數(shù)。參數(shù)1 是一個(gè)基地址,參數(shù)2 也是一個(gè)基地址。將參數(shù)1 基地址開(kāi)始往后的參數(shù)中3 個(gè)字節(jié)的數(shù)據(jù)拷貝到參數(shù)2基地址下。
圖5 Flash傳輸數(shù)據(jù)至DDR
對(duì)于PingPong 操作中所用到的兩塊FIFO 而言,它們循環(huán)往復(fù)地進(jìn)行讀或?qū)懙牟僮?。?duì)其進(jìn)行簡(jiǎn)單的分類(lèi),可以分為4 種工作狀態(tài):
1)idle狀態(tài):兩塊FIFO均為既不讀也不寫(xiě)的操作;
2)start狀態(tài):FIFO1 讀入數(shù)據(jù),F(xiàn)IFO2 無(wú)操作;
3)Ping 狀態(tài):FIFO1 讀入數(shù)據(jù),F(xiàn)IFO2 寫(xiě)出數(shù)據(jù);
4)Pong 狀態(tài):FIFO1 寫(xiě)出數(shù)據(jù),F(xiàn)IFO2 讀入數(shù)據(jù);
將以上4 種狀態(tài)的轉(zhuǎn)換展現(xiàn)在狀態(tài)機(jī)轉(zhuǎn)換圖中,如圖6 所示。
圖6 PingPong狀態(tài)機(jī)轉(zhuǎn)換流程
針對(duì)FIFO 的內(nèi)部邏輯而言,需要對(duì)控制信號(hào)分別進(jìn)行控制。Data_valid 信號(hào)代表FIFO 內(nèi)部是否存在數(shù)據(jù),當(dāng)FIFO 內(nèi)存在數(shù)據(jù)時(shí),Data_valid=1;當(dāng)FIFO 內(nèi)沒(méi)有數(shù)據(jù)時(shí),Data_valid=0。當(dāng)FIFO 內(nèi)部沒(méi)有數(shù)據(jù)并且此時(shí)要將數(shù)據(jù)讀入FIFO,Data_valid 信號(hào)由0 置為1;當(dāng)FIFO 內(nèi)部已有數(shù)據(jù)并且此時(shí)要將數(shù)據(jù)寫(xiě)出至計(jì)算模塊,Data_valid 信號(hào)由1 置為0。FIFO 內(nèi)的邏輯控制流程如圖7 所示。
圖7 FIFO內(nèi)邏輯控制流程
通過(guò)在Vivado 2018.3 平臺(tái)中進(jìn)行綜合仿真,所得出的時(shí)序結(jié)果如表1 所示。該工程的時(shí)鐘周期為10 ns,時(shí)鐘頻率為100 MHz,最長(zhǎng)延遲為5.5 ns。
表1 Vivado仿真時(shí)序報(bào)告
資源報(bào)告如表2 所示。
表2 Vivado仿真資源報(bào)告
除了上述時(shí)序報(bào)告和資源報(bào)告外,這個(gè)工程的帶寬是3 200 Mbits,即在1 s 內(nèi),有3 200 Mbits 的數(shù)據(jù)進(jìn)入計(jì)算模塊被處理。
32 bits×100 MHz=3 200 Mbits
按照計(jì)算模塊的需求,不同的卷積層會(huì)用到不同大小的數(shù)據(jù)量。對(duì)于一個(gè)普通的具有8 層卷積的CNN 加速器而言,根據(jù)每一層所給出的數(shù)據(jù)量,可得到輸入用時(shí),如表3 所示。
表3 每層卷積輸入數(shù)據(jù)量和輸入用時(shí)
文中依托一個(gè)典型的CNN 加速器結(jié)構(gòu),主要實(shí)現(xiàn)了在Vivado 2018.3 中設(shè)計(jì)底層硬件數(shù)據(jù)流通路,并對(duì)進(jìn)入計(jì)算模塊算法部分的數(shù)據(jù)的通路進(jìn)行優(yōu)化。在這個(gè)項(xiàng)目中,選擇了DMA 訪問(wèn)來(lái)控制對(duì)外圍存儲(chǔ)設(shè)備的讀寫(xiě),并在計(jì)算模塊的頂層加入一個(gè)PingPong 的FIFO 來(lái)對(duì)進(jìn)入計(jì)算模塊的數(shù)據(jù)進(jìn)行流水化操作。最終實(shí)現(xiàn)了對(duì)數(shù)據(jù)流架構(gòu)的優(yōu)化,使得時(shí)鐘周期達(dá)到10 ns,并依次給出了資源報(bào)告和每層卷積的輸入用時(shí)。該項(xiàng)目對(duì)基于FPGA 的SoC 接口設(shè)計(jì)具有參考意義,提供了一種SoC 接口設(shè)計(jì)方法,為未來(lái)的研究提供了一個(gè)參考方向。