Visible to Intel only — GUID: kkc1590022414772
Ixiasoft
Visible to Intel only — GUID: kkc1590022414772
Ixiasoft
11.10.4.1. Debug Data Structures
debug_data_struct (pt_DEBUG_DATA_PTR)
The debug_data_struct’s base address is equal to: (user_ram base address) + (offset for debug_data_struct, read from pt_DEBUG_DATA_PTR)
- An interface by which to view the state of calibration, by checking the status bit in the debug_data_struct:
- Bit 1 is set if calibration has started.
- Bit 2 is set if calibration has finished.
- An interface by which to send commands to the firmware (available commands are described by ENUM_INTERFACE_COMMANDS) and receive response codes about the command status (recognized status codes are described by ENUM_DEBUG_INTERFACE_COMMAND_STATUS_CODES). Sending a command should follow this procedure:
- Wait for command_status to be TX_STATUS_CMD_READY.
- Set any relevant command_parameters for the desired command (described in ENUM_INTERFACE_COMMANDS).
- Set the requested_command code (ENUM_INTERFACE_COMMANDS).
- Wait for command_status to be TX_STATUS_RESPONSE_READY.
- Set requested_command code to CMD_RESPONSE_ACK to acknowledge the response was received.
- Any following command can be send once command_status returns to the value TX_STATUS_CMD_READY.
- A pointer to mem_summary_report, which provides a more detailed status of calibration.
- A pointer to mem_cal_report, which provides details of settings that were decided during calibration (such as delay settings, margins, vref settings, and so forth).
Example 1: Steps to Request Full EMIF Recalibration
- Read from command_status. Wait until the readdata=32’h0000_0000 (TX_STATUS_CMD_READY)
- Write to command_parameters[0] with writedata=Interface_ID that you want to calibrate. (If you have only one interface, set the writedata=32’h0000_0000.)
- Write to command_parameters[1] with writedata=32’h0000_0003(DYNAMIC_FULL_RECAL). (Refer to ENUM_INIT_MODE table for other supported calibration options.)
- Write to requested_command with writedata=32’h0000_0005(RUN_MEM_CALIBRATE).
- Read from command_status. Wait until the readdata=32’h0000_0003 (TX_STATUS_RESPONSE_READY).
- Write to requested_command with writedata=32’h0000_0001(CMD_RESPONSE_ACK).
Example 2: Set the Starting value of VREF_OUT and Recalibrate EMIF using New Starting Value
- Read from command_status. Wait till the readdata=32’h0000_0000 (TX_STATUS_CMD_READY).
- Set the new VREF_OUT. Refer to debug_cal_data_struct for information on how to determine the Vref_setting and Vref_range.
- Write to command_parameters[0] with writedata=Vref_setting.
- Write to command_parameters[1] with writedata=Vref_range.
- Write to requested_command with writedata=32’h0000_001B(SET_VREF_OUT).
- Read from command_status. Wait till the readdata=32’h0000_0003 (TX_STATUS_RESPONSE_READY).
- Write to requested_command with writedata=32’h0000_0001(CMD_RESPONSE_ACK).
- Request Recalibration. Follow steps in Example 1 but set init_mode to SKIP_INIT_VREF.
Example 3: Hardcode the VREF_IN and VREF_OUT and bypass the VREFCAL in next EMIF Recalibration
- Set the new VREF_OUT. Refer to debug_cal_data_struct for information on how to determine the Vref_setting and Vref_range.
- Read from command_status. Wait till the readdata=32’h0000_0000 (TX_STATUS_CMD_READY).
- Write to command_parameters[0] with writedata=Vref_setting.
- Write to command_parameters[1] with writedata=Vref_range.
- Write to requested_command with writedata=32’h0000_001B(SET_VREF_OUT).
- Read from command_status. Wait till the readdata=32’h0000_0003 (TX_STATUS_RESPONSE_READY).
- Write to requested_command with writedata=32’h0000_0001(CMD_RESPONSE_ACK).
- Set the new VREF_IN. Refer to debug_cal_data_struct for information on how to determine the Vref_setting and Vref_range.
- Read from command_status. Wait till the readdata=32’h0000_0000 (TX_STATUS_CMD_READY).
- Write to command_parameters[0] with writedata=Vref_setting.
- Write to requested_command with writedata=32’h0000_001A(SET_VREF_IN).
- Read from command_status. Wait till the readdata=32’h0000_0003 (TX_STATUS_RESPONSE_READY).
- Write to requested_command with writedata=32’h0000_0001(CMD_RESPONSE_ACK).
- Set the calibration to skip VREF_IN can VREF_OUT.
- Read from command_status. Wait till the readdata=32’h0000_0000 (TX_STATUS_CMD_READY).
- Write to command_parameters[0] with writedata=32'h 0000 C000 (CALIB_SKIP_VREFIN_CAL | CALIB_SKIP_VREFOUT_CAL).
- Write to requested_command with writedata= 32'h 0000 001E (SET_SKIP_STEPS).
- Read from command_status. Wait till the readdata=32’h0000_0003 (TX_STATUS_RESPONSE_READY).
- Start EMIF calibration. Follow the same steps as in example 1, but set init_mode to SKIP_INIT_VREF.
Parameter | Offset Within Structure | Size | Purpose |
---|---|---|---|
data_size | 0 | 32 | size of this structure (in bytes). |
status | 4 | 32 | output: calibration status (ENUM_CAL_ERROR). |
requested_command | 8 | 32 | input: a command that the user wishes for firmware to perform (ENUM_INTERFACE_COMMANDS). |
command_status | 12 | 32 | output: status of the command that a user requested (ENUM_DEBUG_INTERFACE_COMMAND_STATUS_CODES). |
command_parameters[0] | 16 | 32 | input: a parameter for a requested_command. The relevant parameters for each command are described in ENUM_DEBUG_INTERFACE_COMMANDS. |
command_parameters[1] | 20 | 32 | input: a parameter for a requested_command. The relevant parameters for each command are described in ENUM_DEBUG_INTERFACE_COMMANDS. |
command_parameters[2] | 24 | 32 | input: a parameter for a requested_command. The relevant parameters for each command are described in ENUM_DEBUG_INTERFACE_COMMANDS. |
command_parameters[3] | 28 | 32 | input: a parameter for a requested_command. The relevant parameters for each command are described in ENUM_DEBUG_INTERFACE_COMMANDS. |
mem_summary_report_pointer | 32 | 32 | output: pointer to the mem_summary_report structure. |
mem_cal_report_pointer | 36 | 32 | output: pointer to the mem_cal_report structure. |
mem_summary_report (mem_summary_report_pointer)
This structure provides details about the status of calibration.
Parameter | Offset Within Structure | Size | Comments |
---|---|---|---|
data_size | 0 | 32 | The size of this structure (in bytes). |
report_flags | 4 | 32 | bit[0]: is 1 if report is ready, and all the registers below are valid. bits[23:1]: reserved for future use. bits[31:24]: version number of this report. |
error_stage | 12 | 32 | The first stage at which calibration has failed (ENUM_CAL_STAGE). |
error_group | 16 | 32 | Each bit corresponds to a dqs group. If a bit is set 1, then the corresponding group failed in the stage indicated by error_stage. |
error_code | 20 | 32 | Detailed calibration status (ENUM_CAL_ERROR). |
in_out_rate | 72 | 8 | bits [7:4] = out_rate = vco : mem_clk. bits [3:0] = in_rate = mem_clk : phy_clk ratio. |
cur_interface_idx | 32 | 32 | ID of the interface to which the stored debug information applies — that is, the latest interface to have been calibrated. |
mem_cal_report (mem_cal_report_pointer)
This structure provides details of settings observed during calibration (such as delay settings, margins, vref settings, etc).
Parameter | Offset Within Structure | Number of Elements in Array (1 if not an array) | Size of Each Element in Array |
---|---|---|---|
data_size | 0 | 1 | 32 |
debug_cal_data_struct_pointer__cal_data_dq_in | 4 | num_dq | 32 |
debug_cal_data_struct_pointer__cal_data_dq_out | 8 | num_dq | 32 |
debug_cal_data_struct_pointer__cal_data_dm_dbi_in | 12 | num_dm | 32 |
debug_cal_data_struct_pointer__cal_data_dm_dbi_out | 16 | num_dm | 32 |
debug_cal_data_struct_pointer__cal_data_dqs_in | 20 | num_dqs_rd | 32 |
debug_cal_data_struct_pointer__cal_data_dqs_en | 24 | num_dqs_rd | 32 |
debug_cal_data_struct_pointer__cal_data_dqs_en_b | 28 | num_dqs_rd | 32 |
debug_cal_data_struct_pointer__cal_data_dqs_out | 32 | num_dqs_wr | 32 |
debug_cal_data_struct_pointer__vrefin | 36 | num_dqs_rd | 32 |
debug_cal_data_struct_pointer__vrefout | 40 | num_dqs_wr | 32 |
debug_cal_data_struct_pointer__cal_data_ca | 44 | num_ac_rom_enums | 32 |
debug_cal_data_struct_pointer__vfifo | 52 | num_dqs_rd | 8 |
debug_cal_data_struct_pointer__lfifo | 56 | num_dqs_rd | 8 |
debug_cal_data_struct_pointer__dcc_dq_in | 60 | num_dq | 8 |
debug_cal_data_struct_pointer__dcc_dq_out | 64 | num_dq | 8 |
debug_cal_data_struct_pointer__dcc_dm_dbi_in | 68 | num_dm | 8 |
debug_cal_data_struct_pointer__dcc_dm_dbi_out | 72 | num_dm | 8 |
debug_cal_data_struct_pointer__dcc_dqs_in | 76 | num_dqs_rd | 8 |
debug_cal_data_struct_pointer__dcc_dqs_out | 80 | num_dqs_wr | 8 |
debug_cal_data_struct_pointer__dcc_ca | 84 | num_ac_rom_enums | 8 |
debug_cal_data_struct_pointer__vrefout_all_ranks | 88 | num_dqs_wr | 8 |
debug_cal_data_struct_pointer__ctle_out | 92 | num_dqs_wr | 8 |
debug_cal_data_struct_pointer__ctle_in_dq | 96 | num_dq | 8 |
debug_cal_data_struct_pointer__ctle_in_dqs | 100 | num_dqs_rd | 8 |
write_lat | 108 | 1 | 32 |
read_lat | 112 | 1 | 32 |
rank_skew_data_out | 116 | 1 | 32 |
rank_skew_dqsen | 120 | 1 | 32 |
extra_rank_delay_any_to_read | 124 | 1 | 32 |
extra_rank_delay_any_to_write | 128 | 1 | 32 |
debug_cal_data_struct
This data structure is instantiated many times and is pointed to by each debug_cal_data_struct_pointer__* in the mem_cal_report. The setting field stores the chosen setting for the given parameter, while the left_edge and right_edge fields store the offset from the setting, for which transactions were found to still pass. To interpret the values stored, observe the following:
- For a timing parameter, all three fields are stored in taps.
- For a voltage parameter, the setting field is as follows:
- Bits[15:8] = vref_range. This is set during IP parameterization.
- Value 0 has a range of 60-92.5% of the VCCIO/VREFDQ.
- Value 1 has range of 45-77.5% of the VCCIO/VREFDQ.
- Bits[7:0] = vref_setting decided during calibration, as the number of incremental steps within the range (where each step is 0.65%).
For example, in DDR4, the VCCIO voltage is 1.2V. So, given the setting = 0x0122:
Vref_range=1, vref_setting=34
Therefore, to calculate the Vref value in volts: ((34 × 0.0065) + 0.45) × 1.2V) = 0.805V
- Bits[15:8] = vref_range. This is set during IP parameterization.
Parameter | Offset Within Structure | Size |
---|---|---|
setting | 0 | 16 |
left_edge | 2 | 8 |
right_edge | 3 | 8 |