DeepLearning/FPGAなどを勉強する人

興味のあることを書く

DDR3 SDRAM: On-Die Termination

DDR3 SDRAMに関するメモ的なもの(特にDDR3L-1333)。

図は全て以下のMicronのドキュメントからの引用であり、このメモの内容もこれを参照する。
2Gb: x4, x8, x16 DDR3L SDRAM

以下も参照。
DDR3 SDRAMにおけるコマンドとオペレーション - Wikipedia
The Secrets of PC Memory: Part 3 | bit-tech.net

信号の反射

一般にメモリコントローラとメモリモジュールを繋ぐために利用されるスタブバス(stub bus)では、メインデータラインを各メモリモジュールのコネクタで分岐することで共有している。なぜスタブバスが利用されているかというと、設計を簡素化できるという利点があるため。
DDR1のスピードを超えると、それまでのマザーボード終端では信号の反射が深刻な問題となっていた。つまり、チップ端で発生した反射波が分岐を通してメインデータラインに達して波形品質を悪化させてしまう。メモリバスが高周波になると信号の異常を回復する余裕がなくなってしまうし、更により低電圧な圧縮された信号になると、基本的に弱く全てのジッタを取り除けなくなる。こうしたことから、スタブバスは高速データ転送には不向きとされていた。
その対策の一つとして、終端抵抗をデバイスの直近に置いて反射波を軽減するということが挙げられる。そこでDDR2からOn-Die Termination(ODT)というオンダイの動的な終端抵抗をチップ内部に置くことで、波形品質を確保している。

http://images.bit-tech.net/content_images/2008/02/the_secrets_of_pc_memory_part_3/odt-signal.png

ただし、この終端が効き過ぎてしまうと、メモリタイミングが不正確なときに(例えばオーバークロッキングした場合など??よくわからない)、データ信号自体が吸収されてしまう可能性がある。マザーボードによってはBIOS経由でODTの値を調整できるらしい。

On-Die Termination (ODT)

DDR3 SDRAMのODTは、x4/x8ならばDQDQS,DQS#、DMの、x16ならばDQ,UDQS,UDQS#、LDQS、LDQS#、UDM、LDMの終端抵抗のon/off制御を可能にさせるための機能である。目的としては、DRAMコントローラが各DRAMの内部終端抵抗を独立にon/offできるようにすることで、メモリチャネルのデジタル信号品質(signal integrity)を向上させるという事となる。(※DLLがdisbaleの環境では使用できない)
内部のODTコントロールロジックによって下図のようなスイッチが制御される。

f:id:wanwannodao:20170907035017p:plain

self refreshモード時、disable時はこの部分は無視される。
以下用いる記号の説明。

Symbol Description
\rm R_{TT} ODT termination resistance value
\rm R_{TT,nom} nominal ODT value
\rm R_{TT(WR)} dynamic ODT value
\rm R_{TT(EFF)} The actual effective termination

\rm R_{TT}はモードレジスタ経由で設定される。


ODTはnominal ODTdynamic ODTによって構成されていて、それぞれ同期非同期モードがある。非同期はprecharge power-down中にDLLがoffの場合や、DLLが同期中の時に起きる。また、nominal ODTは基本となる終端で、dynamic ODTはWRITE中のみ適用されるもので、\rm no \ R_{TT}または\rm R_{TT,nom}から\rm R_{TT(WR)}へのスイッチングを行う。
非線形な終端なので、\rm R_{TT(EFF)}\rm R_{TT}と同じになるとは限らない。


使用するタイミングは以下の通り。
ODT Timing

Param Symbol DDR3L-1333 Unit
\rm R_{TT,nom} synchronous turn-on delay ODTLon \rm CWL+AL-2CK CK
\rm R_{TT,nom} synchronous turn-off delay ODTLoff \rm CWL+AL-2CK CK
\rm R_{TT} turn-on from ODTLon tAON \rm MIN=-250;MAX=250 ps
\rm R_{TT} turn-off from ODTLoff tAOF \rm MIN=0.3;MAX=0.7 CK
ODT=HIGH time (BL8) ODTH8 \rm MIN=6 CK
ODT=HIGH time (BC4/without WRITE) ODTH4 \rm MIN=4 CK

CWL:CAS Write Latency, AL:Active Latency

Nominal ODT

\rm R_{TT,nom}が前述した出力ピンに適用される。DDR3 SDRAMでは\rm RZQ/nという形式で複数の抵抗値を選択することができる。ここで、n=2,4,6,8,12\rm RZQ=240Ω
\rm R_{TT,nom}での終端は、DARMが初期化され、補正された後で、リードアクセスを実行しておらず、self refreshモードでなければいつでも適用可能である。
dynamic ODTが有効でない場合、ライトアクセス時にも\rm R_{TT,nom}を利用するが、n=2,4,6に制限される。

Dynamic ODT

終端の強度をMRSコマンドを経由することなく、ODT終端をon-the-flyで変化させられることは、データバスの更なるデジタル信号品質の向上のためにも望ましい。
dynamic ODT \rm R_{TT(WR)}を有効にすることで、DRAMはWRITEバースト開始時に、\rm R_{TT,nom}から\rm R_{TT(WR)}にスイッチさせ、WRITEバーストが終わったら\rm R_{TT,nom}に再びスイッチさせることができる。

各スイッチにかかる時間は以下の通り。tADCの間は\rm R_{TT}の値は未定義。
dynamic ODT Timing

Param Symbol DDR3L-1333 Unit
\rm R_{TT,nom}-to-\rm R_{TT(WR)} change skew ODTLcnw \rm WL-2CK CK
\rm R_{TT(WR)}-to-\rm R_{TT,nom} change skew(BC4) ODTLcnw4 \rm 4CK+ODTLoff CK
\rm R_{TT(WR)}-to-\rm R_{TT,nom} change skew(BL8) ODTLcnw8 \rm 6CK+ODTLoff CK
\rm R_{TT} dynamic change skew tADC \rm MIN=0.3;MAX=0.7 CK

WL:Write Latency

特殊な仕様事例(DDR3がシングルランクの場合)

micronのドキュメントに書いてあるが、よく分かっていないので、とりあえず省略。

Synchronous ODT Mode

同期ODTとは、ODTピンの入力からAL分遅延して\rm R_{TT}のon/offが同期するODTのことを指す。DLLがonでロックされている状態で、\rm R_{TT,nom}\rm R_{TT(WR)}が有効であればいつでも同期ODTになる。つまり以下の場合が該当する。

  • CKEがHIGHで、全てのバンクがactive
  • CKEがHIGHで、refreshモード
  • CKEがHIGHで、idleモード
  • active power-down モード
  • DLLが有効なprecharge power-down モード

同期ODTでは、\rm R_{TT}はクロックの立ち上がりで、ODTがHIGHであるとサンプルされてからODTLonサイクル後にonとなり、ODTがLOWであるとサンプルされてからODTLoffサイクル後にoffとなる。実際にon/offになるタイミングはtAON/tAOFだけずれる。tAONとtAOFが分かりにくいが、つまりtAON(MIN)(minimum \rm R_{TT} turn-on time)とは、ODTLonから、実際にデバイスがHigh-Z状態から\rm R_{TT}をonに切り替え始めるタイミングで、tAON(MAX)(maximum \rm R_{TT} turn-on time)とはODTLonからODT抵抗を完全にonにしたタイミングのこと(tAOFも同様)。

ODTレイテンシ(ODTLon/ODTLoff)はWL(Wirte Latency)と結びついていて、WLはCWT(CAS WRITE Latency)とAL(Additive Latency)から成るので、モードレジスタで設定したALがODT信号にも適用される。つまり、内部のODT信号は外部のODT信号からAL分遅延する。

ODTがアサートされたら、ODTH4の間はHIGHに保たなければならない。WRITEコマンドの場合はODTH4(BC4)、ODTH8(BL8)の間HIGHに保たなければならない。
f:id:wanwannodao:20170907073651p:plain

READ中のODT Off

バイスが終端と出力を同時に行えないので、READプリアンブルの少なくとも半クロックサイクル前に\rm R_{TT}を無効にしておかなければならない。また、\rm R_{TT}はポストプリアンブルが終わってからでないと有効にならない。
f:id:wanwannodao:20170907073659p:plain

Asynchronous ODT Mode

常にfast exitを使うならここからの話は全く気にしなくて良い。
正直このあたりからかなり複雑過ぎてつらい...のでほぼ適当
Asynchronous ODT Timing

Param Symbol DDR3L-1333 Unit
Async. \rm R_{TT} turn-on delay tAONPD \rm MIN=2;MAX=8.5 ns
Async. \rm R_{TT} turn-off delay tAOFPD \rm MIN=2;MAX=8.5 ns

DLLがonであり、\rm R_{TT,nom}\rm R_{TT(WR)}が有効である状態で、precharge power-down中にDLLがoffになる場合に非同期ODTモードになる。または、リセットの後にDLLが同期中である場合にも非同期ODTになる。また、非同期ODTでは、ALによる遅延は発生しない。

tAONPD(MIN)(minimum \rm R_{TT} turn-on time),tAONPD(MAX)(maximum \rm R_{TT} turn-on time)の定義は同期ODTとほぼ同様だが、計測の基点がODTがHIGHとサンプルされた時点からとなっている(tAOFPDも同様)。
f:id:wanwannodao:20170907073708p:plain

Sync. to Async.

ここからはslow exitのprecharge power-downモードの時の同期ODTと非同期ODT間の遷移に関する事。

Power-Down Timing

Param Symbol DDR3L-1333 Unit
Begin power-down period prior to CKE registered HIGH tANPD \rm WL-1CK(Greater(ODTLoff+1,ODTLon+1)) CK
Power-down entry period:ODT(sync./async.) PDE \rm Greater(tANPD, tRFC-(REFRESH->CKE=LOW \ time)) CK
Power-down exit period:ODT(sync./async.) PDX \rm tANPD+tXPDLL CK

PDE周辺でODTはsync./async.どちらの振る舞いにもなりうる。これは、precharge power-downモードでDLLがoffの時に発生する。power-down entryはCKEが最初にLOWとなるtANPD前に始まり、最初にLOWとなった時に終わる。ここで、tANPDはODTLoff+1かODTLon+1の大きい方に等しい。一方、REFRESHコマンドが発行されていて、CKEがLOWになる時に実行中の場合、power-down entryは、(最初にCKEがLOWになった時ではなく)REFRESHコマンドのtRFC後に終わる。したがって、PDEは表の通りになる。
この時、power-down entry中のODTのアサーションとデアサーション\rm R_{TT}の変化は以下のようになる。

Description Min Max
ODT -> \rm R_{TT} turn-on delay \rm Lesser(tAONPD(MIN),ODTLon \times tCK + tAON(MIN)) \rm Greater(tAONPD(MAX),ODTLon \times tCK + tAON(MAX)

さて、ここでODTの振る舞いについて以下の3ケースが考えられる。

  • tANPD前の同期的な動作
  • PDE中の動作:上の表でLesser, Greaterで右側が選ばれる時
  • PDE後の非同期的な動作

f:id:wanwannodao:20170907084302p:plain

Async. to Sync.

Sync. to Async.の逆でpower-down exitで起きる事。大体同じ話なのでODTと\rm R_{TT}の変化だけ。

Description Min Max
ODT -> \rm R_{TT} turn-off delay \rm Lesser(tAOFPD(MIN),ODTLoff \times tCK + tAOF(MIN)) \rm Greater(tAOFPD(MAX),ODTLoff \times tCK + tAOF(MAX)
Short CKE Pulse

precharge power-downもしくはidleステートの時間が非常に短い場合(CKE LOWパルスが短い場合)、power-down entryとpower-down exitの遷移がオーバーラップする。
idleステートの時間が非常に短い場合(CKE HIGHパルスが短い場合)、power-down exitとpower-down entryの遷移がオーバーラップする。

これらの場合に関する\rm R_{TT}の変化に関することだが、力尽きたので気が向いた時に加筆する。