ID 683621
Date 1/30/2024
Public

2.4.4.4.5. Scanning the Horizontal and Vertical Phases

Sweep the horizontal and vertical phases to get a two-dimensional eye diagram.

Note: The horizontal phase steps (left_phase and right_phase) correspond to zero BER in the previous sweep. The phase steps with no BER may wrap around, for example, from phase 110 to phase 20.
1. Create a 130*130 2D floating point array called ODI_error_count and initialize it to 0.
2. Create a 130*130 2D floating point array called ODI_pattern_count and initialize it to 0.
3. If DFE is disabled 28, repeat Step 5 to Step 37 two times:
1. In the first iteration, set 0x144[2] to 0x0 and 0x14D[0] to 0x0.
2. In the second iteration, set 0x144[2] to 0x1 and 0x14D[0] to 0x1.
4. If the DFE is enabled28, repeat Step 5 to Step 37 four times:
1. In the first iteration, set 0x144[2] to 0x0 and 0x14D[0] to 0x0.
1. If DFE_tap1_sign = 0, set 0x156[2] to 0x0.
2. If DFE_tap1_sign = 1, set 0x156[2] to 0x1.
2. In the second iteration, set 0x144[2] to 0x0 and 0x14D[0] to 0x1.
1. If DFE_tap1_sign = 0, set 0x156[2] to 0x1.
2. If DFE_tap1_sign = 1, set 0x156[2] to 0x0.
3. In the third iteration, set 0x144[2] to 0x1 and 0x14D[0] to 0x0.
1. If DFE_tap1_sign = 0, set 0x156[2] to 0x0.
2. If DFE_tap1_sign = 1, set 0x156[2] to 0x1.
4. In the fourth iteration, set 0x144[2] to 0x1 and 0x14D[0] to 0x1.
1. If DFE_tap1_sign = 0, set 0x156[2] to 0x1.
2. If DFE_tap1_sign = 1, set 0x156[2] to 0x0.
5. If the targeted device is H-tile production or H-tile ES3:
1. Set 0x100[4] to 0x1.
2. Set 0x0[7:0] to 0x01 to request PreSICE to calibrate the ODI samplers.
3. Read 0x481[2] until it becomes 0x0.
6. Set 0x171[4:1] to 0xB to configure the Avalon® memory-mapped interface testmux.
7. Set 0x157[3:2] to 0x2 to capture the odd eye.
8. Set integer variable vertical_phase to 0 and repeat Step 9 to Step 11 while incrementing vertical_phase until it reaches 126.
9. If the vertical phase < 0x3F:
1. Set 0x156[0] to 0x1 to capture the top half of the eye.
2. Set 0x143[7:2] to 0x3Fvertical_phase.
10. If the vertical phase >= 0x3F:
1. Set 0x156[0] to 0x0 to capture the bottom half of the eye.
2. Set 0x143[7:2] to vertical_phase0x3F.
11. Set an integer horizontal_phase to left_phase – 10 and repeat Step 12 to Step 36 while incrementing horizontal_phase until it reaches right_phase + 10.
1. If right_phase < left_phase, in other words, the eye is wrapped around, increment right_phase by 0x80.
12. If horizontal_phase is < 1, increment it by 0x80.
13. If horizontal_phase > 128, decrement it by 0x80.
14. Set 0x145[6:0] to the encoded horizontal_phase.
15. Set 0x168[2] to 0x0 to reset the serial bit counter.
16. Set 0x168[2] to 0x1 to release the reset on the serial bit counter.
17. Set 0x149[5:0] to 0x1C to read the ODI status.
18. Read 0x17E[1] 29 until it becomes 0x1 to indicate that the ODI has received the selected number of bits and has completed.
19. Set 0x149[5:0] to 0x1B to read the number of ODI error bits.
20. Read 0x17E[7:0] 29, and save it as an integer ODI_count_A.
21. Set 0x149[5:0] to 0x1A to read the number of ODI error bits.
22. Read 0x17E[7:0] 29, and save it as an integer ODI_count_B.
23. Set 0x149[5:0] to 0x19 to read the number of ODI error bits.
24. Read 0x17E[7:0] 29, and save it as an integer ODI_count_C.
25. Set 0x149[5:0] to 0x18 to read the number of ODI error bits.
26. Read 0x17E[7:0] 29, and save it as an integer ODI_count_D.
27. ODI_error_count[horizontal_phase][vertical_phase] = ODI_count_A * 224 + ODI_count_B * 216 + ODI_count_C * 28 + ODI_count_D + ODI_error_count[horizontal_phase][vertical_phase]
If the device is not H-tile production, the ODI_error_count may be greater than the actual count by 1.
28. Set 0x149[5:0] to 0x17 to read the number of ODI error bits.
29. Read 0x17E[7:0] 29, and save it as an integer ODI_pattern_A.
30. Set 0x149[5:0] to 0x16 to read the number of ODI error bits.
31. Read 0x17E[7:0] 29, and save it as an integer ODI_pattern_B.
32. Set 0x149[5:0] to 0x15 to read the number of ODI error bits.
33. Read 0x17E[7:0] 29, and save it as an integer ODI_pattern_C.
34. Set 0x149[5:0] to 0x14 to read the number of ODI error bits.
35. Read 0x17E[7:0] 29, and save it as an integer ODI_pattern_D.
36. ODI_pattern_count[horizontal_phase][vertical_phase] = ODI_pattern_A * 224 + ODI_pattern_B * 216 + ODI_pattern_C * 28 + ODI_pattern_D + ODI_pattern_count[horizontal_phase][vertical_phase]
37. Set 0x157[3:2] to 0x1 to capture the even eye, and repeat Step 8.
38. The BER at the horizontal phase and vertical phase = ODI_error_count[horizontal_phase][vertical_phase]/ODI_Pattern_count[horizontal_phase][vertical_phase].
28 To determine DFE mode, read 0x161[6]. DFE is disabled when 0x161[6] = 1.
29 Wait 25 µs between setting register 0x149[5:0] and reading 0x17E or 0x17F.