---
# System prepended metadata

title: '[SoC Lab] LabD Design Thoughts'
tags: [系統晶片設計實驗]

---

# [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)



