姜冬梅,何欣霖,李 軍
(成都三零嘉微電子有限公司,四川 成都 610041)
隨著云計(jì)算、大數(shù)據(jù)、5G以及高清視頻業(yè)務(wù)等領(lǐng)域網(wǎng)絡(luò)信息技術(shù)的快速發(fā)展,通信設(shè)備對(duì)密碼處理單元的加解密性能提出了更高的要求。為了滿(mǎn)足網(wǎng)絡(luò)匯聚層、核心服務(wù)器對(duì)海量密碼業(yè)務(wù)處理能力的需求,需要研究具有高性能的密碼芯片。
在基于對(duì)稱(chēng)算法的密碼業(yè)務(wù)中,需要解決密鑰和IV的管理(初始化、存儲(chǔ)、訪問(wèn)、更新與注銷(xiāo))。密碼服務(wù)涉及的密鑰來(lái)源有以下兩種:一是一包一密,隨包下發(fā),不需要維護(hù);二是密鑰需要由主機(jī)下發(fā)到加解密芯片并保存在加解密芯片內(nèi)部,初始化完成后,由主機(jī)和加解密芯片共同完成密鑰的維護(hù)。本文主要研究第二種。密碼服務(wù)涉及的IV來(lái)源也有兩種:一是一包一初始向量(Intial Vector,IV),隨包下發(fā),故無(wú)須考慮IV維護(hù);二是對(duì)較大數(shù)據(jù)進(jìn)行級(jí)聯(lián)加解密處理,此時(shí)的IV生命周期為這個(gè)級(jí)聯(lián)處理數(shù)據(jù)的整個(gè)處理周期,對(duì)于上層應(yīng)用軟件則是維護(hù)一個(gè)加密隧道的線程周期。本文主要研究第二種。IV的初始化、更新和銷(xiāo)毀,需要加解密芯片協(xié)同主機(jī)下發(fā)的初始化包(initial package)、更新包(update package)和結(jié)束包(final package)共同實(shí)現(xiàn),如圖1所示。
圖1 級(jí)聯(lián)加解密過(guò)程
一個(gè)級(jí)聯(lián)加解密過(guò)程可分為初始階段、更新階段和結(jié)束階段3個(gè)階段,更新階段可以處理多個(gè)數(shù)據(jù)包。包序號(hào)和IV一對(duì)一綁定,密鑰索引和密鑰一對(duì)一綁定,下文將整個(gè)級(jí)聯(lián)加密過(guò)程中的數(shù)據(jù)包統(tǒng)稱(chēng)為級(jí)聯(lián)包。
初始階段:首先主機(jī)創(chuàng)建一個(gè)加密隧道線程,完成密鑰初始化,實(shí)現(xiàn)密鑰和密鑰索引的綁定,將包序號(hào)、IV、密鑰索引及數(shù)據(jù)下發(fā)到密碼芯片;其次密碼芯片根據(jù)密鑰索引查找密鑰,并將密鑰、IV和數(shù)據(jù)送入加解密模塊進(jìn)行運(yùn)算;最后運(yùn)算結(jié)果返回主機(jī),并將運(yùn)算結(jié)果的最后一個(gè)級(jí)聯(lián)分組寫(xiě)入IV存儲(chǔ)空間,完成IV的更新。
更新階段:首先主機(jī)下發(fā)包序號(hào)、密鑰索引和數(shù)據(jù);其次密碼芯片根據(jù)包序號(hào)和密鑰索引從本地緩存獲取IV和密鑰,連同數(shù)據(jù)送入加解密模塊進(jìn)行運(yùn)算;最后運(yùn)算結(jié)果包返回主機(jī),并將運(yùn)算結(jié)果的最后一個(gè)級(jí)聯(lián)分組寫(xiě)入IV存儲(chǔ)空間,完成IV的更新。
結(jié)束階段:首先主機(jī)下發(fā)包序號(hào)、密鑰索引和數(shù)據(jù);其次密碼芯片根據(jù)包序號(hào)和密鑰索引從本地緩存獲取IV和密鑰,連同數(shù)據(jù)送入加解密模塊進(jìn)行運(yùn)算,運(yùn)算結(jié)果包返回主機(jī);最后主機(jī)釋放包序號(hào),加密隧道現(xiàn)場(chǎng)注銷(xiāo)。
可見(jiàn),在加解密過(guò)程中需要解決密鑰和IV的存儲(chǔ)和訪問(wèn)。在安全服務(wù)器應(yīng)用領(lǐng)域,加解密業(yè)務(wù)通常需要支持百萬(wàn)級(jí)用戶(hù),密鑰和IV的存儲(chǔ)需求高達(dá)幾百兆字節(jié),片上靜態(tài)隨機(jī)存取存儲(chǔ)器(Static Random Access Memory,SRAM)已不能滿(mǎn)足應(yīng)用的需求。DDR較SRAM具有容量大、成本低等特點(diǎn)[1],因此DDR取代片上SRAM成為密鑰和IV的存儲(chǔ)器。通常,一個(gè)密鑰或一個(gè)IV只有幾十個(gè)字節(jié),當(dāng)多用戶(hù)多線程加解密業(yè)務(wù)同時(shí)進(jìn)行時(shí),需要維護(hù)很多密鑰和IV,就會(huì)對(duì)DDR產(chǎn)生大量的離散數(shù)據(jù)讀寫(xiě)訪問(wèn)。而芯動(dòng)的DDR控制器和鎂光的DDR顆粒、Cadence的DDR控制器和鎂光的DDR顆粒的訪問(wèn)延遲均在幾十個(gè)周期,這是由于對(duì)于DDR的離散數(shù)據(jù)訪問(wèn)的延遲較大,因此存在訪問(wèn)性能低的問(wèn)題。
針對(duì)DDR訪問(wèn)的延遲較大的問(wèn)題,本文提出預(yù)讀機(jī)制,提前發(fā)起讀操作,讀回的數(shù)據(jù)緩存到高速緩沖存儲(chǔ)器(cache)中,當(dāng)加解密模塊發(fā)起讀寫(xiě)IV和密鑰操作時(shí),可直接從cache中讀寫(xiě)數(shù)據(jù),訪問(wèn)延遲小。當(dāng)多包級(jí)聯(lián)時(shí),IV和密鑰數(shù)據(jù)具有時(shí)間局部性[2],而當(dāng)包序號(hào)連續(xù)時(shí),IV數(shù)據(jù)具有空間局部性[2],因此在加解密模塊與DDR之間引入一級(jí)cache,cache命中率較高,從而減少了DDR的訪問(wèn)次數(shù)。
在密碼芯片中,高速加解密業(yè)務(wù)由高速接口、直接存儲(chǔ)器訪問(wèn)(Direct Memory Access,DMA)、數(shù)據(jù)整形和加解密模塊共同完成,如圖2所示。高速接口是主機(jī)和密碼芯片的通信接口;DMA模塊將下行包從高速接口搬往加解密模塊,將上行包從加解密模塊搬往高速接口;數(shù)據(jù)整形模塊將下行包數(shù)據(jù)進(jìn)行整形并分發(fā)到加解密陣列中的各個(gè)加解密單元,當(dāng)完成加解密后,將數(shù)據(jù)匯聚整理后組成上行包,送入DMA模塊。加解密模塊通常由多個(gè)加解密單元組成,完成加解密業(yè)務(wù)。
圖2 DDR硬件加速器在密碼芯片中的位置
如圖2所示,DDR硬件加速器包含預(yù)讀檢測(cè)和cache加速模塊。預(yù)讀檢測(cè)模塊用于檢測(cè)來(lái)自主機(jī)的高速接口的輸入數(shù)據(jù),當(dāng)檢測(cè)到初始包的密鑰索引時(shí),向DDR發(fā)起讀密鑰請(qǐng)求,cache加速模塊在收到讀請(qǐng)求后,從DDR中讀取密鑰,并將其存儲(chǔ)在cache中。當(dāng)數(shù)據(jù)流經(jīng)過(guò)DMA和數(shù)據(jù)整形模塊后,到達(dá)加解密模塊,加解密模塊根據(jù)包序號(hào)和密鑰索引向DDR發(fā)起訪問(wèn)讀寫(xiě)密鑰和IV請(qǐng)求,此時(shí)密鑰和IV已經(jīng)存在cache中,可以較快地完成密鑰和IV的讀寫(xiě)操作。
密碼業(yè)務(wù)通常采用包傳輸模式,密鑰索引字段位于包頭信息中。預(yù)讀檢測(cè)模塊根據(jù)包格式,找出初始包的密鑰索引字段,根據(jù)密鑰的索引規(guī)則,計(jì)算密鑰在DDR中的存儲(chǔ)地址,發(fā)起一筆長(zhǎng)度為1、首地址為該DDR地址的讀操作。cache加速模塊在收到來(lái)自預(yù)讀模塊的讀請(qǐng)求后,向DDR模塊發(fā)起讀請(qǐng)求,并讀回一筆長(zhǎng)度為緩存行(cache line)大小的數(shù)據(jù)包存放到cache中,以便后續(xù)的加解密模塊可以從cache中讀取密鑰。
常見(jiàn)的cache組織方式包含全關(guān)聯(lián)、直接映射和路組關(guān)聯(lián)[3-5]。為了提高cache的命中率,本設(shè)計(jì)采用全關(guān)聯(lián)方式。加速器的設(shè)計(jì)如圖3所示,下面分別就各個(gè)子功能進(jìn)行詳細(xì)描述。
圖3 cache加速模塊
AXI_GS模塊將AXI總線接口轉(zhuǎn)化成內(nèi)部自定義總線接口,并將讀寫(xiě)命令、地址和數(shù)據(jù)送往內(nèi)容可尋址存儲(chǔ)器(Content Addressable Memory,CAM)search。該模塊內(nèi)設(shè)有深度為8的輸入緩存和輸出緩存,用于消除瞬時(shí)帶寬不匹配對(duì)系統(tǒng)性能造成的影響。
CAM search模塊用于檢測(cè)地址是否命中,它將burst首地址送給CAM模塊,從CAM模塊獲取命中信息,同時(shí)將讀寫(xiě)命令、地址和數(shù)據(jù)送往Write and read process模塊。
Address FIFO用于存放未完成的且需要從DDR顆粒讀取數(shù)據(jù)的讀寫(xiě)操作的burst首地址和burst ID。在Write and read process模塊中,對(duì)于地址未命中讀操作和地址未命中且需要從DDR讀數(shù)據(jù)回填cache line 的寫(xiě)操作,burst首地址和burst ID寫(xiě)入Address FIFO;在Write and read process模塊中,命中的寫(xiě)操作需要檢查地址是否與Address FIFO中的地址相同,若相同,則當(dāng)前操作與之前操作可能存在數(shù)據(jù)相關(guān)性[4],需要等到之前操作完成后,才開(kāi)始當(dāng)前操作。在Write and read process模塊中,地址命中的讀操作,需要檢查當(dāng)前讀地址是否與Address FIFO中的地址相同,若相同,則當(dāng)前操作與之前操作可能存在數(shù)據(jù)相關(guān)性,需要等到之前操作完成后才開(kāi)始當(dāng)前讀操作,此外還需要檢查當(dāng)前讀ID是否跟Address FIFO的讀ID相同。根據(jù)AXI總線相同ID順序執(zhí)行的要求,則應(yīng)該等到該ID的之前操作完成后,才開(kāi)始當(dāng)前讀操作。
Write and read process模塊根據(jù)地址是否命中,對(duì)讀寫(xiě)burst進(jìn)行分別處理。
為了減少對(duì)DDR的訪問(wèn),讀操作采用lookthrough機(jī)制[3,4,6]。對(duì)于地址命中的讀burst,讀命令和地址被送往Match read process模塊處理;對(duì)于地址未命中的讀burst,向AXI_GM_RD模塊發(fā)起AXI讀請(qǐng)求,將該筆讀響應(yīng)的參數(shù)寫(xiě)入PFIFO,同時(shí)將首地址寫(xiě)入Address FIFO。
為了盡快向加解密模塊返回寫(xiě)響應(yīng)信號(hào),寫(xiě)操作采用write-back機(jī)制[3,4,6]。對(duì)于地址命中的寫(xiě)burst,寫(xiě)地址、寫(xiě)數(shù)據(jù)、寫(xiě)命令送往SRAM write interface模塊處理;對(duì)于地址未命中的寫(xiě)B(tài)urst,寫(xiě)地址、寫(xiě)數(shù)據(jù)、寫(xiě)命令送往SRAM write interface模塊,若burst長(zhǎng)度小于cache line大小,為了保持cache數(shù)據(jù)和DDR數(shù)據(jù)一致,則需要從DDR讀數(shù)據(jù)回填當(dāng)前cache line,因此會(huì)向AXI_GM_RD模塊發(fā)起AXI讀請(qǐng)求,將該筆讀響應(yīng)的參數(shù)寫(xiě)入PFIFO,同時(shí)將首地址寫(xiě)入Address FIFO。每次操作,會(huì)更新CAM和LRU。
SRAM write interface用于處理寫(xiě)burst,它先將寫(xiě)數(shù)據(jù)寫(xiě)入SRAM,然后將response寫(xiě)回AXI_GS響應(yīng)通道。
GM read response process模塊根據(jù)PFIFO中的參數(shù),處理從AXI_GM_RD模塊讀回的DDR數(shù)據(jù)。若是地址未命中寫(xiě),則將從DDR讀回的數(shù)據(jù)寫(xiě)入SRAM中;若是地址未命中讀,則將從DDR讀回的數(shù)據(jù)寫(xiě)入AXI_GS響應(yīng)通道,同時(shí)將數(shù)據(jù)寫(xiě)入SRAM。
數(shù)據(jù)回收模塊采用最近最少使用(Least Recently Used,LRU)替換算法[7-9]實(shí)現(xiàn)對(duì)cache line的更新。為了避免cache滿(mǎn)時(shí),沒(méi)有可用的cache空間,導(dǎo)致流水線被阻塞,本設(shè)計(jì)在cache將滿(mǎn)未滿(mǎn)時(shí),把最久沒(méi)有訪問(wèn)過(guò)的cache line狀態(tài)清零,更新LRU矩陣和CAM狀態(tài),若該cache line 中的數(shù)據(jù)比DDR中的數(shù)據(jù)新,則讀出cache line的數(shù)據(jù)并寫(xiě)入DDR中。當(dāng)接收到Flush命令時(shí),將整個(gè)CAM的狀態(tài)復(fù)位,當(dāng)cache line的數(shù)據(jù)比DDR數(shù)據(jù)新時(shí),則讀出cache line的數(shù)據(jù)并寫(xiě)入DDR中 。
CAM[10]模塊用于查詢(xún)地址是否命中。當(dāng)?shù)刂访袝r(shí),命中標(biāo)志生效并返回當(dāng)前地址所在的cache地址;若地址未命中且cache不滿(mǎn)時(shí),命中標(biāo)志無(wú)效并返回可用的cache地址;若地址未命中且cache已滿(mǎn)時(shí),命中標(biāo)志無(wú)效并返回沒(méi)有可用cache地址的標(biāo)志。
LRU用于查找最久未被使用的cache line。本設(shè)計(jì)使用LRU矩陣算法[11]。
AXI_GM_RD用于將內(nèi)部的讀請(qǐng)求總線轉(zhuǎn)換成AXI讀地址、讀數(shù)據(jù)通道信號(hào)。
AXI_GM_WR用于將內(nèi)部的寫(xiě)請(qǐng)求總線轉(zhuǎn)換成AXI寫(xiě)地址、寫(xiě)數(shù)據(jù)以及寫(xiě)響應(yīng)通道信號(hào)。
REG_IF模塊為寄存器模塊,用于CPU配置模塊寄存器、讀取模塊狀態(tài)和調(diào)試信息。
為了提高性能,采用全流水線設(shè)計(jì)[10,12]。寫(xiě)操作處理過(guò)程包含4級(jí)流水:第1級(jí),AXI_GS將AXI總線轉(zhuǎn)化為內(nèi)部總線;第2級(jí),cam search模塊檢查地址是否命中;第3級(jí),SRAM write interface將數(shù)據(jù)寫(xiě)到SRAM并向GS response arbiter輸出寫(xiě)響應(yīng);第4級(jí),AXI_GS將內(nèi)部寫(xiě)響應(yīng)轉(zhuǎn)換成AXI寫(xiě)響應(yīng)。
地址命中的讀操作的處理過(guò)程包含4級(jí)流水:第1級(jí),AXI_GS將AXI總線轉(zhuǎn)化為內(nèi)部總線;第2級(jí),cam search模塊檢查地址是否命中;第3級(jí),match read process從SRAM讀回?cái)?shù)據(jù),并將其送往GS response arbiter;第4級(jí),AXI_GS將內(nèi)部讀響應(yīng)轉(zhuǎn)換成AXI讀響應(yīng)。
地址未命中的讀操作的處理過(guò)程又分為請(qǐng)求過(guò)程和響應(yīng)過(guò)程。請(qǐng)求過(guò)程包含4級(jí)流水:第1級(jí),AXI_GS將AXI總線轉(zhuǎn)化為內(nèi)部總線;第2級(jí),cam search模塊檢查地址是否命中;第3級(jí),write read process通過(guò)AXI_GM_RD模塊向DDR控制器發(fā)起讀請(qǐng)求;第4級(jí),AXI_GM_RD將內(nèi)部的讀請(qǐng)求轉(zhuǎn)換成AXI讀地址通道信號(hào),送給DDR控制器。響應(yīng)過(guò)程包含3級(jí)流水:第1級(jí),AXI_GM_RD將來(lái)自DDR控制器的讀數(shù)據(jù)通道信號(hào)轉(zhuǎn)換成內(nèi)部讀響應(yīng)信號(hào);第2級(jí),GM read response process將來(lái)自AXI_GM_RD模塊的讀數(shù)據(jù)寫(xiě)入SRAM,同時(shí)送往GS response arbiter;第3級(jí),AXI_GS將內(nèi)部讀響應(yīng)轉(zhuǎn)換成AXI讀響應(yīng)。
采用FIFO設(shè)計(jì),PFIFO將DDR讀請(qǐng)求和讀數(shù)據(jù)分開(kāi),可以支持Outstanding操作。Address FIFO用于存放未完成的且需要從DDR顆粒讀取數(shù)據(jù)的burst的首地址和ID,用于解決數(shù)據(jù)的相關(guān)性和AXI總線要求相同ID順序執(zhí)行的問(wèn)題。
為了簡(jiǎn)化設(shè)計(jì),所有仲裁均采用固定優(yōu)先級(jí)算法[11,13]。
數(shù)據(jù)回收與數(shù)據(jù)讀寫(xiě)相互獨(dú)立,并行完成。當(dāng)正在被回收的對(duì)象又被重新訪問(wèn)時(shí),完成回收后,cam的狀態(tài)不被清除。
如圖2所示,預(yù)讀檢測(cè)利用DMA和數(shù)據(jù)整形模塊的延遲(通常幾十個(gè)周期),提早發(fā)起對(duì)DDR的讀操作,讀回的數(shù)據(jù)存放于cache中,這樣抵消了DDR訪問(wèn)延遲對(duì)加解密模塊的影響。該模塊易于實(shí)現(xiàn)且硬件開(kāi)銷(xiāo)不大。
當(dāng)包序號(hào)連續(xù)時(shí),由于IV數(shù)據(jù)的存儲(chǔ)地址是由包序號(hào)索引,相鄰的級(jí)聯(lián)包的IV數(shù)據(jù)存儲(chǔ)地址連續(xù),因此IV數(shù)據(jù)具有空間局部性。當(dāng)多包級(jí)聯(lián)時(shí),由于更新包和結(jié)束包與初始包有相同的IV地址和密鑰地址,因此密鑰和IV數(shù)據(jù)具有時(shí)間局部性。由于數(shù)據(jù)的時(shí)間局部性和空間局部性,cache加速器會(huì)有較高的命中率,使得大量密鑰和IV的訪問(wèn)在cache中完成,從而有效減少DDR的訪問(wèn)次數(shù)。
本文用芯動(dòng)的DDR控制器、鎂光的DDR3仿真模型以及SYNOPSYS的VCS仿真工具,搭建了仿真環(huán)境。本文分別對(duì)不同個(gè)數(shù)的級(jí)聯(lián)包,以及包序號(hào)是否連續(xù)進(jìn)行有、無(wú)加速器的對(duì)比試驗(yàn)。IV長(zhǎng)度為16字節(jié),4個(gè)級(jí)聯(lián)包包個(gè)數(shù)分別為1,2,3,4,包序號(hào)連續(xù)時(shí),加解密模塊讀寫(xiě)IV和密鑰所需時(shí)間如表1所示,單位為時(shí)鐘周期;IV長(zhǎng)度為16字節(jié),4個(gè)級(jí)聯(lián)包包個(gè)數(shù)分別為1,2,3,4,包序號(hào)不連續(xù)時(shí),加解密模塊讀寫(xiě)IV和密鑰所需時(shí)間如表2所示,單位為時(shí)鐘周期。
表1 包序號(hào)連續(xù)的訪問(wèn)時(shí)間
表2 包序號(hào)不連續(xù)的訪問(wèn)時(shí)間
通過(guò)對(duì)比試驗(yàn),由表1、表2可知:加速器對(duì)密鑰和IV的訪問(wèn)性能有較大提高,當(dāng)包序號(hào)連續(xù)時(shí),加速器性能有80%以上的提升,當(dāng)包序號(hào)不連續(xù)時(shí),有50%以上的性能提升。
本文設(shè)計(jì)并用Verilog硬件描述語(yǔ)言實(shí)現(xiàn)了一種預(yù)讀與cache結(jié)合的DDR硬件加速器。通過(guò)對(duì)比試驗(yàn)說(shuō)明,加速器較大程度上提高了DDR的訪問(wèn)性能,且適用于安全服務(wù)器領(lǐng)域的對(duì)稱(chēng)算法密碼芯片的密鑰和IV存儲(chǔ)管理,有效地解決了片上SRAM存儲(chǔ)容量不夠,片外DDR訪問(wèn)效率低的問(wèn)題。