?
1 引言
隨著半導體技術的發展,DSP性能不斷提高,被廣泛應用在控制,通信,家電等領域中。DSP內部核心部件ALU具有極高的處理速度,而外部存儲器的速度相對較低,存儲系統已成為制約DSP發展的一個瓶頸。本文參照計算機存儲結構,利用虛擬存儲技術,對存儲系統的結構進行了改進。在DSP中引入二級Cache存儲器結構,在較小的硬件開銷下提高了DSP的工作速度。結合高性能低功耗DSP cache設計這個項目,對兩級cache的結構和算法做了探討。
2 cache總體設計
傳統的存儲器主要由Dram組成,它的工作速度較慢,cache存儲器主要由SRAM組成。在DSP中,存儲系統可分層設計,將之分為兩部分:容量較小的cache存儲器和容量較大的主存儲器,cache中存放著和主存中一致的較常用的指令與數據。DSP執行操作時可先向速度較快的cache取指令或數據,如果不命中則再從主存取指令或數據。通過提高cache的命中率可以大大加快DSP的整體運行速度,從而緩解由存儲系統引起的瓶頸問題。
?
圖1 cache的結構及互連簡圖
基于上述原理,我們設計了DSP的cache總體結構,如圖1所示。圖中設計采用了兩級cache設計,第一級cache采用分立結構,將指令cache和數據cache分開設計,這樣CPU可以對數據和指令進行平行操作,結合DSP取址,譯碼,讀數,執行的四級流水線結構,充分提高系統效率。二級cache采用統一結構,數據和指令共用一個cache,此時可以根據程序執行的具體情況,二級cache自動平衡指令和數據間的負載,從而提高命中率。DSP若在一級cache中未找到需要的指令和數據,則可在二級cache中尋找。此結構下,一級cache找不到的數據和指令多數可在二級cache中找到,提高了整個cache系統的命中率。
增加一級cache的容量可提高命中率,但隨著cache容量增大,電路結構將變得復雜,所用的芯片面積、功耗也會加大,而且cache的訪問時間也會變長,從而影響到ALU的速度。綜合考慮速度,面積,功耗等因素,我們把一級指令cache和數據cache的容量均定為4KB。
二級cache處于一級cache和主存儲器之間,訪問時間是3到4個ALU時鐘周期,其容量一般是為一級cache的4到8倍。設計中我們將二級cache的容量為定位32KB。
3 cache的映射方式與地址結構
cache采用的映射方式通常有直接映射、關聯映射、組關聯映射三種,直接映射命中率低,容易發生抖動,關聯映射雖然命中率較高,但電路復雜,權衡電路復雜性和命中率,我們主要采用組關聯映射方法。在組關聯映射中,可將主存空間分成塊,cache空間分為組,一組包含多行,行的大小與塊的大小相等。主存中的特定塊只能映射到cache中的特定組,但可以映射到組內的不同行。若用j表示主存的塊號,i表示cache中的組號,m表示cache的總行數,當cache分為v個組,每組k個行時,存在以下關系(見公式1、2),
設計中二級cache采用4路組相聯的結構,分為共256組,每組4行,每行8個32位單元,總容量位32KB。cache的控制邏輯將存儲器地址簡單的分為三個域:標記域,組號和字。為了降低系統的功耗,采用了標記(tag)和數據體相分離的方案。為了加快訪問速度,把cache中行號相同的塊放在一個數據體中實現。這樣cache就可分為4個標記存儲器,4個數據存儲器。每個標記存儲器可放256個標記,每個數據存儲體有256行數據。地址的劃分如圖2,tag的結構見圖3。
?
圖2 二級 cache的地址劃分
?
圖3 L2 cache tag 的組成
一級指令cache和數據cache采用組關聯的結構,均分為32個組,每組4行,每行含有8個32位的單元,每個容量位4KB。一級cache的組和行與二級cache的組和行大小對應,在二級cache到指令cache和數據cache間,組之間我們采用直接映射的方式,組內用全關聯方式。這樣我們結合了組關聯的靈活與全關聯的命中率高的優點。
和二級cache相似,也把每組塊號相同的數據放在同一個數據體中,共分為4個標記存儲器,四個數據體存儲器。每個標記存儲器可放32個標記,每個數據存儲體有32行數據。對主存地址的劃分如圖4。
?
圖4 一級cache的地址劃分
tag的結構見圖5。
?
圖5 一級cache tag結構
其中,P位是數據存在位, M位是數據修改的標記位,用于寫策略的實現。
4 寫策略及cache替換算法
寫策略通常采用寫回或寫直達,采用寫回法時,僅當cache中的某行數據被替換時,才更新存儲器中相應數據。采用寫直達法時,則每次寫操作都要同時更新cache和主存儲器中的數據。
所針對的DSP處于單處理器工作模式下,考慮到整個系統的數據處理效率,設計時我們采用寫回法更新數據。寫回法中,如果一級cache中的數據發生改變而未立即寫回L2 cache和主存儲器,或者L2 cache中的數據發生改變,未立即寫回主存儲器,那么就會造成數據不一致而導致錯誤。為保證數據的一致性,在駐留于cache中的某一塊被替換之前,必須考慮它是否在cache中被修改。如果沒有修改,則cache中原來的塊就可以直接被替換掉,而不需回寫;如果修改過,則意味著對cache這一行至少執行過一次寫操作,那么在替換之前主存儲器中的數據也必須隨之做相應修改。為此我們在cache的tag中設置了修改位M,在執行回寫操作前我們均對修改位進行判斷,其值為1時表示數據被修改過,需回寫,為0則表示未修改,不進行回寫。
Cache的替換算法有很多種 ,為了提高命中率,在設計時采用了優化的LRU算法:棧鏈法[6]。棧鏈法的管理規則如下:
1) 把本次訪問的塊號與棧中保存的所有塊號進行比較。如果發現有相等的,則cache命中,本次訪問的塊號從棧頂壓入,棧內各單元的塊號依次往下移,直至與本次訪問的塊號相等的那個單元為止,再往下的單元直至棧底都不改變。
2)如果相聯比較沒有發現相等的,則cache失效。棧底單元中的塊號就是要被替換的塊號。
實現時采用四個存儲單元,每個單元兩位,用來保存當前cache組的四個塊號。首先是相聯比較,以組號為地址,從四個標記寄存器中讀取數據,和地址進行比較,然后就可以產生命中與否的信號,以及命中時相應的塊號。
5 如何根據地址在cache中找到所需要的數據
?
圖6 I cache查找數據的過程
能夠映射到cache中某一行的數據很多,那么是怎樣在cache中找到所需要的數據呢?主要是借助于標記。以 I cache 為例,當CPU發出讀信號時,則首先以組號PA[7:3]為地址,從I cache的四組標記寄存器中讀取標記,送往對應的比較器,和地址信號PA[31:8]進行比較,如果比較相等,且存在位有效,則表示命中。HIT1表示第1組命中,依次類推。HIT1 ,HIT2,HIT3,HIT4經過或門以后,就是總體命中與否的輸出信號。如果HIT1有效,以PA[7:0]對cache的數據體1進行尋址,讀取相應的數據。其它情況類似。在這個過程中,可以看出,地址和數據之間的一一對應關系。
6 數據塊傳輸
數據塊傳輸是對存儲器的一種重要操作,根據譯碼電路的層次性,知道如果只是地址的低位發生改變,譯碼電路很快就可以達到穩定狀態,選擇對應的單元,進行讀寫。因此對數據進行整組傳輸,有利于提高傳輸的效率。在該cache中,對存儲器的訪問都是定長的,如果產生不命中的信號,則立即產生8拍定長的讀寫信號。具體實現時,設計了一個控制塊傳輸信號的模塊。每當產生不命中的信號,則把塊傳輸的初始地址讀入到該模塊的初始地址寄存器,設置相應的傳輸單元數為8,以及對應的cache單元的讀寫信號。在每個時鐘的上升沿,地址寄存器增1,傳輸單元個數寄存器減1,當傳輸單元個數寄存器的數據為0時,就結束傳輸。
由于L2 cache是個單端口的存儲器,一級cache采用哈佛結構,對數據和指令同時進行操作,當D cache和I cache失效時,都會訪問L2 cache,這樣就有可能產生沖突。為了解決這個問題,在塊傳輸控制的模塊中,設置了一位busy位,用來標志總線忙狀態。當某個請求得到響應,其余的請求只有進入等待狀態。在設計時,制定了訪問L2 cache的優先級協議:讀指令不命中的優先級最高,寫數據不命中的優先級次之,讀數據不命中的優先級最低。當I cache和D cache同時產生不命中的信號時,根據優先級協議來訪問L2 cache。
7 結束語
在命中率方面,采用兩級cache結構及組關聯映射方法提高了cache系統的命中率。在數據處理效率方面,由于一級cache采用哈佛結構,指令和數據可并行操作,顯著提高了系統的數據處理能力。在功耗方面,采用了數據體和標記相分離的措施,這使得只有在cache命中的情況下,才會訪問數據體,可降低系統的功耗。
整個設計采用自頂向下的設計流程,用Verilog語言描述整個系統,在synopsys工具下進行仿真和綜合。在綜合的結果中,指令cache的延遲最長,為4.3ns.整個cache系統的等效門數約24萬個門。
評論
查看更多