羅 平,王瑞雪,覃海洋
(重慶大學城市科技學院 電氣信息學院,重慶 402167)
芯片IP核內部可能有多個訪存通路,同步高效地控制多個協議完成對內存的安全讀寫變得愈加重要。嵌入式CPU大都采用簡單優先級反轉仲裁或固定優先級仲裁算法來完成對多協議訪存請求仲裁,即按固定的規律來對內存訪問請求進行仲裁[1],這種方法很容易導致緊急的訪存請求被阻塞或者某一個協議請求一直無法得到及時響應,這極大降低了CPU的訪存效率。雖然一些仲裁器采用了動態優先級調整算法,即根據主設備訪問不同從設備,調整自身的優先級,以提高總線的傳輸效率,但其本質上還是一種固定優先級[2]。同時,雖然大多數CPU有采用內存保護功能來防止非法用戶讀寫內存數據,但是數據依然有被讀出的可能性,傳統的保護方法著重于防止數據被讀出,但是一旦數據被非法獲得,數據內容將是明文呈現給非法用戶[3]。
基于這類實際問題,本文設計并實現了一種能夠飽和仲裁控制多協議對CPU內存單元進行高效偽隨機加解密讀寫的數字電路。
整個設計主要包含同步邏輯,仲裁邏輯,加密邏輯,自定義訪存邏輯,圖1是系統整體框架。
如圖1所示,訪存協議0和訪存協議1均對內存有讀寫需求,訪存協議0來自于時鐘域0,訪存協議1和內存都處于時鐘域1。同步握手協議模塊用于在兩個協議同時發起請求時,將訪存協議0的請求同步到時鐘域1來;飽和仲裁模塊可對訪存協議0和訪存協議1的訪存請求進行飽和仲裁,根據仲裁結果對某個協議進行訪問授權;LFSR(linear feedback shifter register)偽隨機加密發生器[4]、POLY和地址提取模塊完成對訪存讀寫數據進行加解密操作;自定義訪存協議模塊實現對內存的直接讀寫訪存;所模塊功能均在狀態機的控制下實現。

圖1 系統整體框架
因為在本次設計中,協議0和協議1分別屬于兩個時鐘域,所以訪存請求也來自于不同的時鐘域,為了消除可能出現的競爭冒險現象,需要對其進行同步,同時為了正確的傳輸控制請求信號,采用握手協議。跨時鐘域握手協議如圖2所示。

圖2 跨時鐘域握手協議
協議0處在時鐘域0,協議1與內存控制邏輯均處在時鐘域1。因此,為了保證協議0訪存請求的正確性,先要將在時鐘域0的協議0同步到時鐘域1,采用兩級寄存器打拍進行,具體的做法是用另一邊的時鐘去捕捉對面時鐘域的請求信號,通過使用兩級寄存器來減小亞穩態發生的幾率,以實現將兩個請求信號同步到一個時鐘域進行處理。當時鐘域1捕捉到協議0的請求req后,將響應信號ack傳回時鐘域0,此時也采用兩級寄存器打拍進行同步,當時鐘0域捕捉到響應信號后,方可釋放請求信號,這樣既可以抑制亞穩態的傳輸,又可以正確地傳輸控制信號。
對于CPU訪存過程,一個優秀的仲裁算法,當具有一定的預測能力,如此才能更加精準高效給出總線控制權。當協議0和協議1同時請求內存訪問時,因為內存訪問操作都具有連續性,若采用傳統的仲裁算法,會導致協議0和協議1的訪存操作在中途被對方頻繁打斷,相互阻塞,會嚴重地降低CPU的執行效率[5]。所以基于此現象,提出了飽和仲裁算法進行優先級仲裁。飽和仲裁器包含一個飽和計數器,其為一種有4個狀態的2位飽和計數器,可分為協議0弱執行(P=2′b01)、協議0強執行(P=2′b00)、協議1弱執行(P=2′b10)、協議1強執行(P=2′b11)這4種狀態,當一個訪存請求被執行,對應的狀態機被修改。請求不執行,則向“弱執行”方向降低狀態值;如果請求被執行,則向“強執行”方向提高狀態值。這種方法的特點是,某一個訪存請求必須連續兩次不被執行,才能從強狀態翻轉,從而改變執行狀態。飽和仲裁算法如圖3所示。

圖3 飽和仲裁算法
若上電復位處于協議0弱執行狀態(P=2′b01),此時,只要協議0請求(Req0=1′b1)到來,則必選擇執行協議0請求,且由協議0弱執行狀態跳轉為協議0強執行狀態(P=2′b00)。處于協議0強執行狀態時,只要協議0請求到來,則必選擇執行協議0請求,并維持執行狀態機不變;若此時只有協議1請求((Req0=1′b0)&(Req1=1′b1))到來,則選擇執行協議1請求,且狀態由0強執行狀態跳轉為0弱執行狀態,可以此類推其它剩余狀態。通過簡單推算,以傳統的輪詢算法作比較,假定A和B協議每次連續訪存操作次數相等,那么采用飽和此仲裁算法,CPU的訪存效率為傳統輪詢算法的兩倍;以固定優先級算法作比較,假定A的優先級高于B的優先級,且A是B協議每次連續訪存操作次數的兩倍,在最佳情況下,采用此飽和仲裁算法,CPU的訪存效率為固定優先級算法的3倍。由此可見,由于CPU訪存具有連續性,此飽和仲裁算法正是利用這一特點進行預測仲裁,這是它的核心所在[6]。
主流的加密算法(如RSA,MD5,DES等),安全性能較高,但是對于通用型數字SOC芯片而言,若集成此類IP,會加大芯片成本和復雜度[7]。因此,為了保護內存中的數據和代碼,可采用偽隨機加密算法對其進行加密。因為CPU訪存與地址強相關,所以利用地址作為種子的偽隨機加解密算法為較好的選擇。如圖4所示。

圖4 加解密框架
先對地址進行鎖存和不規則的變換處理,然后使用LFSR偽隨機序列產生器產生偽隨機數,LFSR即是線性反饋移位寄存器,由移位寄存器和組合邏輯反饋組成,給定前一狀態的輸出,將該輸出的線性函數再用作輸入的移位寄存器。在數字電路實現中,一個n階的LFSR由n個D觸發器和若干個異或門組成,為便于設計,此設計中采用EE型LFSR,其多項式如式(1)所示
G(x)=gmxm+gm-1xm-1+…g1x+g0
(1)
與公式所對應的數字電路如圖5所示。

圖5 LFSR多項式電路
其中gm為反饋系數,取值只能為0或者1,取為0時表明不存在該反饋電路,取為1時表明存在該反饋電路,g0恒為1。由此可知,LFSR需要多個時鐘周期的移位才能產生偽隨機序列,若按此進行設計,會極大降低CPU的訪存效率。因此,在此設計中,為了保證訪存效率,可將Dm~D0設定為固定值,而將變換后的地址代替其直接作為輸入,一個周期后從Qm~Q0得到輸出,而地址會時刻變化且內部進行變換,這樣的話,既保證了數據的隨機性,又保證了數據在一個時鐘周期內加解密完成,然后用產生的偽隨機序列與可配置的二項式POLY相加,將得到的結果與讀寫數據進行異或操作,從而實現對內存單元內數據的加密寫入和解密讀出,其中POLY為一個可配置寄存器值,這樣的話,用戶可根據需求,隨時微調加密算法,極大地保護內存數據的安全[8]。例如,若數據和訪存地址均為32位,初始Dm~D0設為32′h87654321,訪存地址變換后為32′h75318642,那么與之所對應的偽隨機數列輸出為32′hf254c563,POLY設為32′h92413,非加密數據為32′h80,那么加密后的數據應為32′hf25de9f6。由此可見,將訪存地址和偽隨機數列強相關起來,且修改LFSR的用法,可以實現在一個時鐘周期內完成對內存數據的高效加解密。
圖6為自定義內存訪問協議,其特性包括:寫為單周期,讀為雙周期;無需等待周期或回應信號;支持字節寫入;控制信號簡單。

圖6 自定義寄存器配置協議
clk為自定義協議時鐘,上升沿有效。sel為讀寫使能信號,當其為高時,內存處于可讀寫狀態。addr為訪問地址,決定讀寫內存的位置。wr為讀寫選擇信號,當其為高時,為寫操作;為低時,為讀操作。be為寫數據byte enable信號,可以控制其完成對字的部分寫入。wdata為寫數據,僅當wr為高時有效。rdata為讀數據,當wr為低時,讀數據在下一個周期輸出有效,這是因為內存需要一個時鐘周期來鎖存讀地址和準備數據,然后在下一個時鐘周期才能輸出數據[9]。
為了測試加密算法效果,對加密算法搭建相應的python模型進行仿真,如圖7所示。其中,圓點代表原始打算寫入數據,其值為步長為1的等差序列數據,三角形代表加密后的數據。橫坐標為要訪問的地址,縱坐標為數據值。由圖可見,以地址為種子的偽隨機加解密算法能夠高效安全地完成對原始數據的隨機加密。

圖7 加密算法仿真
完成RTL代碼設計后,編寫了Testbench、Testpattern和Tracer,并對設計進行功能性仿真。仿真過程中需要產生FSDB波形文件,然后導入波形觀測軟件[10]。仲裁邏輯電路,需要觀察兩種訪存請求發生時,是否能正確完成仲裁,部分仿真波形如圖8所示。

圖8 仲裁器仿真波形
其中,clk和rst_n分別為系統時鐘和系統復位信號;P_reg 為權重寄存器;grant_TWP表示當前仲裁結果;twp_req_keep 和cfg_req分別為協議0請求和協議1請求信號,可見其在飽和仲裁算法的控制下,高效實現了兩種協議的仲裁響應。加密邏輯電路,需要觀測原始數據是否被正確加密,部分仿真波形如圖9所示。

圖9 加密器仿真波形

圖10 自定義協議仿真波形
其中,cfg_addr為讀寫地址;cfg_rdata、cfg_wdata為讀寫數據;cfg_cmd為讀寫請求,可見在用戶自定義協議規范下能夠精準完成內存的讀寫。
本文設計并實現了一種能夠仲裁控制多協議對CPU內存單元進行高效加解密讀寫的數字IP,提出了飽和仲裁算法和以地址為種子的偽隨機加密算法,設計了自定義的訪存協議。區別于傳統訪存電路設計,該設計能夠更加高效安全地實現多協議內存訪問,且設計在55 nm SOC芯片項目中得到驗證,在CPU主頻200 MHz情況下,多協議訪存正常。依照文中設計思路,可在此基礎上擴展更多的訪存協議,以實現多協議對內存的高效安全訪問,或將設計應用于其它讀寫控制,如Flash訪問控制。同時,可以根據不同的訪存場景,修改飽和計數器的寬度,實現不同協議間優先級的彈性選擇。