遅延の制御

Versal アダプティブ SoC SelectIO リソース アーキテクチャ マニュアル (AM010)

Document ID
AM010
Release Date
2024-03-18
Revision
1.5 日本語
次の表に示すように、入力遅延および出力遅延は PL を利用して変更できます。
表 1. 入力遅延および出力遅延の制御
RX_EN_VTC TX_EN_VTC LD CE INC 遅延ラインへの影響
0 0 0 0 変化なし
0 0 1 変化なし
0 1 0 1 タップ単位でデクリメント
0 1 1 1 タップ単位でインクリメント
1 0 0 CNTVALUEIN の値をロード
1 0 1 CNTVALUEIN の値をロード
1 1 0 サポートされない
1 1 1 現在の CNTVALUEOUT の値に CNTVALUEIN の値を加算

次の表に、遅延関連の信号と各 NIBBLESLICE のマップを示します。

表 2. 遅延制御信号と NIBBLESLICE のマップ
ポート NIBBLESLICE[5] NIBBLESLICE[4] NIBBLESLICE[3] NIBBLESLICE[2] NIBBLESLICE[1] NIBBLESLICE[0] 説明
CE[5:0] CE[5] CE[4] CE[3] CE[2] CE[1] CE[0] 制御信号
INC[5:0] INC[5] INC[4] INC[3] INC[2] INC[1] INC[0] 制御信号
LD[5:0] LD[5] LD[4] LD[3] LD[2] LD[1] LD[0] 制御信号
RXTX_SEL[5:0] RXTX_SEL[5] RXTX_SEL[4] RXTX_SEL[3] RXTX_SEL[2] RXTX_SEL[1] RXTX_SEL[0] 入力遅延ラインと出力遅延ラインのどちらに対して遅延ラインの更新を適用、または CNTVALUEOUT でタップ値を報告するかを選択します。
CNTVALUEIN [53:0] CNTVALUEIN [53:45] CNTVALUEIN [44:36] CNTVALUEIN [35:27] CNTVALUEIN [26:18] CNTVALUEIN [17:9] CNTVALUEIN [8:0] 遅延ラインに適用するタップ数
CNTVALUEOUT [53:0] CNTVALUEOUT [53:45] CNTVALUEOUT [44:36] CNTVALUEOUT [35:27] CNTVALUEOUT [26:18] CNTVALUEOUT [17:9] CNTVALUEOUT [8:0] 遅延ラインが現在使用しているタップ数
表 3. 遅延の属性
属性 説明
CASCADE_<0-5> NIBBLESLICE の入力遅延と出力遅延をカスケード接続し、NIBBLESLICE で利用可能な遅延を 2 倍にします。RX にのみ適用されます。
CRSE_DLY_EN CRSE 遅延を有効にします。
DELAY_VALUE_<0-5> NIBBLESLICE の入力および出力遅延の初期値を設定します。CASCADE_x = TRUE の場合、DELAY_VALUE_x に設定可能な最大遅延は 2 倍となります。

DELAY_VALUE_x は、NIBBLESLICE[x] の入力遅延と出力遅延の両方の初期値 (単位 ps) を設定します。DELAY_VALUE_x は時間単位で設定しますが、最終的には、遅延ラインにはタップ単位で遅延が適用されます。つまり、属性で遅延ラインの時間値を設定できるのは、DELAY_VALUE_x のみです。

入力遅延または出力遅延の値を変更する際は、次の点に注意してください。

  • DLY_RDY は 1 とする必要があります。
  • グリッチを避けるため、入力遅延および出力遅延の変更は CTRL_CLK の 3 サイクルごとに 1 回のみとします。
  • 入力遅延および出力遅延の変更は、CNTVALUEOUT に反映されてから CTRL_CLK の 1 サイクル後に有効になります。
  • 遅延は、その種類にかかわらず常にタップ単位で示されます。
  • DELAY_VALUE_x に 0 以外の値を設定した場合、新しい入力遅延または出力遅延の時間値に相当するタップ数は、次の式で見積もることができます。delay_old は変更前の遅延時間 (ps) で、delay_new は変更後の遅延時間 (ps) です。DELAY_VALUE_x を 0 に設定した場合、この式は成り立ちません。この場合も CNTVALUEIN を使用してタップをロードすることはできますが、1 タップの概算時間値が不明のため、新しい遅延の時間値の計算には使用できません。BISC は align_delay を使用して、最初のキャプチャ フリップフロップへの入力パスのクロックおよびデータ挿入遅延の内部スキューを補正します。align_delay の詳細は、次に示す波形の後の説明、および ビルトイン自動キャリブレーション を参照してください。
    CNTVALUEIN[NIBBLESLICE[x]] = delay_new * ((CNTVALUEOUT[NIBBLESLICE[x]] – align_delay)/delay_old)
  • レジスタ インターフェイス ユニット (RIU) を使用して入力遅延および出力遅延を更新する場合、PL から遅延を更新する場合に比べ、余分に CTRL_CLK の 1 サイクル分かかります。RIU を使用して入力遅延や出力遅延を更新する場合は、RX_EN_VTC と TX_EN_VTC が 1 に、LD が 1 に、そして CE が 0 に設定されている必要があり、INC は Don't Care として処理する必要があります。PL から更新できるのは、入力遅延および出力遅延のみです。
  • TBYTE_CTRL_# = PHY_WREN の場合、トライステート NIBBESLICE を使用してトライステート信号に遅延を適用できます。トライステート NIBBLESLICE に適用される遅延の量を変更する場合は、RIU 内の TRISTATE_ODLY レジスタを使用します。
重要: 出力遅延で 8 タップより多くインクリメント/デクリメントすると、データにグリッチが発生することがあります。出力遅延で 8 タップを超えるインクリメント/デクリメントが必要な場合、PHY_WREN を使用して TX データパスをゲーティングするか (TX_GATING = ENABLE の場合)、XPHY.PLL_CLK に接続されている XPLL.CLKOUTPHY を停止する必要があります。
重要: 出力遅延に電圧温度補正 (VTC) を適用する場合、同じ NIBBLESLICE の入力遅延と出力遅延のタップ値を同じに設定する必要があります。
重要: 遅延が 1.5UI 以上の場合、出力遅延のビット アライメントは保証されません。
重要: REFCLK_FREQUENCY が 500MHz 未満のインターフェイスでは、DELAY_VALUE_<0-5> と VTC はサポートされません。
重要: 出力遅延を正しくキャリブレーションするには、TX 専用として設定したニブルで NIBBLESLICE[0] を使用する必要があります。

次に、1 つの入力遅延または出力遅延を更新する場合の波形を示します。この波形は NIBBLESLICE[2] を更新する場合のものですが、すべての NIBBLESLICE に共通です (その場合、CTRL_CLK を除く各信号のバスも異なる)。

図 1. 1 つの入力遅延または出力遅延の更新
開始
この波形は、RXTX_SEL[2] = 0 のときに、CNTVALUEIN[26:18] を使用して入力遅延を更新する場合のものです。この波形の開始時点では、{LD[2], CE[2], INC[2]} = 10x です。これは、CNTVALUEIN を使用して遅延ラインを更新することを示しています。
A
同じ遅延ライン (ここでは NIBBLESLICE[2] の入力遅延) に対して更新を繰り返す場合、グリッチを避けるために更新と更新の間に 3 サイクルの待ち時間が必要です。
B
報告される遅延が、実際に適用される遅延と一致しないことがあります。この影響を受けるのは更新された遅延ラインのみで、同じニブル内のほかの遅延ラインは正しく報告されます。
C
A から 3 サイクルが経過したため、C 以降で NIBBLESLICE[2] の入力遅延をグリッチなしに更新できます。B と C は 1 サイクル重複していることに注意してください。
C 以後
NIBBLESLICE[2] の入力遅延が正しく報告されます。これで遅延ラインの更新は完了したと見なすことができます。

次に、カスケード接続した遅延を更新する場合の波形を示します。この波形は NIBBLESLICE[2] を更新する場合のものですが、すべての NIBBLESLICE に共通です (その場合、CTRL_CLK を除く各信号のバスも異なる)。

図 2. カスケード接続した遅延ラインの更新
開始
この波形は、1 つの NIBBLESLICE の入力遅延と出力遅延をカスケード接続した遅延ラインを更新する場合のものです。カスケード接続した遅延ラインを更新するには、カスケード接続した入力遅延と出力遅延の両方を更新する必要があります。各遅延ラインには、目的とする遅延全体の半分の値 (New delay/2) をロードします。この場合、入力遅延 (RXTX_SEL[2] = 0) を最初に更新した後に、出力遅延 (RXTX_SEL[2] = 1) を更新します。図 1 に示した波形と同様、この波形も CNTVALUEIN[26:18] を使用して遅延を更新しています。この波形の開始時点では、{LD[2], CE[2], INC[2]} = 10x です。これは、CNTVALUEIN を使用して遅延ラインを更新することを示しています。
A (入力遅延/出力遅延)
同じ遅延ライン (ここでは NIBBLESLICE[2] の入力遅延/出力遅延) に対して更新を繰り返す場合、グリッチを避けるために更新と更新の間に 3 サイクルの待ち時間が必要です。
B (入力遅延/出力遅延)
報告される入力遅延/出力遅延が、実際に適用される遅延と一致しないことがあります。この影響を受けるのは更新された遅延ラインのみで、同じニブル内のほかの遅延ラインは正しく報告されます。ただし、入力遅延の A と出力遅延の B が重なる 3 サイクルでは、NIBBLESLICE[2] の入力遅延と出力遅延の報告値が実際に適用される遅延と一致しないことがあるため、注意が必要です。
C (入力遅延/出力遅延)
A から 3 サイクルが経過したため、C 以降で NIBBLESLICE[2] の入力遅延/出力遅延をグリッチなしに更新できます。
C 以後 (入力遅延)
NIBBLESLICE[2] の入力遅延が正しく報告されます。これで入力遅延の更新は完了したと見なすことができます。ただし、出力遅延の更新はまだ完了していません。
C 以後 (出力遅延)
NIBBLESLICE[2] の入力遅延および出力遅延が正しく報告されます。これでカスケード接続した遅延ラインの更新は完了したと見なすことができます。

BISC の手順 1 で得られる align_delay は、DELAY_VALUE_x を 0 に設定することで見積もることができます。入力遅延 (RXTX_SEL[x] = 0) の CNTVALUEOUT を読み出すと、NIBBLESLICE[x] の align_delay が報告されます。これを、同じニブル内のほかの NIBBLESLICE の align_delay の推定値として使用できます。align_delay に関するその他の注意事項を次に示します。

  • シミュレーションでは使用されません。
  • NIBBLESLICE ごとに計算されます。
  • 一度計算されたら、XPHY をリセットするまで変更されません。入力遅延を更新しても align_delay の値は変化しません。ただし、更新によって align_delay よりも少ないタップ数に遅延ラインを調整しようとして遅延値をロードした場合、align_delay の元の値が維持されます。たとえば、align_delay が 10 タップで、CNTVALUEIN から 5 タップをロードした場合、CNTVALUEOUT は 5 タップとなります (この値は align_delay より小さいため、VTC では補正されない)。その後、遅延ラインを 20 タップに更新すると、align_delay の値は元の 10 タップのままであるため、20 – 10 = 10 タップが VTC によって補正されます。
  • 入力遅延のみに存在し、出力遅延の場合、または BISC を使用しない場合 (SELF_CALIBRATE = DISABLE) は 0 と見なされます。
  • CNTVALUEOUT で報告される入力遅延には、align_delay が含まれます。たとえば、DELAY_VALUE_x が 100 タップで align_delay が 10 タップの場合、その NIBBLESLICE に対する CNTVALUEOUT の報告値は 110 タップとなります。
    • CNTVALUEOUT からは遅延ラインの合計タップ数が報告されるため、最初は align_delay と DELAY_VALUE_x を加算したタップ数が報告されます。ただし、ユーザーが PL から遅延をロードするなどして入力遅延ラインを更新した場合は、この更新値が総タップ数として扱われます。このため、CNTVALUEOUT からはユーザーが更新した遅延値と同じタップ数が報告されます。align_delay はその中に含まれており、加算されることはありません。詳細は、図 3 の例を参照してください。
  • align_delay はストローブ パスを追跡するため、VTC によって補正されません。VT の条件が変動すると、ストローブの伝搬遅延も変化します。
  • VTC は、遅延ラインの値から align_delay の値を引いたタップ数を補正します。
  • align_delay 未満のタップ数は VTC で補正されません。たとえば align_delay が 10 タップの場合、10 タップ未満の遅延は VTC で補正されません。ここでは、align_delay は VTC の「最低限度」としての役割を果たします。
  • 場合によっては (特にフルバンク デザイン)、align_delay が上限に達し、適切に動作しないことがあります。これを補正するために、XPHY4 にストローブ/キャプチャ クロックを入力します。
    重要: 1 つのバンク内のすべての XPHY ニブルで 1 つのインターフェイスを構成している場合 (フルバンク デザイン)、align_delay は最大 300 タップになります。align_delay は各 NIBBLESLICE の入力遅延に保存されるため、入力遅延に利用可能な遅延量が align_delay の分だけ減少します。

次の図に、align_delay、DELAY_VALUE_#、および VTC の関係を示します。最初の状態 (図の左側) では、DELAY_VALUE_# の 100 タップと align_delay の 10 タップにより、入力遅延は合計 110 タップとなります。ユーザーが遅延ラインを更新しても、align_delay のタップ数は維持されます (図の右側を参照)。

図 3. align_delay 値と VTC の関係

特定のニブルの 1 タップの概算時間値 (ps) を 1 つの NIBBLESLICE を使用して求める方法は次のとおりです。

  1. DELAY_VALUE_x を 0 以外の値に設定します。
  2. NIBBLESLICE[x] の出力遅延 (RXTX_SEL[x] = 1) の CNTVALUEOUT には、DELAY_VALUE_x で設定した遅延値のみが含まれます。したがって、このニブルの 1 タップの概算値 (ps/タップ) は、次式で求められます。
    1 タップの時間値 = DELAY_VALUE_x / NIBBLESLICE[x] の出力遅延の値

特定のニブルの 1 タップの概算時間値 (ps) は、次の方法でも求めることができます。

  1. DELAY_VALUE_a を 0 に設定し、DELAY_VALUE_b を 0 以外の値に設定します。入力遅延 (RXTX_SEL[a,b] = 0) の CNTVALUEOUT は次のとおりです。
    • CNTVALUEOUT[NIBBLESLICE[a]] = align_delay
    • CNTVALUEOUT[NIBBLESLICE[b]] = DELAY_VALUE_b + align_delay
  2. したがって、このニブルの 1 タップの概算値 (ps/タップ) は、次式で求められます。
    1 タップの時間値 = (CNTVALUEOUT[NIBBLESLICE[b]] - CNTVALUEOUT[NIBBLESLICE[a]]) / DELAY_VALUE_b

カスケード遅延を使用すると (CASCADE_x = TRUE)、NIBBLESLICE[x] の TX データパスは動作しなくなります。カスケード接続した遅延を使用する場合は、次の点に注意してください。

  • AMDでは、遅延全体の半分を入力遅延に、もう半分を出力遅延とすることを推奨しています。
  • CASCADE_x = TRUE とした NIBBLESLICE では、クロックとデータ間の挿入遅延は完全には補正されません。このため、通常はクロックとデータ間に約 65ps の遅延があります。これを考慮して、約 65ps を 2 で割った値を p-QTR 遅延と n-QTR 遅延の両方に加算してください。