吳劍簫 王 鵬
1(中國(guó)科學(xué)院上海高等研究院 上海 200120) 2(中國(guó)科學(xué)院大學(xué) 北京 100049) 3(上海大學(xué)計(jì)算機(jī)工程與科學(xué)學(xué)院 上海 200444) 4(數(shù)學(xué)工程與先進(jìn)計(jì)算國(guó)家重點(diǎn)實(shí)驗(yàn)室 江蘇 無(wú)錫 214215)
DMA技術(shù)是計(jì)算機(jī)系統(tǒng)中一種高速高效的數(shù)據(jù)傳輸技術(shù)。使用DMA控制器可直接實(shí)現(xiàn)內(nèi)存與外設(shè)間數(shù)據(jù)交換,減少對(duì)處理器的占用時(shí)間,從而提高整體系統(tǒng)性能[1],多應(yīng)用于視頻、音頻和網(wǎng)絡(luò)接口等高吞吐率外設(shè)。DMA控制器有兩種實(shí)現(xiàn)方式:寄存器模式與描述符(descriptor)模式[2]。在寄存器模式中處理器直接控制DMA相關(guān)寄存器,配置相關(guān)傳輸參數(shù),控制數(shù)據(jù)傳輸?shù)膯?dòng)與停止。它具有較好的數(shù)據(jù)傳輸性能,但需要處理器對(duì)寄存器進(jìn)行實(shí)時(shí)配置,靈活性較差。描述符模式需要處理器在內(nèi)存中預(yù)先布設(shè)好用于指示DMA操作的描述符,DMA控制器通過(guò)描述符獲得緩存地址、數(shù)據(jù)長(zhǎng)度等信息進(jìn)行操作,并通過(guò)改寫描述符與處理器或軟件進(jìn)行交互,因而具有較強(qiáng)的靈活性。通用外設(shè)接口協(xié)議如以太網(wǎng)、PCIe等常使用該方式實(shí)現(xiàn)網(wǎng)絡(luò)協(xié)議棧的標(biāo)準(zhǔn)化處理。配置并更新描述符需要DMA控制器與處理器多次內(nèi)存讀寫交互,因此需要處理器頻繁參與,總線效率低下。
本文提出一種新型自適應(yīng)雙緩沖DMA(ADB-DMA)架構(gòu),在保證標(biāo)準(zhǔn)協(xié)議棧兼容處理的前提下,可大幅提高用戶數(shù)據(jù)吞吐量,最大程度減少對(duì)處理器的打擾,使總線效率達(dá)到最大化。該DMA控制器根據(jù)幀類型對(duì)數(shù)據(jù)包進(jìn)行分類,對(duì)標(biāo)準(zhǔn)協(xié)議棧包,如IP、ARP與RARP等,使用基于描述符DMA方式進(jìn)行傳輸;對(duì)用戶數(shù)據(jù)包則進(jìn)行寄存器模式DMA傳輸。該架構(gòu)結(jié)合了兩種DMA傳輸模式的優(yōu)點(diǎn),在保證高傳輸性能的同時(shí)支持標(biāo)準(zhǔn)網(wǎng)絡(luò)協(xié)議棧處理,方便軟件移植。通過(guò)仿真與FPGA測(cè)試與Synopsys公司以太網(wǎng)DMA控制器[3]進(jìn)行對(duì)比,該自適應(yīng)雙緩沖DMA控制器結(jié)構(gòu)具有對(duì)處理器打擾小、帶寬利用率高、處理流程簡(jiǎn)單等優(yōu)點(diǎn)。
以太網(wǎng)等高速接口協(xié)議的幀格式中含有若干字節(jié)的類型字段,用于指示所傳輸數(shù)據(jù)對(duì)應(yīng)協(xié)議。通過(guò)自定義該類型字段,可將用戶數(shù)據(jù)與基于標(biāo)準(zhǔn)協(xié)議棧數(shù)據(jù)包進(jìn)行有效區(qū)分。ADB-DMA能夠根據(jù)類型字段自適應(yīng)選擇對(duì)應(yīng)的DMA方式對(duì)該數(shù)據(jù)進(jìn)行傳輸,其結(jié)構(gòu)如圖1所示。
圖1 自適應(yīng)雙緩沖DMA結(jié)構(gòu)
在進(jìn)行數(shù)據(jù)傳輸時(shí),高速接口向DMA控制器發(fā)送DMA請(qǐng)求,DMA控制器將該請(qǐng)求傳遞到處理器,申請(qǐng)系統(tǒng)總線的控制權(quán)。處理器會(huì)對(duì)該請(qǐng)求進(jìn)行響應(yīng),并對(duì)DMA控制器進(jìn)行控制,根據(jù)幀類型選取數(shù)據(jù)傳輸方式,配置對(duì)應(yīng)模式下的寄存器后使DMA控制器開(kāi)始進(jìn)行數(shù)據(jù)傳輸。DMA控制器將對(duì)應(yīng)讀寫信號(hào)傳遞給內(nèi)存與接口,將對(duì)應(yīng)數(shù)據(jù)地址傳遞給內(nèi)存,從而實(shí)現(xiàn)高速接口對(duì)內(nèi)存的直接訪問(wèn)。待數(shù)據(jù)傳輸完畢后,向處理器發(fā)送中斷,將系統(tǒng)總線的控制權(quán)交還給處理器。
使用描述符模式DMA傳輸標(biāo)準(zhǔn)協(xié)議棧包。描述符中包括軟硬件握手標(biāo)志、控制狀態(tài)、緩存地址、數(shù)據(jù)長(zhǎng)度等信息。通過(guò)寄存器可配置描述符的起始地址,描述符在內(nèi)存中可采用環(huán)形鏈表組織形式。各描述符的地址首尾相連。在傳輸完當(dāng)前描述符后,描述符地址更新為下一個(gè)描述符地址,當(dāng)處理完最后一個(gè)描述符后,描述符地址重新更新為首個(gè)描述符的地址。
使用寄存器模式DMA傳輸用戶數(shù)據(jù),并使用雙緩沖對(duì)數(shù)據(jù)進(jìn)行接收,該模式下需要配置的寄存器有起始地址寄存器、數(shù)據(jù)包長(zhǎng)寄存器、總數(shù)據(jù)長(zhǎng)度寄存器、源地址和目的地址寄存器、中斷所需包數(shù)寄存器、控制狀態(tài)寄存器、中斷狀態(tài)寄存器等。通過(guò)配置起始地址寄存器指示收發(fā)數(shù)據(jù)位置。
該DMA結(jié)構(gòu)在工作時(shí)首先根據(jù)幀類型,選取DMA的傳輸模式,其工作原理如圖2所示。
圖2 DMA發(fā)送流程
發(fā)送工作流程:
(1) 判斷發(fā)送數(shù)據(jù)是否為用戶數(shù)據(jù)。
(2) 若發(fā)送數(shù)據(jù)為用戶數(shù)據(jù),選用寄存器模式DMA進(jìn)行發(fā)送。配置發(fā)送端寄存器,進(jìn)行起始地址、包長(zhǎng)、總發(fā)送長(zhǎng)度等參數(shù)的配置。
(3) 寫發(fā)送控制寄存器,開(kāi)啟DMA發(fā)送操作,并清零總發(fā)包計(jì)數(shù)器total_cnt與當(dāng)前發(fā)包計(jì)數(shù)器cur_cnt。
(4) 判斷發(fā)包計(jì)數(shù)器是否達(dá)到總發(fā)包數(shù)與中斷所需發(fā)包數(shù)。
(5) 若兩個(gè)計(jì)數(shù)器均未達(dá)到要求值,則從發(fā)送數(shù)據(jù)起始地址取出一個(gè)包的數(shù)據(jù),并更新發(fā)送數(shù)據(jù)起始地址。兩個(gè)計(jì)數(shù)器的計(jì)數(shù)值加1。
(6) 若當(dāng)前發(fā)包計(jì)數(shù)器達(dá)到中斷所需包數(shù),則清除當(dāng)前發(fā)包計(jì)數(shù)器。在中斷寄存器中置包發(fā)送中斷,向CPU發(fā)送中斷。返回步驟(4)。
(7) 若總發(fā)包數(shù)計(jì)數(shù)器達(dá)到總發(fā)包數(shù),則代表發(fā)送完成。寫發(fā)送控制寄存器,關(guān)閉DMA發(fā)送;在中斷寄存器中置總發(fā)送中斷,向CPU發(fā)送中斷。
(8) 從內(nèi)存中中斷包起始地址處讀取數(shù)據(jù)作為中斷包發(fā)送。
(9) 發(fā)送完成后讀取發(fā)送DMA狀態(tài),若狀態(tài)空閑,可進(jìn)行下一次發(fā)送操作。
(10) 若所需發(fā)送的數(shù)據(jù)為標(biāo)準(zhǔn)協(xié)議棧包,選用描述符模式DMA進(jìn)行發(fā)送。寫描述符模式寄存器,配置操作模式,描述符起始地址以及中斷使能。
(11) 在指定的描述符地址處開(kāi)始填充發(fā)送描述符,并向描述符指定的內(nèi)存位置填充所發(fā)數(shù)據(jù)。
(12) 通過(guò)寫描述符模式寄存器,開(kāi)啟DMA發(fā)送。
(13) 將數(shù)據(jù)從指定內(nèi)存地址發(fā)送。
(14) 當(dāng)前發(fā)送描述符對(duì)應(yīng)數(shù)據(jù)發(fā)送完畢后,發(fā)送中斷并判斷下一個(gè)描述符是否可用。
(15) 若下一個(gè)描述符可用則繼續(xù)發(fā)送下一個(gè)描述符對(duì)應(yīng)的數(shù)據(jù),否則置描述符不可用中斷,向CPU發(fā)送中斷后,進(jìn)行下一次數(shù)據(jù)包發(fā)送。
相比發(fā)送流程,DMA接收流程較為簡(jiǎn)單,工作流程如圖3所示。
圖3 DMA接收流程
接收工作流程:
(1) 判斷數(shù)據(jù)包是否為用戶數(shù)據(jù)。
(2) 若接收數(shù)據(jù)為用戶數(shù)據(jù),選用寄存器模式DMA進(jìn)行接收。寫接收端寄存器,配置兩個(gè)緩沖起始地址、包長(zhǎng)、總發(fā)送長(zhǎng)度等參數(shù)。
(3) 寫接收端控制寄存器,開(kāi)啟DMA接收操作。
(4) 讀取中斷寄存器,若緩沖滿中斷為高則說(shuō)明緩沖中已填充了足夠的數(shù)據(jù)包,可對(duì)緩沖中的數(shù)據(jù)進(jìn)行接收,并清空中斷。
(5) 從對(duì)應(yīng)緩沖中取出數(shù)據(jù)包,并更新接收數(shù)據(jù)起始地址為另一塊緩沖的地址。
(6) 若收到的包為中斷包,則代表該次接收完成。復(fù)原數(shù)據(jù)接收起始地址,并發(fā)送接收完成中斷。
(7) 若所需接收的數(shù)據(jù)為標(biāo)準(zhǔn)協(xié)議棧包,選用描述符模式DMA進(jìn)行接收。寫寄存器,配置操作模式,描述符起始地址以及中斷使能。
(8) 在指定的描述符地址處開(kāi)始填充接收描述符。
(9) 通過(guò)寫寄存器,開(kāi)啟DMA接收。
(10) 將數(shù)據(jù)保存到描述符指定的地址。
(11) 當(dāng)前接收描述符對(duì)應(yīng)數(shù)據(jù)接收完畢后,發(fā)送中斷并判斷下一個(gè)描述符是否可用。
(12) 若下一個(gè)接收描述符可用則繼續(xù)接收下一個(gè)描述符對(duì)應(yīng)的數(shù)據(jù),否則進(jìn)行下一次數(shù)據(jù)包接收。
為了進(jìn)一步提升大量連續(xù)用戶數(shù)據(jù)接收的效率,在寄存器模式DMA中使用了乒乓操作的雙緩沖結(jié)構(gòu)進(jìn)行數(shù)據(jù)接收[4],雙緩沖結(jié)構(gòu)的工作原理如圖4所示。
圖4 DMA雙緩沖結(jié)構(gòu)工作原理
接收數(shù)據(jù)首先存放在緩沖區(qū)1中,當(dāng)緩沖1中數(shù)據(jù)存滿時(shí),向CPU發(fā)送緩沖滿中斷。DMA開(kāi)始從緩沖1中讀取數(shù)據(jù),接收數(shù)據(jù)的存取地址切換為緩沖區(qū)2。當(dāng)DMA將緩沖區(qū)1的數(shù)據(jù)讀出后,向CPU發(fā)送中斷,更新讀地址為緩沖區(qū)2的地址,待緩沖區(qū)2數(shù)據(jù)準(zhǔn)備完畢后進(jìn)行讀取。同時(shí)控制新數(shù)據(jù)存入緩沖區(qū)1,進(jìn)行下一輪讀緩沖區(qū)操作。
由于ADB-DMA控制器采用兩種模式進(jìn)行數(shù)據(jù)傳輸,用戶數(shù)據(jù)傳輸帶來(lái)的額外時(shí)間開(kāi)銷和整體數(shù)據(jù)傳輸效率與傳統(tǒng)描述符模式DMA不同。以Synopsys公司以太網(wǎng)DMA控制器(基于描述符)為例,對(duì)兩者的性能進(jìn)行對(duì)比。
(1) 傳統(tǒng)描述符DMA。設(shè)DMA總傳輸包數(shù)為k,則CPU需要進(jìn)行k次發(fā)送描述符和k次接收描述符的讀寫,總共需要進(jìn)行2k次內(nèi)存訪問(wèn)。除此之外每進(jìn)行一次數(shù)據(jù)傳輸,CPU就需要處理一收一發(fā)兩次中斷,故CPU共需要處理2次中斷。同時(shí)DMA引擎也需要訪問(wèn)內(nèi)存中的描述符去判斷當(dāng)前描述符是否可用,從而按照描述符中的地址進(jìn)行數(shù)據(jù)傳輸并為下一次傳輸改寫描述符。即DMA引擎也需要進(jìn)行2k次內(nèi)存訪問(wèn)。
另外,在進(jìn)行數(shù)據(jù)傳輸時(shí)需要配置總線模式寄存器,發(fā)送端、接收端描述符起始地址寄存器,中斷使能寄存器和操作模式寄存器共5個(gè)寄存器來(lái)初始化傳輸參數(shù)與狀態(tài)的配置;每處理一次中斷需要讀一次中斷狀態(tài)寄存器并清空一次中斷狀態(tài)寄存器,即需要進(jìn)行7次寄存器讀寫操作。
設(shè)CPU處理一次中斷所用的時(shí)間為t中斷,進(jìn)行一次內(nèi)存訪問(wèn)的時(shí)間為t訪存,讀寫寄存器的時(shí)間為t寄則時(shí)間開(kāi)銷T為:
T=2×t中斷+4k×t訪存+7×t寄
(1)
時(shí)間開(kāi)銷T為:
(2)
傳統(tǒng)處理器完成一次中斷處理所消耗時(shí)間為30個(gè)時(shí)鐘周期左右[5-6],目前處理器的主頻一般為3 GHz左右,故處理一次中斷的時(shí)間約為10 ns;進(jìn)行一次內(nèi)存訪問(wèn)的時(shí)間約為40 ns[7],讀寫DMA寄存器一般需要10個(gè)時(shí)鐘周期左右,一般寄存器讀寫時(shí)鐘頻率為100 MHz,故寄存器讀寫時(shí)間開(kāi)銷約為100 ns。分別選取DMA中最大傳輸包個(gè)數(shù)a為1、4和16,得出采用兩種DMA進(jìn)行數(shù)據(jù)傳輸時(shí)傳輸包數(shù)與額外時(shí)間開(kāi)銷的關(guān)系如圖5所示。
圖5 兩種DMA傳輸時(shí)傳輸包數(shù)與額外時(shí)間開(kāi)銷的關(guān)系
傳輸效率可以通過(guò)總線的利用率體現(xiàn),總線利用率越高,數(shù)據(jù)傳輸效率越高??偩€利用率U可通過(guò)式(3)求出。
(3)
通過(guò)仿真得出該DMA與傳統(tǒng)基于描述符DMA數(shù)據(jù)傳輸時(shí)AXI總線的使用情況如圖6和圖7所示。
圖6 自適應(yīng)雙緩沖DMA數(shù)據(jù)傳輸時(shí)AXI總線情況
圖7 傳統(tǒng)基于描述符DMA數(shù)據(jù)傳輸時(shí)AXI總線情況
描述符模式DMA傳輸15 600字節(jié)數(shù)據(jù)時(shí),AXI總線讀數(shù)據(jù)使用了1 494個(gè)時(shí)鐘周期,總線利用率為65.3%,AXI總線寫數(shù)據(jù)使用了1 462個(gè)時(shí)鐘周期,總線利用率為66.7%,平均總線利用率為66.0%。
設(shè)計(jì)的ADB-DMA傳輸65 536字節(jié)數(shù)據(jù)時(shí),AXI總線讀數(shù)據(jù)使用了4 518個(gè)時(shí)鐘周期,總線利用率為90.7%,AXI總線寫數(shù)據(jù)使用了4 494個(gè)時(shí)鐘周期,總線利用率為91.1%,平均總線利用率為90.9%,比描述符模式的DMA的總線利用率高24.9百分點(diǎn)。
通過(guò)上述對(duì)比可見(jiàn),該ADB-DMA用戶數(shù)據(jù)傳輸所需的額外時(shí)間開(kāi)銷比傳統(tǒng)的基于描述符的DMA小,總體帶寬利用率比傳統(tǒng)DMA高24.9百分點(diǎn)。另外本文提出的ADB-DMA雖使用了兩種模式的DMA,但基于寄存器模式的DMA結(jié)構(gòu)主要由寄存器構(gòu)成,并沒(méi)有增加太大的邏輯量。通過(guò)邏輯綜合工具Design complier對(duì)兩種結(jié)構(gòu)的面積進(jìn)行評(píng)估。描述符模式DMA總面積為31 946.91,此ADB-DMA總面積為33 662.48,該結(jié)構(gòu)僅比傳統(tǒng)描述符DMA結(jié)構(gòu)的設(shè)計(jì)面積大5.37%。該ADB-DMA具有速度快、效率高、結(jié)構(gòu)簡(jiǎn)單的特點(diǎn)。
仿真驗(yàn)證后,對(duì)設(shè)計(jì)進(jìn)行了FPGA驗(yàn)證。驗(yàn)證選用了Xilinx KC705 FPGA開(kāi)發(fā)板,為模擬CPU進(jìn)行中斷處理與內(nèi)存操作,采用了openrisc作為軟核CPU[8],并分配了兩塊內(nèi)存空間作為發(fā)送、接收內(nèi)存區(qū)。驗(yàn)證環(huán)境如圖8所示。
圖8 FPGA驗(yàn)證環(huán)境示意圖
驗(yàn)證時(shí),通過(guò)APB總線配置DMA相關(guān)寄存器,將要發(fā)送的數(shù)據(jù)放入發(fā)送內(nèi)存區(qū)并開(kāi)啟DMA收發(fā)。數(shù)據(jù)在外部環(huán)回,通過(guò)檢測(cè)接收內(nèi)存區(qū)中的數(shù)據(jù)是否與發(fā)送內(nèi)存區(qū)的數(shù)據(jù)一致進(jìn)行驗(yàn)證。經(jīng)驗(yàn)證,該DMA結(jié)構(gòu)能夠根據(jù)傳輸?shù)膸愋妥詣?dòng)選擇對(duì)應(yīng)的DMA方式進(jìn)行數(shù)據(jù)傳輸,在不同傳輸參數(shù)下,該DMA均能正常工作。
驗(yàn)證完成后還使用該環(huán)境對(duì)設(shè)計(jì)的DMA與Synopsys公司以太網(wǎng)DMA控制器在FPGA上進(jìn)行了數(shù)據(jù)傳輸性能的對(duì)比。選取最大以太網(wǎng)幀包長(zhǎng)1 518字節(jié)進(jìn)行長(zhǎng)時(shí)間連續(xù)DMA傳輸,設(shè)計(jì)的雙緩沖DMA與傳統(tǒng)基于描述符的DMA的總線利用率分別為79.8%與58.3%。受限于頻率因素,在FPGA中總線頻率和時(shí)鐘關(guān)系與實(shí)際應(yīng)用中略有差別,因此測(cè)得的帶寬利用率與仿真結(jié)果存在差異。但通過(guò)兩種DMA的對(duì)比,仍能說(shuō)明設(shè)計(jì)的自適應(yīng)雙緩沖DMA具有速度快、效率高的特點(diǎn)。
為適應(yīng)百G以太網(wǎng)等超高速協(xié)議的應(yīng)用需求,本文提出一種新型的ADB-DMA結(jié)構(gòu),可根據(jù)傳輸幀類型自適應(yīng)完成對(duì)標(biāo)準(zhǔn)協(xié)議及用戶數(shù)據(jù)包的處理。相較于傳統(tǒng)基于描述符DMA控制器,ADB-DMA數(shù)據(jù)傳輸額外時(shí)間開(kāi)銷更低,且總體帶寬利用率提高了24.9百分點(diǎn),而面積開(kāi)銷增加僅為5.37%。目前該結(jié)構(gòu)已成功應(yīng)用于國(guó)產(chǎn)芯片100 G以太網(wǎng)接口,從而為國(guó)產(chǎn)集成電路自主可控提供有力支撐。