外部メモリー・インターフェイス Agilex™ 7 FシリーズおよびIシリーズFPGA IPユーザーガイド

ID 683216
日付 3/29/2024
Public
ドキュメント目次

11.10.5. 例: オンチップ・デバッグ・ポートでのキャリブレーション結果とマージンの読み取り

この例では、オンチップ・デバッグ・ポートを使用してキャリブレーション結果とマージンを読み取る方法について説明します。

次の例の値は、説明目的で示されているものであり、 Intel Agilex® 7 FPGA Fシリーズ開発キットに実装されているDDR4 RDIMM x72を使用するEMIFデザイン例から取得しています。

  1. 次のデータをグローバル・パラメーター・テーブル (GPT) から取得していると仮定します。
    アドレス フィールド名
    0x500_0000 gpt_GLOBAL_PAR_VER 0x00000002
    0x500_0004 gpt_NIOS_C_VER 0x00000001
    0x500_0008 gpt_COLUMN_ID 0x00000001
    0x500_000c gpt_NUM_IOPACKS 0x00000010
    0x500_0010 gpt_NIOS_CLK_FREQ_KHZ 0x0003D090
    0x500_0014 gpt_PARAM_TABLE_SIZE 0x000001A0
    0x500_0018 gpt_RESERVED 0x00000008
    0x500_001c gpt_GLOBAL_CAL_CONFIG 0x00000505
    0x500_0020 gpt_SLAVE_CLK_DIVIDER 0x0000001C
    0x500_0024 gpt_INTERFACE_PAR_PTRS_0 0x00000064
    0x500_0028 gpt_INTERFACE_PAR_PTRS_1 0x00000000
    0x500_002c gpt_INTERFACE_PAR_PTRS_2 0x00000000
    0x500_0030 gpt_INTERFACE_PAR_PTRS_3 0x00000000
    0x500_0034 gpt_INTERFACE_PAR_PTRS_4 0x00000000
    0x500_0038 gpt_INTERFACE_PAR_PTRS_5 0x00000000
    0x500_003c gpt_INTERFACE_PAR_PTRS_6 0x00000000
    0x500_0040 gpt_INTERFACE_PAR_PTRS_7 0x00000000
    0x500_0044 gpt_INTERFACE_PAR_PTRS_8 0x00000000
    0x500_0048 gpt_INTERFACE_PAR_PTRS_9 0x00000000
    0x500_004c gpt_INTERFACE_PAR_PTRS_10 0x00000000
    0x500_0050 gpt_INTERFACE_PAR_PTRS_11 0x00000000
    0x500_0054 gpt_INTERFACE_PAR_PTRS_12 0x00000000
    0x500_0058 gpt_INTERFACE_PAR_PTRS_13 0x00000000
    0x500_005c gpt_INTERFACE_PAR_PTRS_14 0x00000000
    0x500_0060 gpt_INTERFACE_PAR_PTRS_15 0x00000000
  2. 各インターフェイスのパラメーター・テーブルのベースアドレスを特定します。0以外の値をもつgpt_INTERFACE_PAR_PTRSは1つだけであるため、I/O行にあるEMIFインターフェイスは1つだけです。

    各インターフェイスのパラメーター・テーブルのベースアドレス = 0x500_0000 + 0x64 = 0x500_0064

  3. 0x500_0064のベースアドレスから始まる各インターフェイスのパラメーター・テーブルを読み取ります。各インターフェイスのパラメーター・テーブルの内容を次に示します。
    アドレス フィールド名
    Bit [31:24] Bit [23:16] Bit [15:8] Bit [7:0]
    0x500_0064 pt_INTERFACE_PAR_VER pt_IP_VER 0x00024C40
    0x500_0068 pt_UNUSED pt_DEBUG_DATA_PTR 0x000001A0
    0x500_006C pt_RESERVED pt_ CONTROLLER_ TYPE pt_ DIMM_ TYPE pt_ MEMORY_ TYPE 0x00000201
    0x500_0070 pt_AFI_CLK_FREQ_KHZ 0x000411AC
    0x500_0074 pt_ NUM_ RANKS pt_ WRITE_ LATENCY pt_ READ_ LATENCY pt_ BURST_ LEN 0x01121708
    0x500_0078 pt_ NUM_ DQ pt_ NUM_ DQS_RD pt_ NUM_ DQS_WR pt_ NUM_ DIMMS 0x48090901
    0x500_007C pt_CS_WIDTH pt_BANK_ WIDTH pt_ADDR_ WIDTH pt_NUM_DM 0x01021109
    0x500_0080 pt_BANK_ GROUP_ WIDTH pt_C_WIDTH pt_ODT_ WIDTH pt_CKE_ WIDTH 0x02000101
    0x500_0084 pt_NUM_ LRDIMM_CFG pt_CAL_ DATA_SIZE pt_CK_WIDTH pt_ADDR_ MIRROR 0x05140100
    0x500_0088 pt_NUM_ DATA_LANES pt_NUM_ CA_LANES pt_NUM_ CENTERS pt_NUM_AC_ ROM_ENUMS 0x09040434
    0x500_008C pt_ODT_TABLE_LO 0x00000004
    0x500_0090 pt_ODT_TABLE_HI 0x00000000
    0x500_0094 pt_RESERVED 0x0D00C081
    0x500_0098 pt_CAL_DATA_PTR pt_RESERVED 0x00B00000
    0x500_009C pt_DBG_SKIP_RANKS 0x00000000
    0x500_00A0 pt_DBG_SKIP_GROUPS 0x00000000
    0x500_00A4 pt_DBG_SKIP_STEPS 0x00670000
    0x500_00A8 pt_TILE_ID_PTR pt_NUM_DIMM pt_NUM_MR 0x00C4070C
    0x500_00AC pt_MR_PTR pt_PIN_ADDR_PTR 0x017000D8
  4. debug_data_structureのベースアドレスを特定します。
    Base address for debug_data_struct = 0x500_0000 + pt_DEBUG_DATA_PTR
                                       = 0x500_0000 + 0x1A0
                                       = 0x500_01A0
  5. 0x500_01A0のベースアドレスから始まるdebug_data_structを読み取ります。debug_data_structの内容を次に示します。
    アドレス パラメーター
    0x500_01A0 data_size 0x00000000
    0x500_01A4 status 0x00000006
    0x500_01A8 requested_command 0x000003E8
    0x500_01AC command_status 0x00000000
    0x500_01B0 command_parameters[0] 0x00000000
    0x500_01B4 command_parameters[1] 0x00000000
    0x500_01B8 command_parameters[2] 0x00000000
    0x500_01BC command_parameters[3] 0x00000000
    0x500_01C0 mem_summary_report_pointer 0x05000354
    0x500_01C4 mem_cal_report_pointer 0x050003A0
  6. 0x500_0354で始まるアドレスからmemory_summary_reportを読み取ります。
    • report_flags (アドレス = 0x500_0358) から読み取ります。readdataのLSBが1’b1になっている (キャリブレーション・レポートの準備完了を示している) ことを確認してから、memory_summary_report構造もしくはmem_cal_report構造の他のメンバーを読み取るようにしてください。
    • この例では、キャリブレーションが成功しているため、error_stageerror_grouperror_codeはいずれも0です。
    アドレス パラメーター
    0x5000354 data_size 0x00000013
    0x5000358 report_flags 0x01000001
    0x5000360 error_stage 0x00000000
    0x5000364 error_group 0x00000000
    0x5000368 error_code 0x00000000
    0x500039C in_out_rate 0x00000014
  7. 0x500_03A0で始まるアドレスからmem_cal_reportを読み取ります。
    アドレス パラメーター
    0x500_03A0 data_size 0x00000021
    0x500_03A4 debug_cal_data_struct_pointer__cal_data_dq_in 0x05000424
    0x500_03A8 debug_cal_data_struct_pointer__cal_data_dq_out 0x05000544
    0x500_03AC debug_cal_data_struct_pointer__cal_data_dm_dbi_in 0x05000664
    0x500_03B0 debug_cal_data_struct_pointer__cal_data_dm_dbi_out 0x05000688
    0x500_03B4 debug_cal_data_struct_pointer__cal_data_dqs_in 0x050006AC
    0x500_03B8 debug_cal_data_struct_pointer__cal_data_dqs_en 0x050006D0
    0x500_03BC debug_cal_data_struct_pointer__cal_data_dqs_en_b 0x050006F4
    0x500_03C0 debug_cal_data_struct_pointer__cal_data_dqs_out 0x05000718
    0x500_03C4 debug_cal_data_struct_pointer__vrefin 0x0500073C
    0x500_03C8 debug_cal_data_struct_pointer__vrefout 0x05000760
    0x500_03CC debug_cal_data_struct_pointer__cal_data_ca 0x05000784
    0x500_03D4 debug_cal_data_struct_pointer__vfifo* 0x05000878
    0x500_03D8 debug_cal_data_struct_pointer__lfifo* 0x05000884
    0x500_03DC debug_cal_data_struct_pointer__dcc_dq_in* 0x05000890
    0x500_03E0 debug_cal_data_struct_pointer__dcc_dq_out* 0x050008D8
    0x500_03E4 debug_cal_data_struct_pointer__dcc_dm_dbi_in* 0x05000920
    0x500_03E8 debug_cal_data_struct_pointer__dcc_dm_dbi_out* 0x0500092C
    0x500_03EC debug_cal_data_struct_pointer__dcc_dqs_in* 0x05000938
    0x500_03F0 debug_cal_data_struct_pointer__dcc_dqs_out* 0x05000944
    0x500_03F4 debug_cal_data_struct_pointer__dcc_ca* 0x05000950
    0x500_03F8 debug_cal_data_struct_pointer__vrefout_all_ranks* 0x05000984
    0x500_03FC debug_cal_data_struct_pointer__ctle_out* 0x05000990
    0x500_0400 debug_cal_data_struct_pointer__ctle_in_dq* 0x0500099C
    0x500_0404 debug_cal_data_struct_pointer__ctle_in_dqs* 0x050009E4
    0x500_040C write_lat 0x00000005
    0x500_0410 read_lat 0x0000000D
    0x500_0414 rank_skew_data_out 0x00000000
    0x500_0418 rank_skew_dqsen 0x00000000
    0x500_041C extra_rank_delay_any_to_read 0x00000000
    0x500_0420 extra_rank_delay_any_to_write 0x00000000
    注: * それぞれのアドレスには、4つのピンまたは4つのグループの設定が格納されます。
  8. アドレス0x0500_0424から始まるDQ入力設定 (読み出しパス) のキャリブレーション結果を読み取ります。
    • アドレス0x0500_0424のデータには、DQ[0] のキャリブレーション結果が含まれます。
    • アドレス0x0500_0428のデータには、DQ[1] のキャリブレーション結果が含まれます。
    • アドレス0x0500_042Cのデータには、DQ[2] のキャリブレーション結果が含まれます。その他も同様に続きます。

    各アドレスのデータは次のとおりです。

    • Bit[15:0] はキャリブレーションされた設定に対応します。
    • Bit[23:16] は左側エッジのマージンに対応します。
    • Bit[31:24] は右側エッジのマージンに対応します。
  9. 他のピンについてもステップ8を繰り返します。
  10. アドレス0x0500_073Cから開始するVrefin設定を読み取ります。
    • アドレス0x0500_073Cのデータには、グループ0のキャリブレーション結果が含まれます。
    • アドレス0x0500_0740のデータには、グループ1のキャリブレーション結果が含まれます。その他も同様に続きます。

    Vrefin/Vrefoutのキャリブレーション設定の場合

    • Bit[15:8] はVref_rangeに対応します。
      • Vref_range =0は、VCCIO/VREFDQの60から92.5%の範囲を意味します。
      • Vref_range =1は、VCCIO/VREFDQの45から77.5%の範囲を意味します。
    • Bit[7:0] はVref_settingに対応しており、各ステップは0.65%です。
    例えば、DDR4の場合、VCCIO/VREFDQは1.2Vです。0x122を取得していると仮定すると、次のようになります。
    • Vref_range = 0x1
    • Vref_setting = 0x22 = 34 (10進数)

    ボルト単位のVref値 = ((34*0.0065) + 0.45) x 1.2V = 0.805V

  11. アドレス0x05000354から始まるmem_summary_reportを読み取ります。
    • 0x5000360のデータは、キャリブレーションが最初に失敗した段階を示します (ENUM_CAL_STAGE)。
    • 0x5000364のデータには、グループごとのステータスが含まれます。各ビットはdqsグループに対応します。ビットが1に設定されている場合、対応するグループはerror_stageで示されているステージで失敗しています。
    • 0x5000368のデータには、詳細なキャリブレーション・ステータスが含まれます (ENUM_CAL_ERROR)。
  12. 8ビット・データとして保存されるキャリブレーション設定 (例えば、vfifo、lfifo、dcc*、ctle*) では、各アドレスには4ピンまたは4グループの設定が格納されます。9つのDQSグループに実装されているこのインターフェイスのvfifo設定を読み取る場合は、アドレス0x500_0878、0x500_087C、0x500_0880からデータを読み取るだけで十分です。
    • アドレス0x500_0878のビット [7:0] = グループ0のvfifo設定
    • アドレス0x500_0878のビット [15:8] = グループ1のvfifo設定
    • アドレス0x500_0878のビット [23:16] = グループ2のvfifo設定
    • アドレス0x500_0878のビット [31:24] = グループ3のvfifo設定
    • アドレス0x500_087Cのビット [7:0] = グループ4のvfifo設定
    • アドレス0x500_087Cのビット [15:8] = グループ5のvfifo設定
    • アドレス0x500_087Cのビット [23:16] = グループ6のvfifo設定
    • アドレス0x500_087Cのビット [31:24] = グループ7のvfifo設定
    • アドレス0x500_0880のビット [7:0] = グループ9のvfifo設定
  13. すべてのdebug_cal_dataは、すべてが1の値で初期化されます。特定のキャリブレーション・データ (dcc関連のキャリブレーションなど) ですべてが1の値を取得している場合は、キャリブレーション後に値が上書きされていないことを意味し、無視することができます。