P5 Cache


一、寫在前面

P5實驗是搭建一個Cache模塊,首先應當了解,為什么在主存之外使用CacheCache發揮作用的基本邏輯是怎樣的?

  • 為什么使用Cache

    在ppt中可以了解到,無論存取指令或數據所訪問的儲存單元都趨於聚集在一個較小的連續儲存區域中,而存在比主存普遍采用的DRAM儲存器技術更快的儲存單元電路,加之其價格較高,故不難想到設置一個容量較小的高速緩存,即Cache,來存放訪問頻繁的那些程序塊和數據,從而提升讀取效率

  • Cache發揮作用的基本邏輯是怎樣的?

    要了解其原理,首先需了解一些相關術語:

    主存與Cache一次交換數據的最小單位為塊(Block),代表高速緩存與主存一次讀寫操作所能完成的數據字節數,是電路中的底層模塊之一。Tag用以保存數據所在的主存數據塊的地址,起到高速緩存與主存之間的聯系作用。對於有效位v,是為保證讀取的數據不為實驗以外的其它無關數據,故只有當tag一致且v=1的時候才判定為命中

    接下來,對於Cache作用原理,這里分讀、寫兩種情況說明:

    • 讀取數據的時候,使用tag比對,若比對成功,即Cache中存有輸入地址處的數據,則直接將對應的數據輸出(不訪問主存);若沒有命中,即前往主存讀取數據(數據保證主存中一定存有目前讀入的數據),通過傳輸hit信號實現。

      為了體現主存訪問與Cache訪問的時間差異,題目要求:當讀取且沒命中時,先暫停五個周期(RAM輸出stop信號),在第六個周期時再執行這條指令。在第六個周期時,輸出數據並將數據寫入Cache(根據LRU替換策略,按照順位更新計數器最大的Block)。注意此處應當輸出從主存里讀到的數據,因為Cache的寫入需要一個周期,此時目標塊的輸出數據還未更新(即hit=0、Cache_dataout=0、stop=0)。

      一種輸出的可行搭建方式如下:

    • 寫入數據的時候,實現RAMCache的同步寫入。

      對於RAM而言,若命中,則更新命中塊中的數據;若不命中則不更新任何塊內的數據

    到現在,Cache在哪里節約了訪問時間便清晰了:當Cache命中且不為寫入狀態,就不會訪問RAM進行數據操作,從而達到了使用Cache的初衷。

  • 組相連與本實驗采用的Cache規格

    題目要求模擬四路組相聯的Cache,那么組相連是什么?規格如何計算得來?

    • 組相連

      組相連映射是直接映射和全相聯映射的折衷。直接映射指主存中的每一塊都固定映射到Cache中的一塊,全相聯指主存中的塊可以映射到Cache中的任意一塊。那么,對於組相聯而言,主存與Cache划分為相同數量的組數,主存中的組與Cache中的組一一對應,且主存中的塊可以映射到Cache對應組中的任意一塊,兼顧了實現成本和靈活性。

      或許結合圖看會更易於理解:https://zhuanlan.zhihu.com/p/102293437

    • Cache規格分析

      題目中說明:RAM大小為4K,Cache大小為256B,每一個Block為16B。那么題目中說的:Cache中一組有4塊,RAM中一組有64塊如何算得?(2^10 =1K、2^20 =1M)

      由於Logisim軟件中一根線的最大位寬為32位(4B),而CacheRAM以塊為單位進行數據交換的,按照規格要求,每一個Block為16B,故在傳輸數據時需要四根線的位寬,這也是Block存放了128位二進制數的原因(按一定順序存放,這里采用從高位到低位的存放方式)。

      Cache的組數為:總容量 /(Block大小 × 每組包含的塊數)

      RAM每組的塊數為:總容量 /(Block大小 × 通過Cache計算得到的組數)

      總而言之,總容量=每個Block的大小×塊數×組數,知二求一即可。

      P.S.對於Cache中每組包含塊的個數,不能通過規格計算出來,題目會做出規定。

      一個ppt上的例子:

    • 組內塊地址、組地址與塊內地址的使用

      組內塊地址一般采用:主存地址 - 組地址(組數決定)- 組內地址(Block容量決定)得到。

      組內塊地址即為tag,用以判斷命中;組地址決定訪問CacheRAM中哪一個組;組內地址決定訪問塊中那根線的數據。

      由於實驗采用的一根線的位寬為32位,故組內地址末兩位一定為0,為操作方便,采用的輸入地址的分線方式如下:

      此處需注意:塊內地址偏移方向為從數據低位到數據高位,若采用從高位到低位的數據存放方式,數據輸出時應進行反轉

二、一些具體模塊的說明

由於模塊層層嵌套,故建議讀者自底向上搭建模塊,如先從BlockLRU開始搭建。

  • LRU

    LRU模塊的邏輯通過此模塊的名字就可以知曉大部分,就是通過每個Block對應的Counter和它們的命中情況來判斷是否需要更新某個Block的數據,其中,Block對應的Counter計算的是此Block距離最近一次數據訪問過了多少個周期,計數器的數字越大,說明此Block距離最近一次數據訪問過得時間越長,更新時會找到數據最大的一個Block進行更新。在計數器都相等的情況下,我們規定數據更新的順序為1→2→3→4。

    ——指導書

    是否命中 是否寫入 LRU模塊操作
    命中 寫入 更新命中的模塊
    命中 不寫入 不更新數據
    未命中 寫入 不更新數據
    未命中 不寫入 按照順位更新計數器最大的Block

    根據表格可以知道,LRU會在兩種情況下輸出使能型號,使塊內數據更新:①寫入數據時,若命中則更新對應塊中的數據;②讀取數據時,若沒有命中,則將從主存中讀取的數據按照上述規則存入高速緩存中。

    為實現Counter數值的比較,可采用類似冒泡排序的方法把最大值依次浮動到最上層。

    注意:①若使能信號為0,則4個輸出信號全為0;②提交測評的時候需要apperance與題目所給圖完全一致

  • Counter

    這個模塊的計數其實就是為上述LRU模塊的操作服務,使用logisim自帶的計數器即可。

    計數器歸零時,有三種情況,一是進行了復位操作,二是在讀取時發現命中了,三是都沒有命中即將按順位更新對應的Block數據,這樣就可以表明此Block距離最近一次數據訪問過了多少個周期。其中,只有復位操作可以不在時鍾上升沿進行。——指導書

    注意最后一句話,由於reset是異步復位的,但是其余情況的清零卻要求同步,故不能把相關信號接到Counterreset端,而應通過載入一個0的方式使計數器清0。此外應注意當Countercount端為1且load端為1時進行的是計數減一,而非載入操作,故應當將清零情況取反,接到Counter使能端,確保清零的正常進行。

    綜合第二、三種情況來看,第三種情況只在讀取的時候發生,故計數器清零操作只在讀取的時候進行。那么第二、三種情況能否僅用LRU輸出的使能信號囊括呢?需知讀入時命中並不需要更新數據塊,故LRU不會輸出使能信號,而此時卻應當更新Counter,故不能合並。為排除LRU於寫入時輸出的使能信號對計數的干擾(此時計數值均保持不變),結合前面對清零操作只在讀取的時候進行的分析,需將memread信號放入Counter的使能端。

    說了這么多,具體這么搭呢?可參照下圖:

  • stop & en(對於Group

    stop是對除RAM以外所有操作的暫停;en是根據地址譯碼出的使能信號

    對於Group而言,這兩個信號起的作用並無差異,而綜合全過程來看,真正的enable信號是將二者並起來的結果

    而對於組內輸出的hit信號,不應該加上stop信號,否則沒有輸出。因為只有hit變為1,stop才可以變為0,加上stop后相當於鎖住了。

三、測試

不建議面向評測機debug,可以把自己搭建的Cache放入單周期CPU里替換原本的RAM,然后把Stop信號取反接到PC寄存器的使能上。之后添加一系列存取指令,可通過觀察讀取指令輸出的數據是否正確、組的划分是否正確、組內通過LRU分配的行是否正確、塊內的四條線是否選擇正確等進行debug。

具體的測試數據可參看這位大佬給的數據:https://blog.csdn.net/u012928469/article/details/121723341


感謝觀看!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM