羅 平,王瑞雪,覃海洋
(重慶大學(xué)城市科技學(xué)院 電氣信息學(xué)院,重慶 402167)
芯片IP核內(nèi)部可能有多個訪存通路,同步高效地控制多個協(xié)議完成對內(nèi)存的安全讀寫變得愈加重要。嵌入式CPU大都采用簡單優(yōu)先級反轉(zhuǎn)仲裁或固定優(yōu)先級仲裁算法來完成對多協(xié)議訪存請求仲裁,即按固定的規(guī)律來對內(nèi)存訪問請求進行仲裁[1],這種方法很容易導(dǎo)致緊急的訪存請求被阻塞或者某一個協(xié)議請求一直無法得到及時響應(yīng),這極大降低了CPU的訪存效率。雖然一些仲裁器采用了動態(tài)優(yōu)先級調(diào)整算法,即根據(jù)主設(shè)備訪問不同從設(shè)備,調(diào)整自身的優(yōu)先級,以提高總線的傳輸效率,但其本質(zhì)上還是一種固定優(yōu)先級[2]。同時,雖然大多數(shù)CPU有采用內(nèi)存保護功能來防止非法用戶讀寫內(nèi)存數(shù)據(jù),但是數(shù)據(jù)依然有被讀出的可能性,傳統(tǒng)的保護方法著重于防止數(shù)據(jù)被讀出,但是一旦數(shù)據(jù)被非法獲得,數(shù)據(jù)內(nèi)容將是明文呈現(xiàn)給非法用戶[3]。
基于這類實際問題,本文設(shè)計并實現(xiàn)了一種能夠飽和仲裁控制多協(xié)議對CPU內(nèi)存單元進行高效偽隨機加解密讀寫的數(shù)字電路。
整個設(shè)計主要包含同步邏輯,仲裁邏輯,加密邏輯,自定義訪存邏輯,圖1是系統(tǒng)整體框架。
如圖1所示,訪存協(xié)議0和訪存協(xié)議1均對內(nèi)存有讀寫需求,訪存協(xié)議0來自于時鐘域0,訪存協(xié)議1和內(nèi)存都處于時鐘域1。同步握手協(xié)議模塊用于在兩個協(xié)議同時發(fā)起請求時,將訪存協(xié)議0的請求同步到時鐘域1來;飽和仲裁模塊可對訪存協(xié)議0和訪存協(xié)議1的訪存請求進行飽和仲裁,根據(jù)仲裁結(jié)果對某個協(xié)議進行訪問授權(quán);LFSR(linear feedback shifter register)偽隨機加密發(fā)生器[4]、POLY和地址提取模塊完成對訪存讀寫數(shù)據(jù)進行加解密操作;自定義訪存協(xié)議模塊實現(xiàn)對內(nèi)存的直接讀寫訪存;所模塊功能均在狀態(tài)機的控制下實現(xiàn)。
圖1 系統(tǒng)整體框架
因為在本次設(shè)計中,協(xié)議0和協(xié)議1分別屬于兩個時鐘域,所以訪存請求也來自于不同的時鐘域,為了消除可能出現(xiàn)的競爭冒險現(xiàn)象,需要對其進行同步,同時為了正確的傳輸控制請求信號,采用握手協(xié)議。跨時鐘域握手協(xié)議如圖2所示。
圖2 跨時鐘域握手協(xié)議
協(xié)議0處在時鐘域0,協(xié)議1與內(nèi)存控制邏輯均處在時鐘域1。因此,為了保證協(xié)議0訪存請求的正確性,先要將在時鐘域0的協(xié)議0同步到時鐘域1,采用兩級寄存器打拍進行,具體的做法是用另一邊的時鐘去捕捉對面時鐘域的請求信號,通過使用兩級寄存器來減小亞穩(wěn)態(tài)發(fā)生的幾率,以實現(xiàn)將兩個請求信號同步到一個時鐘域進行處理。當(dāng)時鐘域1捕捉到協(xié)議0的請求req后,將響應(yīng)信號ack傳回時鐘域0,此時也采用兩級寄存器打拍進行同步,當(dāng)時鐘0域捕捉到響應(yīng)信號后,方可釋放請求信號,這樣既可以抑制亞穩(wěn)態(tài)的傳輸,又可以正確地傳輸控制信號。
對于CPU訪存過程,一個優(yōu)秀的仲裁算法,當(dāng)具有一定的預(yù)測能力,如此才能更加精準高效給出總線控制權(quán)。當(dāng)協(xié)議0和協(xié)議1同時請求內(nèi)存訪問時,因為內(nèi)存訪問操作都具有連續(xù)性,若采用傳統(tǒng)的仲裁算法,會導(dǎo)致協(xié)議0和協(xié)議1的訪存操作在中途被對方頻繁打斷,相互阻塞,會嚴重地降低CPU的執(zhí)行效率[5]。所以基于此現(xiàn)象,提出了飽和仲裁算法進行優(yōu)先級仲裁。飽和仲裁器包含一個飽和計數(shù)器,其為一種有4個狀態(tài)的2位飽和計數(shù)器,可分為協(xié)議0弱執(zhí)行(P=2′b01)、協(xié)議0強執(zhí)行(P=2′b00)、協(xié)議1弱執(zhí)行(P=2′b10)、協(xié)議1強執(zhí)行(P=2′b11)這4種狀態(tài),當(dāng)一個訪存請求被執(zhí)行,對應(yīng)的狀態(tài)機被修改。請求不執(zhí)行,則向“弱執(zhí)行”方向降低狀態(tài)值;如果請求被執(zhí)行,則向“強執(zhí)行”方向提高狀態(tài)值。這種方法的特點是,某一個訪存請求必須連續(xù)兩次不被執(zhí)行,才能從強狀態(tài)翻轉(zhuǎn),從而改變執(zhí)行狀態(tài)。飽和仲裁算法如圖3所示。
圖3 飽和仲裁算法
若上電復(fù)位處于協(xié)議0弱執(zhí)行狀態(tài)(P=2′b01),此時,只要協(xié)議0請求(Req0=1′b1)到來,則必選擇執(zhí)行協(xié)議0請求,且由協(xié)議0弱執(zhí)行狀態(tài)跳轉(zhuǎn)為協(xié)議0強執(zhí)行狀態(tài)(P=2′b00)。處于協(xié)議0強執(zhí)行狀態(tài)時,只要協(xié)議0請求到來,則必選擇執(zhí)行協(xié)議0請求,并維持執(zhí)行狀態(tài)機不變;若此時只有協(xié)議1請求((Req0=1′b0)&(Req1=1′b1))到來,則選擇執(zhí)行協(xié)議1請求,且狀態(tài)由0強執(zhí)行狀態(tài)跳轉(zhuǎn)為0弱執(zhí)行狀態(tài),可以此類推其它剩余狀態(tài)。通過簡單推算,以傳統(tǒng)的輪詢算法作比較,假定A和B協(xié)議每次連續(xù)訪存操作次數(shù)相等,那么采用飽和此仲裁算法,CPU的訪存效率為傳統(tǒng)輪詢算法的兩倍;以固定優(yōu)先級算法作比較,假定A的優(yōu)先級高于B的優(yōu)先級,且A是B協(xié)議每次連續(xù)訪存操作次數(shù)的兩倍,在最佳情況下,采用此飽和仲裁算法,CPU的訪存效率為固定優(yōu)先級算法的3倍。由此可見,由于CPU訪存具有連續(xù)性,此飽和仲裁算法正是利用這一特點進行預(yù)測仲裁,這是它的核心所在[6]。
主流的加密算法(如RSA,MD5,DES等),安全性能較高,但是對于通用型數(shù)字SOC芯片而言,若集成此類IP,會加大芯片成本和復(fù)雜度[7]。因此,為了保護內(nèi)存中的數(shù)據(jù)和代碼,可采用偽隨機加密算法對其進行加密。因為CPU訪存與地址強相關(guān),所以利用地址作為種子的偽隨機加解密算法為較好的選擇。如圖4所示。
圖4 加解密框架
先對地址進行鎖存和不規(guī)則的變換處理,然后使用LFSR偽隨機序列產(chǎn)生器產(chǎn)生偽隨機數(shù),LFSR即是線性反饋移位寄存器,由移位寄存器和組合邏輯反饋組成,給定前一狀態(tài)的輸出,將該輸出的線性函數(shù)再用作輸入的移位寄存器。在數(shù)字電路實現(xiàn)中,一個n階的LFSR由n個D觸發(fā)器和若干個異或門組成,為便于設(shè)計,此設(shè)計中采用EE型LFSR,其多項式如式(1)所示
G(x)=gmxm+gm-1xm-1+…g1x+g0
(1)
與公式所對應(yīng)的數(shù)字電路如圖5所示。
圖5 LFSR多項式電路
其中g(shù)m為反饋系數(shù),取值只能為0或者1,取為0時表明不存在該反饋電路,取為1時表明存在該反饋電路,g0恒為1。由此可知,LFSR需要多個時鐘周期的移位才能產(chǎn)生偽隨機序列,若按此進行設(shè)計,會極大降低CPU的訪存效率。因此,在此設(shè)計中,為了保證訪存效率,可將Dm~D0設(shè)定為固定值,而將變換后的地址代替其直接作為輸入,一個周期后從Qm~Q0得到輸出,而地址會時刻變化且內(nèi)部進行變換,這樣的話,既保證了數(shù)據(jù)的隨機性,又保證了數(shù)據(jù)在一個時鐘周期內(nèi)加解密完成,然后用產(chǎn)生的偽隨機序列與可配置的二項式POLY相加,將得到的結(jié)果與讀寫數(shù)據(jù)進行異或操作,從而實現(xiàn)對內(nèi)存單元內(nèi)數(shù)據(jù)的加密寫入和解密讀出,其中POLY為一個可配置寄存器值,這樣的話,用戶可根據(jù)需求,隨時微調(diào)加密算法,極大地保護內(nèi)存數(shù)據(jù)的安全[8]。例如,若數(shù)據(jù)和訪存地址均為32位,初始Dm~D0設(shè)為32′h87654321,訪存地址變換后為32′h75318642,那么與之所對應(yīng)的偽隨機數(shù)列輸出為32′hf254c563,POLY設(shè)為32′h92413,非加密數(shù)據(jù)為32′h80,那么加密后的數(shù)據(jù)應(yīng)為32′hf25de9f6。由此可見,將訪存地址和偽隨機數(shù)列強相關(guān)起來,且修改LFSR的用法,可以實現(xiàn)在一個時鐘周期內(nèi)完成對內(nèi)存數(shù)據(jù)的高效加解密。
圖6為自定義內(nèi)存訪問協(xié)議,其特性包括:寫為單周期,讀為雙周期;無需等待周期或回應(yīng)信號;支持字節(jié)寫入;控制信號簡單。
圖6 自定義寄存器配置協(xié)議
clk為自定義協(xié)議時鐘,上升沿有效。sel為讀寫使能信號,當(dāng)其為高時,內(nèi)存處于可讀寫狀態(tài)。addr為訪問地址,決定讀寫內(nèi)存的位置。wr為讀寫選擇信號,當(dāng)其為高時,為寫操作;為低時,為讀操作。be為寫數(shù)據(jù)byte enable信號,可以控制其完成對字的部分寫入。wdata為寫數(shù)據(jù),僅當(dāng)wr為高時有效。rdata為讀數(shù)據(jù),當(dāng)wr為低時,讀數(shù)據(jù)在下一個周期輸出有效,這是因為內(nèi)存需要一個時鐘周期來鎖存讀地址和準備數(shù)據(jù),然后在下一個時鐘周期才能輸出數(shù)據(jù)[9]。
為了測試加密算法效果,對加密算法搭建相應(yīng)的python模型進行仿真,如圖7所示。其中,圓點代表原始打算寫入數(shù)據(jù),其值為步長為1的等差序列數(shù)據(jù),三角形代表加密后的數(shù)據(jù)。橫坐標(biāo)為要訪問的地址,縱坐標(biāo)為數(shù)據(jù)值。由圖可見,以地址為種子的偽隨機加解密算法能夠高效安全地完成對原始數(shù)據(jù)的隨機加密。
圖7 加密算法仿真
完成RTL代碼設(shè)計后,編寫了Testbench、Testpattern和Tracer,并對設(shè)計進行功能性仿真。仿真過程中需要產(chǎn)生FSDB波形文件,然后導(dǎo)入波形觀測軟件[10]。仲裁邏輯電路,需要觀察兩種訪存請求發(fā)生時,是否能正確完成仲裁,部分仿真波形如圖8所示。
圖8 仲裁器仿真波形
其中,clk和rst_n分別為系統(tǒng)時鐘和系統(tǒng)復(fù)位信號;P_reg 為權(quán)重寄存器;grant_TWP表示當(dāng)前仲裁結(jié)果;twp_req_keep 和cfg_req分別為協(xié)議0請求和協(xié)議1請求信號,可見其在飽和仲裁算法的控制下,高效實現(xiàn)了兩種協(xié)議的仲裁響應(yīng)。加密邏輯電路,需要觀測原始數(shù)據(jù)是否被正確加密,部分仿真波形如圖9所示。
圖9 加密器仿真波形
圖10 自定義協(xié)議仿真波形
其中,cfg_addr為讀寫地址;cfg_rdata、cfg_wdata為讀寫數(shù)據(jù);cfg_cmd為讀寫請求,可見在用戶自定義協(xié)議規(guī)范下能夠精準完成內(nèi)存的讀寫。
本文設(shè)計并實現(xiàn)了一種能夠仲裁控制多協(xié)議對CPU內(nèi)存單元進行高效加解密讀寫的數(shù)字IP,提出了飽和仲裁算法和以地址為種子的偽隨機加密算法,設(shè)計了自定義的訪存協(xié)議。區(qū)別于傳統(tǒng)訪存電路設(shè)計,該設(shè)計能夠更加高效安全地實現(xiàn)多協(xié)議內(nèi)存訪問,且設(shè)計在55 nm SOC芯片項目中得到驗證,在CPU主頻200 MHz情況下,多協(xié)議訪存正常。依照文中設(shè)計思路,可在此基礎(chǔ)上擴展更多的訪存協(xié)議,以實現(xiàn)多協(xié)議對內(nèi)存的高效安全訪問,或?qū)⒃O(shè)計應(yīng)用于其它讀寫控制,如Flash訪問控制。同時,可以根據(jù)不同的訪存場景,修改飽和計數(shù)器的寬度,實現(xiàn)不同協(xié)議間優(yōu)先級的彈性選擇。