Xilinx 徽標

Xilinx DDR2 MIG 7 性能評估指南

Xilinx_DDR2_MIG_7_性能評估產品

重要提示: 提供此可下載的答复記錄 PDF 是為了增強其可用性和可讀性。 請務必注意,答复記錄是 Web- 基於內容,隨著新信息的出現而頻繁更新。 提醒您訪問 Xilinx 技術支持 Web站點和重新view (Xilinx 答复 63234) 以獲取此答复的最新版本。

介紹

由於 DDR2 和 DDR3 內存的架構方式以及 MIG 7 系列控制器的設計方式,性能並不直接。
它需要了解各種 Jedec 時序參數和控制器架構,並且您需要運行仿真以獲得估計值。
確定性能的一般原則是相同的,但本文檔提供了一種使用 MIG ex 獲得效率的簡單方法amp借助測試台和激勵進行設計 file附在這裡。

有效帶寬

DRAM 數據總線僅在突發讀寫期間達到接近峰值的帶寬,其開銷降低了有效數據速率。
幾個前任amp開銷是:

  • Precharge time accessing rows in the same bank (Access address not in the same row-page hit)
  • 從寫入訪問更改為讀取訪問的寫入恢復時間
  • 從讀取訪問更改為寫入訪問的總線周轉時間

Xilinx DDR2 MIG 7 性能評估-圖 28
有效帶寬 = 峰值帶寬 * 效率 

MIG 設計生成

有關 MIG IP 和 ex 的分步詳細信息,請參閱 UG586 第 1 章amp樂設計一代。
在運行 MIG 7 系列性能仿真之前,請執行以下操作以確保您的仿真環境正常。 打開 MIG examp設計並映射適當的庫,運行模擬,並確保您可以在成績單中看到“測試通過”消息。
為了演示流程,我為 xc7vx690tffg1761-2 生成了一個 MIG IP 並調用了 examp設計。
需要注意的兩件事是內存地址位和內存地址映射選擇。
對於前ample,我在內存部分下拉選項下選擇了 MT41J128M8XX-125。Xilinx DDR2 MIG-7-性能評估-fig-1

對於從圖 1 中選擇的內存部分,行 = 14,列 = 10 和組 = 3,因此 app_addr_width = 行 + 列 + 組 + 等級 = 28 Xilinx DDR2 MIG 7 性能評估-圖 2

您可以選擇 BANK_ROW_COLUMN 或 ROW BANK 列。
我已經離開了 ROW BANK Column,這是默認的地址映射。

Examp使用可綜合測試台進行設計仿真

在模擬設置下,選擇 QuestaSim/ModelSim 模擬器並瀏覽到已編譯庫的位置。
指向第三方工具安裝路徑、選擇目標仿真器、編譯映射庫可參考(UG900)Vivado Design Suite用戶指南邏輯仿真Xilinx DDR2 MIG 7 性能評估-圖 3

通過 GUI 運行模擬(單擊項目管理器中的“運行模擬”選項卡)並確保您在成績單中看到“測試通過”消息。

性能模擬 RTL 修改

  1. 右鍵單擊源選項卡,選擇“添加或創建模擬源”,然後瀏覽到 mig7_perfsim_traffic_generator.sv file 然後單擊完成添加它。
  2. 右鍵單擊源選項卡,選擇“添加或創建模擬源”,瀏覽到 perfsim_stimulus.txt,然後單擊完成添加它。
  3. 註釋掉前任ampsim_tb_top.v 中的 le_top 實例化 file.
  4. 將以下 RTL 行添加到 sim_tb_top,v
  • 本地參數 APP_ADDR_WIDTH = 28;
  • 本地參數 APP_DATA_WIDTH = 64;
  • localparam APP_MASK_WIDTH = APP_DATA_WIDTH / 8;
  • localparam MEM_ADDR_ORDER = “BANK_ROW_COLUMN”;
  • 本地參數 BANK_WIDTH = 3;
  • 本地參數 RANK_WIDTH = 1;
  • 電線 [APP_ADDR_WIDTH-1:0] c0_ddr3_app_addr;
  • 電線 [2:0] c0_ddr3_app_cmd;
  • 電線 c0_ddr3_app_en;
  • 電線 [APP_DATA_WIDTH-1:0] c0_ddr3_app_wdf_data;
  • 電線 c0_ddr3_app_wdf_end;
  • 電線 [APP_MASK_WIDTH-1:0] c0_ddr3_app_wdf_mask;
  • 電線 c0_ddr3_app_wdf_wren;
  • 電線 [APP_DATA_WIDTH-1:0] c0_ddr3_app_rd_data;
  • 電線 c0_ddr3_app_rd_data_end;
  • 電線 c0_ddr3_app_rd_data_valid;
  • 電線 c0_ddr3_app_rdy;
  • 電線 c0_ddr3_app_wdf_rdy;
  • 電線 c0_data_compare_error;
  • 接線 ui_clk;
  • 電線 ui_clk_sync_rst;
  • 電線 app_sr_req = 0;
  • 電線 app_ref_req = 0;
  • 電線 app_zq_req =0;
  • 電線 c0_app_wdf_mask =0;

FPGA 內存控制器實例化

mig_7series_0_mig u_mig_7series_0_mig (
//內存接口端口

  • .ddr3_addr(ddr3_addr_fpga),
  • .ddr3_ba(ddr3_ba_fpga),
  • .ddr3_cas_n(ddr3_cas_n_fpga),
  • .ddr3_ck_n(ddr3_ck_n_fpga),
  • .ddr3_ck_p(ddr3_ck_p_fpga),
  • .ddr3_cke(ddr3_cke_fpga),
  • .ddr3_ras_n(ddr3_ras_n_fpga),
  • .ddr3_reset_n (ddr3_reset_n),
  • .ddr3_we_n(ddr3_we_n_fpga),
  • .ddr3_dq(ddr3_dq_fpga),
  • .ddr3_dqs_n(ddr3_dqs_n_fpga),
  • .ddr3_dqs_p(ddr3_dqs_p_fpga),
  • .init_calib_complete(init_calib_complete),
  • .ddr3_cs_n(ddr3_cs_n_fpga),
  • .ddr3_dm(ddr3_dm_fpga),
  • .ddr3_odt(ddr3_odt_fpga),

// 應用接口端口

  • .app_addr(c0_ddr3_app_addr),
  • .app_cmd (c0_ddr3_app_cmd),
  • .app_en (c0_ddr3_app_en),
  • .app_wdf_data(c0_ddr3_app_wdf_data),
  • .app_wdf_end(c0_ddr3_app_wdf_end),
  • .app_wdf_wren(c0_ddr3_app_wdf_wren),
  • .app_rd_data(c0_ddr3_app_rd_data),
  • .app_rd_data_end(app_rd_data_end),
  • .app_rd_data_valid(c0_ddr3_app_rd_data_valid),
  • .app_rdy(c0_ddr3_app_rdy),
  • .app_wdf_rdy(c0_ddr3_app_wdf_rdy),
  • .app_sr_req(app_sr_req),
  • .app_ref_req (app_ref_req),
  • .app_zq_req(app_zq_req),
  • .app_sr_active(app_sr_active),
  • .app_ref_ack (app_ref_ack),
  • .app_zq_ack(app_zq_ack),
  • .ui_clk(ui_clk),
  • .ui_clk_sync_rst(ui_clk_sync_rst),
  • .app_wdf_mask(c0_ddr3_app_wdf_mask),

// 系統時鐘端口

  • .sys_clk_i(sys_clk_i),

// 參考時鐘端口

  • .clk_ref_i(clk_ref_i),
  • .sys_rst (sys_rst)
  • );

性能流量生成器實例化

mig7_perfsim_traffic_generator#
(
.APP_DATA_WIDTH(APP_DATA_WIDTH),
.COL_WIDTH (COL_WIDTH),
.ROW_WIDTH(ROW_WIDTH),
.RANK_WIDTH (RANK_WIDTH),
.BANK_WIDTH(銀行寬度),
.MEM_ADDR_ORDER(MEM_ADDR_ORDER),
.tCK (tCK),
.ADDR_WIDTH(APP_ADDR_WIDTH)
)

u_traffic_gen
(
.clk (ui_clk),
.rst (ui_clk_sync_rst),
.init_calib_complete(init_calib_complete),
.cmp_error(c0_data_compare_error),
.app_wdf_rdy (c0_ddr3_app_wdf_rdy),
.app_rd_data_valid(c0_ddr3_app_rd_data_valid),
.app_rd_data (c0_ddr3_app_rd_data),
.app_rdy(c0_ddr3_app_rdy),
.app_cmd (c0_ddr3_app_cmd),
.app_addr (c0_ddr3_app_addr),
.app_en (c0_ddr3_app_en ),
.app_wdf_mask(c0_ddr3_app_wdf_mask),
.app_wdf_data(c0_ddr3_app_wdf_data),
.app_wdf_end (c0_ddr3_app_wdf_end),
.app_wdf_wren(c0_ddr3_app_wdf_wren)
);

  • 5. 根據您的內存部分選擇修改APP_ADDR_WIDTH、APP_DATA_WIDTH、RANK_WIDTH 和BANK_WIDTH。
    值可以從_mig.v file.
  • 黃色突出顯示的實例化名稱 mig_7series_0_mig 可能會根據您在 IP 創建期間的組件名稱而有所不同,請驗證您是否選擇了不同的名稱並相應地進行更改。Xilinx DDR2 MIG 7 性能評估-圖 4
  • 生成IP後打開_mig.v file 並交叉檢查 LHS 信號名稱中的任何變化並進行更正。
  • app_sr_req、app_ref_req 和 app_zq_req 應初始化為 0。
  • 作為前任ample_top.v 被註釋掉並且是新的 file添加了 s,您可能會看到“?” 在旁邊
    mig_7series_0_mig.v file 在模擬源下。
    映射正確的 file,右擊mig_7series_0_mig.v,選擇“Add Sources”,瀏覽到
    /mig_7series_0_example.srcs/sources_1/ip/mig_7series_0/mig_7series_0/user_design/rtl
    並添加 mig_7series_0_mig_sim.v file.
  • 如果你看到 ”?” 對於底層 files, 添加所有 RTL file在 clocking、controller、ip_top、phy 和 UI 文件夾中。
  • 一旦 RTL 更改完成並且所有必需的 files 添加到您的模擬源中,層次結構應類似於圖 5。
    這 file以紅色突出顯示的是新添加的,而“?” 預計在 ECC 相關模塊上,因為所選內存配置禁用了 ECC 選項。Xilinx DDR2 MIG 7 性能評估-圖 5

刺激 File 描述
每個激勵模式為 48 位,格式如圖 6-1 至 6-4 所示。Xilinx DDR2 MIG 7 性能評估-圖 6

地址編碼(地址[35:0])

地址按照圖 7-1 至圖 7-6 在激勵中編碼。 所有地址字段都需要以十六進制格式輸入。 所有地址字段的寬度都可以被四整除,以十六進制格式輸入。 測試台僅將地址字段的所需位發送到內存控制器。
對於前amp例如,在 2 bank 配置中,只有 bank 位 [0:XNUMX] 被發送到內存控制器,其餘位被忽略。 地址字段的額外位供您以十六進制格式輸入地址。
您必須確認輸入的值對應於給定配置的寬度。Xilinx DDR2 MIG 7 性能評估-圖 7

  • 列地址(列 [11:0]) – 激勵中的 Column Address 最多提供 12 位,但您需要根據設計中設置的列寬參數來解決這個問題。
  • 行地址 (Row[15:0]) – 激勵中的行地址最多提供 16 位,但您需要根據設計中設置的行寬參數來解決這個問題。
  • 銀行地址(銀行[3:0])—— 激勵中的 Bank 地址最多提供四位,但您需要根據設計中設置的 Bank 寬度參數來解決這個問題。
  • 排名地址(排名[3:0]) – 激勵中的秩地址最多提供四位,但您需要根據設計中的秩寬度參數集來解決這個問題。
    地址根據頂層 MEM_ADDR_ORDER 參數組裝並發送到用戶界面

命令重複(命令重複 [7:0])
命令重複計數是相應命令在用戶界面上重複的次數。 每次重複的地址遞增 8。最大重複次數為 128。
測試平台不檢查列邊界,如果在增量期間達到最大列限制,它會環繞。
128 個命令填滿了頁面。 對於 0 以外的任何列地址,128 的重複計數最終會越過列邊界並環繞到列地址的開頭。

總線利用率
總線利用率是在用戶界面計算的,考慮了讀取和寫入的總數,並使用以下等式:

Xilinx DDR2 MIG 7 性能評估-圖 8

  • BL8 需要四個內存時鐘週期
  • end_of_stimulus 是所有命令完成的時間。
  • calib_done 是校準完成的時間。

Examp文件模式
這些前amp文件基於設置為 BANK_ROW_COLUMN 的 MEM_ADDR_ORDER。

單讀模式
00_0_2_000F_00A_1 – 此模式是從第 10 列、第 15 行和第二組中讀取的單個數據。Xilinx DDR2 MIG 7 性能評估-圖 9單寫模式
00_0_1_0040_010_0 – 此模式是對第 32 列、第 128 行和第一組的單次寫入。Xilinx DDR2 MIG 7 性能評估-圖 10對同一地址的單次寫入和讀取
00_0_2_000F_00A_0 – 此模式是對第 10 列、第 15 行和第二組的單次寫入。
00_0_2_000F_00A_1 – 此模式是從第 10 列、第 15 行和第二組中讀取的單次數據Xilinx DDR2 MIG 7 性能評估-圖 11

使用同一地址進行多次寫入和讀取
0A_0_0_0010_000_0 – 這對應於地址從 10 到 0 的 80 次寫入,可以在列中看到。Xilinx DDR2 MIG 7 性能評估-圖 12

0A_0_0_0010_000_1 – 這對應於地址從 10 到 0 的 80 次讀取,可以在列中看到。Xilinx DDR2 MIG 7 性能評估-圖 13

寫入期間換頁
0A_0_2_000F_3F8_0 – 這對應於 10 次寫入,其中列地址在一次寫入後迴繞到頁面的開頭。Xilinx DDR2 MIG 7 性能評估-圖 14

模擬性能流量生成器

此時你已經完成了 MIG examp設計模擬。 這意味著您的仿真設置已準備就緒,您已經完成了性能仿真 RTL 修改,新的仿真層次結構是正確的並且您已經了解了激勵模式。 在 perfsim_stimulus.txt 中使用 16 次寫入和讀取再次運行模擬。Xilinx DDR2 MIG 7 性能評估-圖 15

運行全部,等待 init_calib_complete 信號被置位,您將能夠看到建議的寫入和讀取次數。 然後模擬將停止。 Xilinx DDR2 MIG 7 性能評估-圖 16

當系統提示您退出模擬時,選擇否並轉到成績單窗口,您可以在其中查看性能統計信息。 Xilinx DDR2 MIG 7 性能評估-圖 17

如果您選擇 “退出模擬” 性能統計信息將被寫入 file 命名的 mig_band_width_output.txt 位於 sim_1/behave 資料夾。

Examp文件目錄路徑:-
/mig_7series_0_example_perf_sim\mig_7series_0_example.sim/sim_1/行為Xilinx DDR2 MIG 7 性能評估-圖 18

你可能想知道為什麼百分比tage 總線利用率僅為 29。使用相同的 IP 設置重新運行仿真,但只是更改激勵 file 到 256 次寫入和 256 次讀取

ff_0_0_0000_000_0
ff_0_0_0000_000_1

您現在將看到百分比tage 為 85,這意味著 DDR3 為長序列的寫入和讀取突發提供了更好的總線利用率。 Xilinx DDR2 MIG 7 性能評估-圖 19

提高績效的一般方法

影響效率的因素可以分為兩部分:

  1. 內存特定
  2. 控制器特定Xilinx DDR2 MIG 7 性能評估-圖 20

圖9給你一個overview 特定於內存的術語。
與 SRAM 和塊存儲器不同,DDR2 或 DDR3 性能不僅僅是最大數據速率。

這取決於許多時間因素,包括:

  • 漏電保護器: 行命令延遲(或 ras 到 cas 延遲)。
  • tCAS(CL): 列地址選通延遲。
  • 目標零售價: 行預充電延遲。
  • RAS:行活動時間(激活預更改)。
  • 時間: 行循環時間。 tRC = tRAS + tRP
  • 交易記錄: 隨機訪問延遲。 tRAC = tRCD + tCAS
  • tCWL: Cas 寫入延遲。
  • tZQ: ZQ 校準時間。
  • tRFC: 行刷新周期時間
  • tWTR: 寫入讀取延遲。 上次寫入事務到讀取命令的時間。
  • tWR: 寫入恢復時間。 上次寫入事務到 Precharge 時間

所有列出的參數的時序取決於所用內存的類型和內存部件的速度等級。
有關定義和時序規範的更多詳細信息,請參閱 DDR2 DDR3 JEDEC 或任何存儲設備數據表。

效率主要取決於內存的訪問方式。 不同的地址模式給出不同的效率結果。

內存時序開銷

  1. 更改為新組/行或在同一組中更改行時的激活時間和預充電時間。- 因此,如果您減少行更改,這可以消除 tRCD 和 tRP。
  2. 發送連續寫入或讀取命令 - 保持 tCCD 時序。
  3. 最大限度地減少寫入到讀取和讀取到寫入命令的轉換——寫入恢復時間更改為讀取訪問,總線周轉時間從讀取更改為寫入
  4. 設置適當的刷新間隔。
    • DDR3 SDRAM 需要平均週期為 tREFI 的刷新周期。
    • 最多可以提前發出 8 個額外的刷新命令(“拉入”)。 這不會減少刷新次數,但兩個周圍刷新命令之間的最大間隔被限制為 9 × tREFIXilinx DDR2 MIG 7 性能評估-圖 21
  • 利用所有銀行 – 合適的尋址機制是更可取的。
    • 行銀行列: 對於在順序地址空間上發生的事務,核心會自動在 DRAM 設備的下一個存儲體中打開同一行,以便在到達現有行的末尾時繼續事務。 它非常適合需要將大數據包突發到順序地址位置的應用程序。
    • 銀行行列: 跨越行邊界時,當前行將關閉,而同一行內的另一行將打開。 MSB是bank地址,可以用來切換不同的bank。 它適用於更短、更隨機的交易到一個內存塊一段時間然後跳轉到另一個塊(bank)
  • 突發長度
    • 8 系列的 DDR3 支持 BL 7。 BC4 的效率非常低,不到 50%。 這是因為 BC4 的執行時間與 BL8 相同。 數據只是在組件內部被屏蔽。
    • 在您不希望寫入完整突發的情況下,可以考慮數據掩碼或先讀後寫。
  • 設置適當的 ZQ 間隔(僅限 DDR3)
    控制器發送 ZQ 短 (ZQCS) 和 ZQ 長 (ZQCL) 校準命令。
    • 遵守 DDR3 Jedec 標準
    • ZQ 校准在 JEDEC 規範 JESD5.5-79 DDR3 SDRAM 標準的第 3 節中討論
    • ZQ 校准定期校準片上端接 (ODT) 以解決 VT 的變化
    • 邏輯包含在 bank_common.v/vhd
    • 參數 Tzqcs 確定 ZQ 校準命令發送到內存的速率
    • 可以禁用計數器並使用 app_zq_req 手動發送,這類似於手動發送刷新。
      有關詳細信息,請參閱(Xilinx 答复 47924)。Xilinx DDR2 MIG 7 性能評估-圖 22

控制器開銷

  1. 定期讀取 - 請參閱 (Xilinx答复43344) 了解詳情。
    • 不要改變讀取的周期
    • 在寫入期間跳過定期讀取,並在真正讀取之前發出未讀讀取的次數
  2. 重新排序 – 參考 (Xilinx答复34392) 了解詳情。
    對於用戶和 AXI 接口設計,最好啟用此功能。
    • Reorder是向前看幾個命令並改變用戶命令順序以使非內存命令不佔用有效帶寬的邏輯。 性能還與實際流量模式有關。
    • 基於地址模式,重新排序有助於跳過預充電和激活命令,並使 tRCD 和 tRP 不佔用數據帶寬。Xilinx DDR2 MIG 7 性能評估-圖 23
  3. 嘗試增加銀行機器的數量。
    • 大多數控制器的邏輯駐留在銀行機器中,它們對應於 DRAM 銀行
    • 給定的銀行機器在任何給定時間管理單個 DRAM 庫。
    • 銀行機器分配是動態的,因此沒有必要為每個實體銀行配備一台銀行機器。
    • 銀行機器可以配置,但這是面積和性能之間的權衡。
    • 允許的銀行機器數量範圍為 2-8 台。
    • 默認情況下,通過 RTL 參數配置 4 個 Bank Machine。
    • 要更改銀行機器,請考慮 memc_ui_top Ex 中包含的參數 nBANK_MACHS = 8amp8 台銀行機器的 le – nBANK_MACHS = 8

您現在已經了解了影響性能的因素。
考慮一個上游應用程序,它為每個數據包提供 512 個數據字節,您需要將它們保存到不同的內存位置。 由於 512 個數據字節等於 64 個 DDR3 數據突發,重新運行 examp帶刺激的設計 file 包含 512 次寫入、512 次讀取和每 64 次寫入或讀取的行切換:

  • 3f_0_0_0000_000_0
  • 3f_0_0_0001_000_0
  • 3f_0_0_0002_000_0
  • 3f_0_0_0003_000_0
  • 3f_0_0_0004_000_0
  • 3f_0_0_0005_000_0
  • 3f_0_0_0006_000_0
  • 3f_0_0_0007_000_0
  • 3f_0_0_0000_000_1
  • 3f_0_0_0001_000_1
  • 3f_0_0_0002_000_1
  • 3f_0_0_0003_000_1
  • 3f_0_0_0004_000_1
  • 3f_0_0_0005_000_1
  • 3f_0_0_0006_000_1
  • 3f_0_0_0007_000_1

在模擬結束時,您將看到總線利用率為 77%。 Xilinx DDR2 MIG 7 性能評估-圖 24

圖 11:512 次寫入和 512 次讀取的性能統計 – 64 次寫入或讀取的行切換。 

您現在可以應用在前面部分中學到的知識來提高效率。 與 view 要利用所有銀行而不是更改行,請修改地址模式以更改銀行,如下所示。
這相當於在 MIG GUI 中的內存地址映射設置中設置 ROW_BANK_Column。

  • 3f_0_0_0000_000_0
  • 3f_0_1_0000_000_0
  • 3f_0_2_0000_000_0
  • 3f_0_3_0000_000_0
  • 3f_0_4_0000_000_0
  • 3f_0_5_0000_000_0
  • 3f_0_6_0000_000_0
  • 3f_0_7_0000_000_0
  • 3f_0_0_0000_000_1
  • 3f_0_1_0000_000_1
  • 3f_0_2_0000_000_1
  • 3f_0_3_0000_000_1
  • 3f_0_4_0000_000_1
  • 3f_0_5_0000_000_1
  • 3f_0_6_0000_000_1
  • 3f_0_7_0000_000_1

在模擬結束時,您會看到先前的 77% 總線利用率現在是 87! Xilinx DDR2 MIG 7 性能評估-圖 25

如果您仍然需要更高的效率,您可以選擇 1024 或 2048 字節的大數據包,或者考慮手動刷新。

筆記: Xilinx 不鼓勵繞過控制器刷新,因為我們不確定您是否能夠滿足影響數據可靠性的 Jedec 自動刷新時序。
從控制器端,您可以更改 nBANk_MACH 並查看性能的改進。
但是,這可能會影響您的設計時序,請參考 (Xilinx答复36505) 有關 nBANk_MACH 的詳細信息Xilinx DDR2 MIG 7 性能評估-圖 26

打開 core_name_mig_sim.v file 並將參數 nBANK_MACHS 從 4 更改為 8,然後重新運行仿真。 要使參數值在硬件中生效,需要更新core_name_mig.v file.
我使用了相同的模式,我們得到了 87% 的總線利用率(圖 -12)。
當 nBANK_MACHS 設置為 8 時,效率現在為 90%。 Xilinx DDR2 MIG 7 性能評估-圖 27

另請注意,½ 和 ¼ 控制器由於其延遲會對效率產生負面影響。
對於前ample,因為我們只能每 4 個 CK 週期發送一次命令,所以在遵守最小 DRAM 時序規範時有時會有額外的填充,這會降低理論上的效率。
嘗試不同的控制器以找到適合您的效率要求的控制器。

參考

  1. Zynq-7000 AP SoC 和 7 系列 FPGA MIS v2.3 [UG586]
  2. Xilinx MIG 解決方案中心 http://www.xilinx.com/support/answers/34243.html

修訂歷史
13/03/2015 – 初始版本

下載PDF: Xilinx DDR2 MIG 7 性能評估指南

參考

發表評論

您的電子郵件地址不會被公開。 必填欄位已標記 *