目的
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タイミングがこれで決まる。
- tWR(WRITE recovery) = 16
- BL8(Mode : Burst Length 8)固定
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
- AL(Additive Latency) = 0(AL disable)
MR2 = 13'b0000000010000,
- CWL = 11
WL = AL + CWL = 0 + 11 = 11
- CWL = 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には影響する?
これがオーバヘッドに影響するかどうかは、要確認。
- 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
がベターかもしれない。