Hello,
We have a design with i.MX6Q and 1GB DDR3. We use the same four Micron DDR3 chips than the SabreSD reference board, but we are not using the T topology. We are using 'fly-by' topology.
We have run the calibration utility using the SabreSD init script given with it (MX6Q_SabreSD_DDR3_register_programming_aid_v1.5.inc) and got different results on two identical boards (same layout).
I have some questions regarding the calibration process:
1) *Write leveling*
The calibration script says:
// write leveling, based on Freescale board layout and T topology
// For target board, may need to run write leveling calibration
// to fine tune these settings
// If target board does not use T topology, then these registers
// should either be cleared or write leveling calibration can be run
setmem /32 0x021b080c = 0x001F001F
setmem /32 0x021b0810 = 0x001F001F
setmem /32 0x021b480c = 0x001F001F
setmem /32 0x021b4810 = 0x001F001F
Considering our board's 'fly-by' topology, should we set these to 0x00000000 and then rerun the calibration?
Or should we use the values calculated in the first calibration (which ran with default value 0x001F001F) and then rerun the calibration?
The manual also states: "If write-leveling delay is larger than 0x2f, it is suggested to set the WALAT value on MMDCx_MDMISC register to 1 in the initialization script and re-run the DDR_Stress_Tester."
To begin with, I don't understand this note. 0x2f is around 1/5 of a cycle. If this register is capable of producing up to half a cycle skew, why does the calibration manual recommended to set WALAT to 1? The datasheet recommends to set WALAT if the delay is around half a
cycle, not around 1/5.
In the results from my first calibration, three bytes are slightly over this 0x2f value.
2) *MMDC Duty cycle fine tuning*
The SabreSD calibration script states:
//For i.mx6qd parts of versions A & B (v1.0, v1.1), uncomment the following lines. For version C (v1.2), keep commented
//setmem /32 0x021b08c0 = 0x24911492 // fine tune SDCLK duty cyc to low - seen to improve measured duty cycle of i.mx6
//setmem /32 0x021b48c0 = 0x24911492
How can I determine if my board needs such a fine tuning?
What can I expect to improve/worsen when playing with these settings?
3) *RALAT*
The SabreSD calibration script states:
//NOTE about MDMISC RALAT:
//MDMISC: RALAT kept to the high level of 5 to ensure stable operation at 528MHz.
//MDMISC: consider reducing RALAT if your 528MHz board design allow that. Lower RALAT benefits:
//a. better operation at low frequency
//b. Small performence improvment
How do I determine if a certain RALAT value improves or worsens the DDR3 behavior?
4) *Calibration*
After a first calibration, I must take the results, write them to the calibration script and rerun the calibration, right?
After the second calibration, should I do the same one more time? Twice more, three times? How do I know when to stop?
What if I see different values on different identical boards? How much difference in the calculated values is reasonable?
Should I always use the most conservative values (longest delays) among all the boards I calibrate? Or the average value?
Thank you for your help.
Kind regards,
--
Héctor Palacios
Solved! Go to Solution.
Hi Hector,
The latest stress tool is v1.0.2
https://community.freescale.com/docs/DOC-96412
Also, from the design team, recommendations of using the stress tool and calibration is below.
https://community.freescale.com/docs/DOC-94917
https://community.freescale.com/docs/DOC-96412
One more comment I found:
WALAT should be 1 for any WL value > 0x2f. The reason is because the Write Postamble (Period of time that DQS strobe remains low before going to idle) must be greater than 0.4x the clock period (JEDEC Standard). Once the write burst begins, the DDR PHY does not keep track of how long the DQS strobes need to complete the write burst. The DDR PHY only counts whole cycles, and then takes back control of the DQS strobe lines (force to idle) when it thinks the burst is done. If WL = 0x00, this will be one-half clock period after the last falling edge of the DQS strobe. But for larger values of WL, the DDR PHY will place the strobe traces in idle closer and closer the last falling edge (making Postamble shorter and shorter). If WL =0x100 (one-half cycle), then the DDR PHY will return the DQS strobe to idle just as it is trying to complete the last falling edge. It is not that we are just meeting the JEDEC standard, but there does need to be a large enough time after the last falling edge so that the edge is clean and read correctly by the DDR device.
For MMD Cduty cycle fine tuning, you should run a scope on the SDCLK signals.
Let me know if this helps.
Regards,
Peter
Hello,
I ran the calibration using the default SabreSD configuration file. Then I took the results and overwrote the configuration file with them.
I reran the calibration a second time and got new results.
After five iterations results converge.
Using these final calibration values I run the DDR3 stress test and I get failures.
Once I got one bit error:
Address of bank3 failure: 0x380599c0
Data was: 0xAAAAAAABAAAAAAAA
But pattern was: 0xAAAAAAAAAAAAAAAA
But other times I got a failure although the patterns match:
Address of bank3 failure: 0x3802c7c0
Data was: 0xAAAAAAAAAAAAAAAA
But pattern was: 0xAAAAAAAAAAAAAAAA
The stress test passed ok with default SabreSD values, but not with the values result of the calibration.
So how should I interpret this? Can't I trust the calibration results?
--
Hector Palacios
What version of the DDR Stress Tool are you using? The latest one has some patch. that fixes this issue.
I do not want to say yet that it is a bug in the tool if I am not sure the version that you are using but seems that you can interpret that you do not having a failure.
Hector
Had your issue got resolved? If yes, we are going to close the discussion in 3 days. If you still need help, please feel free to reply with an update to this discussion.
Thanks,
Yixing
Yes, thank you. I think I have enough information now.
Hi Hector,
The latest stress tool is v1.0.2
https://community.freescale.com/docs/DOC-96412
Also, from the design team, recommendations of using the stress tool and calibration is below.
https://community.freescale.com/docs/DOC-94917
https://community.freescale.com/docs/DOC-96412
One more comment I found:
WALAT should be 1 for any WL value > 0x2f. The reason is because the Write Postamble (Period of time that DQS strobe remains low before going to idle) must be greater than 0.4x the clock period (JEDEC Standard). Once the write burst begins, the DDR PHY does not keep track of how long the DQS strobes need to complete the write burst. The DDR PHY only counts whole cycles, and then takes back control of the DQS strobe lines (force to idle) when it thinks the burst is done. If WL = 0x00, this will be one-half clock period after the last falling edge of the DQS strobe. But for larger values of WL, the DDR PHY will place the strobe traces in idle closer and closer the last falling edge (making Postamble shorter and shorter). If WL =0x100 (one-half cycle), then the DDR PHY will return the DQS strobe to idle just as it is trying to complete the last falling edge. It is not that we are just meeting the JEDEC standard, but there does need to be a large enough time after the last falling edge so that the edge is clean and read correctly by the DDR device.
For MMD Cduty cycle fine tuning, you should run a scope on the SDCLK signals.
Let me know if this helps.
Regards,
Peter
In the mentioned AN4467, please use sections 11.2 (Hardware Write Leveling Calibration Sequence) and
19.1 (DDR3 Write Leveling Code Example)
You can take a look to the this Application Note
http://cache.freescale.com/files/32bit/doc/app_note/AN4467.pdf
saludos