コスモリサーチの凄腕エンジニアたちが日々、難題と格闘した記録
Copyright Cosmo Research Corp.

XilinxのDDR4メモリコントローラについてのメモ

目的

DDR4メモリコントローラのオーバーヘッドに影響がある設定ついて調べる。 どの設定にしたらアクセス速度があがるか?

先に、内容のまとめ

DDR4メモリコンポーネントについては、8Gb:x4,x8,x16 DDR4 SDRAM Datasheetを参考にした。

  • x16デバイスでは、バンクグループは1bit、バンクが2bit存在する。
  • 違うバンクグループへのアクセスが早く、同じバンクグループへのアクセスは遅い。
  • データマスクが有効だと遅くなる。

メモリコントローラIPについては、UltraScaleアーキテクチャFPGAメモリIP v1.2 LogiCORE IP 製品ガイド(PG150)を参考にした。

  • 単調にインクリメントする場合はROW_COLUMN_BANKが有効だが、短いバースト長の場合はROW_COLUMN_BANK_INTLVが有効らしい。
  • DM/DBIのオプションは、NO_DM_DBI_WRがベターかもしれない。

DDR4メモリコンポーネント

DDR4メモリコンポーネントのTimingパラメータの概要

-083E Device overview

0.937ns @ CL = 15 (DDR4-2133)
Data Rate    = 2133 MT/s
tRCD         = 14.06 ns
tRP          = 14.06 ns
CL           = 14.06 ns

Addressing(component)

Bank Group : BG0 (1bit only)
Bank       : BA[1:0] (per Bank Group)
Row        : A[15:0]
Column     : A[9:0]
Page Size  : 2KByte (per Bank)

DDR4メモリコンポーネントのモードレジスタ設定(メモリコントローラIPと照らし合わせ)

x16デバイスには8個のバンク(2バンクグループで各々4バンク)が存在する。
MIGではMT40A512M16HA-083Eを選択して938psのクロックサイクルとすると、以下の設定になる。

  • MR0 = 13'b0011100110000,

    • BL8(Mode : Burst Length 8)固定
      • tWR(WRITE recovery) = 16
        ここから、最小のWRサイクルは以下となる。
        roundup(tWR / tCK) = roundup(16 / 0.938) = roundup(17.057...) = 18 cycle
        ただし、DM(Data Mask)が有効な場合は上記から更に遅くなる。
      • tRTP(READ-to-PRECHARGE) = 8
        ここから、最小のRTPサイクルは以下となる。
        roundup(tRTP / tCK) = roundup(8 / 0.938) = roundup(8.428...) = 9 cycle
        同じバンクにアクセスする際のACTタイミングがこれで決まる。
  • MR1 = 13'b0001100000001,

    • AL(Additive Latency) = 0(AL disable)
      WL(WRITE latency) = AL + CWL(CAS WRITE latency) = CWL
      RL(READ latency) = AL + CL(CAS latency) = CL
  • MR2 = 13'b0000000010000,

    • CWL = 11
      WL = AL + CWL = 0 + 11 = 11
  • MR4 = 13'b0000000000000,

    • WRITE preamble setting = 1tCK
    • READ preamble setting = 1tCK
    • CAL(CMD address latency) = 0
  • MR5 = 13'b0010000000000,

    • DM(Data mask) enable ... 実際には使用しないがIPで有効になっているとWRには影響する?
      これがオーバヘッドに影響するかどうかは、要確認。
  • MR6 = 13'b0100000010100,

    • tCCD_L = 6 clocks

DDR4メモリコンポーネントのBank Access Operation

違うバンクグループへのアクセス(WRITE/READ)は、tCCD_S(or short)分遅延する。
同じバンクグループへのアクセス(WRITE/READ)は、tCCD_L(or long)分遅延する。

tCCD_S = 4 clocks (DDR4-2133) ... CAS_n-to-CAS_n command delay to different bank group
tCCD_L = 6 clocks             ... CAS_n-to-CAS_n command delay to same bank group

違うバンクグループのACTIVATEは、tRRD_S分遅延する。
同じバンクグループの違うバンクのACTIVATEは、tRRD_L分遅延する。

tRRD_S = 5.3 ns (DDR4-2133, page size 2KByte)  ... ACTIVATE-to-ACTIVATE command period to different bank groups
tRRD_L = 6.4 ns (DDR4-2133, page size 2KByte)  ... ACTIVATE-to-ACTIVATE command period to same bank groups

tWTR_S/L(WRITEからREADの切り替わり時間)については、とりあえず無視する。

メモリコントローラ

グループFSM

基本的にはバンクグループがコントローラのグループFSMに割り当てられ、各グループFSM間でタイミングを協調してアクセス効率を高める働きをする。
基本的には、と書いたのはDDR4のx16デバイスの場合に、バンクグループは1bitだが、グループFSMは2bit(4つ)存在するからである。

アクセス効率を高めるためには、グループFSMへのアクセスを均等にすることが必要である。

アドレスオーダー

  • ROW_COLUMN_BANK
    app_addr[4:3]がグループFSMに割り当たる。
    長期間、単調にインクリメントする場合に最も効率的なアドレス配置となる。
    単調にインクリメントしない場合は、この配置を維持したまま、下位bitにトグルしやすいbitを持ってくると良い。

  • ROW_COLUMN_BANK_INTLV
    バースト長が短い場合にパフォーマンスを向上させる。
    この並びは、効果があるかもしれないが、書き込みが連続している場合は効果がなさそうではある。

  • ROW_BANK_COLUMNおよびBANK_ROW_COLUMNは推奨しないようだ。

データマスクとDBI(Data Bus Inversion)

データマスク(DM)は、特定のbitだけマスクしたりする機能であり、DBIはトグル回数(割合)を減らす機能である。
DBIの機能を使用することでノイズ低減や、消費電力の低減を期待できるらしい。
書き込みにおいて、DMとDBIは同時に使用することはできない。

DDR4メモリコンポーネントのデータシートを見る限り、書き込みにおいて、DBIが遅延を発生させることはないようだ(書き込みと同時に調整を行う)。
読み出しに関しては、レイテンシが2クロック増える。

MIGで選択できるDM/DBIのオプションは、以下から選ぶことができるが、レイテンシを考慮するとNO_DM_DBI_WRがベターかもしれない。

  • DM_NO_DBI(デフォルト)データマスク有効でDBI無効
  • DM_DBI_RDデータマスク有効で読み出しのみDBI有効
  • NO_DM_DBI_RDデータマスク無効で読み出しのみDBI有効
  • NO_DM_DBI_WRデータマスク無効で書き込みのみDBI有効
  • NO_DM_DBI_WR_RDデータマスク無効で読み出し/書き込みともDBI有効