L'esempio di simulazione Intel® Agilex™ PHYLite con riconfigurazione dinamica attivata dovrebbe mostrare un esempio di riconfigurazione dinamica che funziona modificando il ritardo dell'interpolatore tramite gli stimoli del traffico. Tuttavia, a causa di un problema nella Intel Quartus® Prime Pro Edition Software versione 20.4, gli stimoli del traffico nella progettazione dell'esempio di simulazione PHYLite Intel Agilex non invia alcun traffico all'IP di calibrazione se il gruppo PHYLite è impostato sul tipo di pin di input perché la fase dell'interpolatore è impostata su un valore hardcoded.
Nota: questo problema non si verifica se il gruppo PHYLite è impostato su Tipo pin di output o tipo di pin bidirezionale.
Per risolvere questo problema nella Intel® Quartus® Prime Pro Edition Software versione 20.4, la fase di interpolazione non deve essere un valore hardcoded, il che richiede alcune modifiche ai file phylite_tester.sv e test_logic_iossm.sv per consentire agli stimoli del traffico di leggere la fase dell'interpolatore, aumentare il valore di lettura, quindi modificare la fase di interpolazione al nuovo valore.
Eseguire le seguenti modifiche al file denominato "phylite_tester.sv":
1. Riga #159: rimuovere la dichiarazione di stato PHASE DELAY e aggiungere due stati di dichiarazione: CORE_PHASE_DELAY e IO_PHASE_DELAY
2. Riga n. 177: cambiare da
assegnare iossm_test_start = (prbs_fsm == PHASE_DELAY);
A
assegnare iossm_test_start = (prbs_fsm == CORE_PHASE_DELAY);
3. Linea n. 323: modificare il segnale prbs_fsm in stato INIT da
prbs_fsm <= (CHANNEL_PIN_TYPE == "INPUT") ? IO_DRIVE : ((IOSSM_TEST_EN == 1) ? PHASE_DELAY: CORE_DRIVE);
A
prbs_fsm <= (IOSSM_TEST_EN == 1) ? (CHANNEL_PIN_TYPE == "INPUT"? IO_PHASE_DELAY: CORE_PHASE_DELAY) : (CHANNEL_PIN_TYPE == "INPUT"? IO_DRIVE: CORE_DRIVE);
4. Linea n. 338: cambiare il segnale prbs_fsm in stato IO_CHECK da
prbs_fsm <= (CHANNEL_PIN_TYPE == "OUTPUT") ? ((IOSSM_TEST_EN == 1) ? PHASE_DELAY: CORE_DRIVE) : IO_DRIVE;
A
prbs_fsm <= (IOSSM_TEST_EN == 1) ? (CHANNEL_PIN_TYPE == "OUTPUT"? CORE_PHASE_DELAY: IO_PHASE_DELAY): (CHANNEL_PIN_TYPE == "OUTPUT"? CORE_DRIVE: IO_DRIVE);
5. Linea n. 338: modificare il segnale prbs_fsm in CORE_CHECK stato da
prbs_fsm <= (CHANNEL_PIN_TYPE == "INPUT") ? IO_DRIVE: ((IOSSM_TEST_EN == 1) ? PHASE_DELAY: CORE_DRIVE);
A
prbs_fsm <= (IOSSM_TEST_EN == 1) ? (CHANNEL_PIN_TYPE == "INPUT"? IO_PHASE_DELAY: CORE_PHASE_DELAY) : (CHANNEL_PIN_TYPE == "INPUT"? IO_DRIVE: CORE_DRIVE);
6. Riga n. 341: rimuovere
PHASE_DELAY: iniziare
if (core_checker_failed | io_checker_failed)
prbs_fsm <= CHECKER_FAILED;
else if (iossm_phase_shift_done)
prbs_fsm <= CORE_DRIVE;
Fine
e sostituire con questi due
IO_PHASE_DELAY: iniziare
if (core_checker_failed | io_checker_failed)
prbs_fsm <= CHECKER_FAILED;
else if (iossm_phase_shift_done)
prbs_fsm <= IO_DRIVE;
Fine
CORE_PHASE_DELAY: iniziare
if (core_checker_failed | io_checker_failed)
prbs_fsm <= CHECKER_FAILED;
else if (iossm_phase_shift_done)
prbs_fsm <= CORE_DRIVE;
Fine
Eseguire le seguenti modifiche al file denominato "test_logic_iossm.sv":
1. Riga n. 43: modificare il valore di IOSSM_INIT_PIN_DELAY a 196
2. Dopo la riga n. 45: aggiungere la dichiarazione dei parametri locali:
localparam WAIT_INTERVAL = 8;
3. Riga n. 59: aggiungere questi tre seguenti stati dopo IOSSM_WAIT_REQ
IOSSM_PRE_READ,
IOSSM_PRE_RDATA,
IOSSM_PRE_WAIT,
4. Riga n. 72: cambiare da
se (!reset_n) inizia
pin_dly_write <= IOSSM_INIT_PIN_DELAY;
prev_pin_dly_write <= IOSSM_INIT_PIN_DELAY;
end else if (cal_debug_write & !cal_debug_waitrequest)begin
prev_pin_dly_write <= pin_dly_write;
pin_dly_write <= pin_dly_write IOSSM_DELAY_STEP;
Fine
A
se (!reset_n) inizia
pin_dly_write <= 0;
prev_pin_dly_write <= 0;
end else if (cal_debug_read_data_valid &iossm_fsm == IOSSM_PRE_RDATA) iniziano
prev_pin_dly_write <= IOSSM_DELAY_STEP[IOSSM_PIN_DELAY_WIDTH-1:0] cal_debug_read_data;
pin_dly_write <= IOSSM_DELAY_STEP cal_debug_read_data[IOSSM_PIN_DELAY_WIDTH-1:0];
Fine
5. Riga n. 85: cambiare da
end else if (cal_debug_read_data_valid) inizia
A
end else if (cal_debug_read_data_valid &iossm_fsm == IOSSM_RDATA) iniziano
6. Linea n. 108: cambiare iossm_fsm segnale in stato IOSSM_INIT da
iossm_fsm <= IOSSM_WRITE;
A
iossm_fsm <= IOSSM_PRE_READ;
7. Dopo IOSSM_INIT stato, aggiungere questi due stati seguenti:
IOSSM_PRE_READ: iniziare
if (!cal_debug_waitrequest)
iossm_fsm <= IOSSM_PRE_RDATA;
Fine
IOSSM_PRE_RDATA: iniziare
if (cal_debug_read_data_valid)
iossm_fsm <= IOSSM_WRITE;
Fine
8. Riga n. 139: cambiare da
assegnare cal_debug_read = iossm_fsm == IOSSM_READ;
A
assign cal_debug_read = (iossm_fsm == IOSSM_READ) || (iossm_fsm == IOSSM_PRE_READ);
9. Riga n. 146: cambiare da
assegnare wait_done = (req_wait_interval == 7) ? 1 : 0;
A
assegnare wait_done = (req_wait_interval == WAIT_INTERVAL-1) ? 1 : 0;
Questo problema è risolto a partire dal software Intel® Quartus® Prime Pro Edition versione 21.1.