DDR3/4_IP核應用--vivado

 

參考資料

《pg150-ultrascale-memory-ip》

 

以該手冊的脈絡爲主線,對DDR3/4控制器進行探討。

1.IP核結構

 

 

根據官方提供的資料,IP核主要劃分爲三個部分,分別是用戶接口,內存控制器以及物理層接口。對於用戶來說,我們需要研究清楚的是用戶接口部分內容,其餘兩部分只需瞭解即可,這裏就不展開論述。

 

 

讀寫效率

X8是表示,該內存顆粒的數據總線爲8bit。常見的還有x4/x16。

 

2.讀寫時序userinterface操作

整個DDR的IP核應用,主要都是圍繞這以下幾個路徑進行,開發者直接打交道的是IP_core的userinterface。其他物理底層的內容,由IP自行完成。主要指令路徑包括:Command Path、write_Path、read_Path以及維護指令(Maintenance Commands)。

 

  • Command Path

顧名思義,就是讀寫操作指令寫入的路徑。當app_rdy與app_en都有效的時候,新的指令才能寫入命令FIFO裏,並被執行。

  • Write Path

數據內容寫入IP核的路徑。

從上述的時序圖看來,與寫入路徑相關的信號有app_adf_data、app_wdf_wren以及app_wdf_end。雖然說,寫入的數據路徑與指令路徑可以不對齊,但實際應用過程中,建議還是對齊操作,要不然容易出問題(後續調試測試的內容有提到)。

app_wdf_end爲高,表示該數據這次寫入請求的最後一個數。以上圖爲例,4:1mode是指用戶接口時鐘與物理層驅動DDR的時鐘之比爲1:4。比如用戶接口的數據總線爲64bit,物理層驅動DDR芯片位寬爲8bit ,BL=8, 在4:1mode下,那麼正好一個用戶clk可以執行完一次突發傳輸(DDR是在時鐘上升沿和下降沿都傳輸數據)。所以在執行傳輸的過程中,app_wdf_end爲高。

 

  • Read Path

數據從IP核中讀出來的路徑。

 

  • Maintenance Commands(維護指令)

這裏可以解析爲什麼讀寫效率不能夠達到百分百,由於ddr需要刷新等導致。其中啓動刷新有兩種模式,一種是自動刷新,即IP核自己產生滿足時序的刷新請求,另外一種是通過選中“啓用用戶刷新和ZQCS輸入”選項來啓用用戶模式。在此模式下,當init_calib_complete有效之後,由用戶負責發出Refresh和ZQCS命令以滿足DRAM組件規範所要求的速率。ZQCS是用於ZQ 校準,這個與ODT相關。

  • 擴展一下:

ODTOn-Die Termination),是從DDR2 SDRAM時代開始新增的功能。其允許用戶通過讀寫MR1寄存器,來控制DDR3 SDRAM中內部的終端電阻的連接或者斷開。

爲什麼要用ODT?一個DDR通道,通常會掛接多個Rank,這些Rank的數據線、地址線等等都是共用;數據信號也就依次傳遞到每個Rank,到達線路末端的時候,波形會有反射,從而影響到原始信號;因此需要加上終端電阻,吸收餘波。之前的DDR,終端電阻做在板子上,但是因爲種種原因,效果不是太好,到了DDR2,把終端電阻做到了DDR顆粒內部,也就稱爲On Die Termination,Die上的終端電阻,Die是硅片的意思,這裏也就是DDR顆粒。

所以,使用ODT的目的很簡單,是爲了讓DQS、RDQS、DQ和DM信號在終結電阻處消耗完,防止這些信號在電路上形成反射,進而增強信號完整性。

3.對IP核進行二次封裝

建議對IP核的User_interface再封裝一層,對外只需預留例如wr_en/wr_data以及rd_en/rd_data等信號,類似於讀寫FIFO的端口,提高模塊的後期複用。

 

4.調試與測試記錄

 

手冊梳理得差不多了,寫個簡單的程序仿真測試。期間碰到了些問題,分享出來記錄一下。

  •  cmd_path與write_path沒對齊。

 

圖中所示,app_rdy爲低,但是wdf_wren仍然爲高,短期的話應該沒有什麼問題,但是如果持續一段時間,必然會導致IP核中fifo被寫滿,導致異常。

 

解決辦法:

       令指令與數據路徑命令對齊。在寫入的時候,當app_rdy與app_wdf_rdy都有效的時候,才觸發相應的動作。

 

  • 數據沒有寫入,導致回讀出來的數據不對。

 

從時序上來看,寫入沒有問題。但是我當初忽略了app_wdf_mask,這個沒有賦值(正常應該賦0),導致仿真的時候,該信號一致顯示高阻態。然後發現ddr4_dm_dbi_n(雙向信號)信號異常。

讀出來的數據一直是0.

 

修改過來後,問題解決。

 

讀寫效率測試

地址模式

BL=8,Mode4:1

wr

rd

MEM_ADDR_ORDER        = "BANK_ROW_COLUMN"

 

30.11% (wr_cnt=8192,

Total_cnt= 27207

31.12%

rd_cnt=8192,

Total_cnt= 26316

MEM_ADDR_ORDER        = "ROW_COLUMN_BANK";

 

90.44%

(wr_cnt=8192,

Total_cnt= 9057

93.89%

rd_cnt=8192,

Total_cnt= 8725

從測試的結果來看,儘可能減少行地址的變化,能大大提高IP核的讀寫效率。

 

MEM_ADDR_ORDER = "BANK_ROW_COLUMN"

 

Wr:

 

 

 

Rd:

 

MEM_ADDR_ORDER        = "ROW_COLUMN_BANK";

 

Wr:

Rd:

 

仔細的話,可以觀察clk與app_rdy之間的關係,不難發現爲什麼兩者的讀寫效率會相差這麼大。不同的地址排列,在每次讀寫過程中,IP的效率有很大的關係,這個與DDR的實現機制有關。詳細情況在PG150裏有相關說明。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章