# [SoC Lab] LabD Design Thoughts ## Lab說明 LabD作為SoC Lab的額外作業,希望在現有的框架上,將原先與CPU互動的BRAM改為SDRAM(這部分已經由助教的sample code完成),而我們要做的事,是針對已經建構好的pipeline進行改動,讓SDRAM擁有像是prefetch等的功能,並且觀察有沒有prefetch使否會對原先的pipeline造成影響。 ![image](https://hackmd.io/_uploads/HkjmAC8LT.png) 這個作業有趣之處在於,原先使用的BRAM的控制方式及dataflow相對簡單容易理解,因此使用起來不會有太大問題,但是SDRAM由於需要一個controller作為CPU與SDRAM的中繼介面,因此不論是控制訊號還是data的流動都較BRAM複雜不少,此外,這次作業使用實際業界記憶體廠Micron的SDRAM behavioral model進行實作,可以了解實際的SDRAM的運作方式,因此是很有意思的一次實作經驗。 ## 設計思路 prefetch的目的在於,在一個read訊號傳入時,一次性取得多筆相鄰資,在頻繁取用位址相鄰的資料時,可以減少總體需要的cycle數量,因此,我們必須做的便是針對controller的行為進行更動,在第一次拿取的時候便啟動prefetch,一次拿取相鄰位址的N筆資料(在本次實作中,N設為8)並存於buffer中,在接下來的N-1比read指令中,若讀取的位址與buffer中的資料相符合,便將buffer中的資料直接回傳,總的來說,prefetch的第一筆資料會使用很多的cycle,但接下來的read指令便可以大幅縮短等待SDRAM回傳資料以及SDRAM controller傳遞資料的時間。 實作的方式是更改SDRAM controller的finite state machine,讓他可以一次重複性的獲取N筆資料,當然,這之間還有bank得問題必須處裡,若是資料位於不同的bank,是無法直接讀取的,需要從activate開始重新走一次讀取流程。 而之後的read指令傳入時,會優先比對address是否存在於buffer中,若有相符的entry,則由SDRAM controller直接回傳ACK以及data,就不需要再透過整套的read流程獲取資料。 ![image](https://hackmd.io/_uploads/ByofDyv8a.png)