This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

TMS320C6670: DDR3 Leveling Issues on migration from Micron MT41K256M16HA-125 to MT41K256M16TW-107

Part Number: TMS320C6670
Other Parts Discussed in Thread: TMS320C6657, TMS320C6674

Our design targets the TMSC6670 and we found a few years back that there are Advisories called out in the TMS320C6670 Multicore Fixed and Floating-Point System-on-Chip Silicon Errata document.  Advisory 30 relates to a DDR3 Automatic Leveling Issue, so Workaround 3 was our choice for addressing it.  This worked with no issues for several build lots of boards until we switched from Micron MT41K256M16HA-125 XIT DDR3 to (supposedly backward compatible) Micron MT41K256M16TW-107 XIT on a 4th lot of boards.

 

Then there is Advisory 31 concerning a DDR3 Incremental Write Leveling Issue.  The workaround states that…

“At this time, incremental write leveling is not supported on this device. It is

recommended that the incremental write leveling intervals in RDWR_LVL_CTRL and

RDWR_LVL_RMP_CTRL be programmed to 0 to disable this feature.”

This issue impacts only the incremental write leveling feature of the DDR3 Memory controller and no issues were expected with automatic write leveling due to the errata, so we’ve made sure not to enable incremental write leveling.

 

I have verified that changing the ODT settings, disabling ODT altogether, or even changing DDR3 timing parameters for the new -107 part have not affected/corrected the DDR3 issues we see.

The only modification that corrects our issues is to leave incremental leveling enabled after first doing a fully automatic leveling sequence.

 

 

When browsing through the TI E2E Community website I see several users who have experienced similar DDR3 issues and have also noticed varying responses from the TI Apps Engineers on the matter.  For instance TI Hardware Applications Engineer Tom Johnson has posted several replies to people who’ve had problems, but has recommended partial auto-leveling (see Partial Automatic Leveling vs Full Automatic leveling):

 

This leads me to the questions…

1.       What mode of leveling is recommended specifically for the TMCC6670?

2.       If we do switch to Partial Automatic Leveling and keep it enabled (as is done in the TI .GEL file) by leaving the RDWR_LVL_EN field of the RDWR_LVL_RMP_CTRL set/enabled, does this lower the throughput of the DDR3 controller interface even though all other RDWR_LVL_CTRL bits remain 0?

3.    If incremental leveling is left enabled (RDWR_LVL_RMP_CTRL = 0x80000000; RDWR_LVL_CTRL = 0x80000000;) how does the C6670 DDR3 controller behave differently with the remaining control bits 30:0 all set to zero in this register?

 

Note: Disabling the RDWR_LVL_EN field bit after completing the auto-leveling or incremental leveling is what seems to break DDR3 reads/writes on boards with MT41K256M16TW-107 XIT DDR3

  • Hi,

    We're looking into this.

    Best Regards,
    Yordan
  • Kedric,

    You have reviewed several posts.  You should have seen multiple that clearly recommend use of Partial Automatic Leveling.  This is because that is the simplest, it is the leveling method implemented in all sample code and GEL files and it has been successfully used by many, many customers.  Also in your research you will find many threads where customers encounter difficulty with Full Automatic Leveling.  I know that there are customers successfully using it but some had significant issues getting it robust.

    Based on your questions, there is a lack of understanding about DDR3 leveling and the related errata.  The C6670 (all C667x) PHY supports three leveling steps.  These are write leveling, read 'eye' leveling and read 'gate' training.  The PHY implementation that has 2 parts to each: start-up leveling and incremental leveling.  Advisory 30 discusses a flaw in the read eye leveling portion of the start-up leveling.  The workaround recommended is implemented as Partial Automatic Leveling.  Advisory 31 discusses an implementation issue with the write leveling portion of the incremental leveling process.  The read eye and read gate portions of incremental leveling are unaffected.

    The KeyStone I DDR3 Initialization Application Report (SPRABL2E) discusses the leveling process in significant detail and provides the proper command order and timing to enable the supported leveling modes.  It also links to two spreadsheet tools that must be completed to properly commission the DDR3 interface.  This wiki page also provides an overview of the commissioning steps:  http://processors.wiki.ti.com/index.php/KeyStone_I_DDR3_Interface_Bring-up

    Your original issue was related to problems seen testing with a newer SDRAM that you assumed would be a drop-in replacement.  The newer device is assumed to meet the required timing since all of the timing parameters are same or shorter than the original part.  However, faster parts have faster slew rates.  This may cause an increase in overshoots and undershoots and may also cause additional timing jitter due to crosstalk.

    I recommend that you revert to Partial Automatic Leveling to see if you get improvement.  You will also need to re-trace the commissioning steps listed in the wiki link.  Please post the files as you create/update them for review.

    Tom

  • Tom,

    Thanks for the response. My group is not new to the commissioning steps required for correct DDR3 operation and controller operation in TMS320C66xx parts. Over the years you and Bill Taboada have provided the most info on the subject of leveling in this family of DSPs and you also have provided responses our team members on legacy products targeting the slower Micron MT41K256M16HA-125 XIT DDR3 [see Bill’s May 2014 post on  DDR3 Initialization Process with Incremental Leveling in C6670].

     

    We did try partial automatic leveling as you suggested. This works with no issues just as well as auto-leveling-followed-by-permanently-enabled-incremental-leveling approach that we originally tried.  The bootloader would load from FLASH, the DSPs would boot/load running out of DDR3, and then run Built-In Tests for memory for several thousands of cycles over temperature with no failures.

     

    There were a couple of things I did notice after reviewing and redoing the spreadsheet calculations for our board:

     

    1. Even though the Micron datasheets described the chips as backward compatible, timing parameters turned out to be slightly different for the -107 device. First, I matched timing as reported in the new chip’s datasheet.

     

    cid:image001.png@01D3A994.E20049C0

     

    2. The newer v11.0 of PHY Calc spreadsheet produced slightly different numbers for WRLVL_INIT_RATIOS and GTLVL_INIT_RATIOs. I don’t know if this was a difference in the underlying formulas but the decimal values changed (by up to 3 units) in the _INIT_RATIO registers.

     

    Stripline Delay per inch

    170

    ps

    DDR Clock Frequency

    666.667

    MHz

    1500

    ps

    Using Invert Clock

    1

    Full Cycle Ratio

    256

    Microstrip length (inches)

    Stripline length (inches)

    Delay (ps)

    Clock Periods

    Clock minus Data Strobe Delay (ps)

    Lower Routing Limit Test

    Round Trip Delay (ps)

    DQS0

    0.045

    0.654

    118

    0.079

    213

    588

    449

    CK_0

    0.045

    1.908

    331

    0.221

    DQS1

    0.045

    0.605

    110

    0.073

    222

    597

    441

    CK_1

    0.045

    1.908

    331

    0.221

    DQS2

    0.045

    0.705

    127

    0.085

    291

    666

    544

    CK_2

    0.045

    2.415

    418

    0.278

    DQS3

    0.045

    0.446

    83

    0.055

    335

    710

    500

    CK_3

    0.045

    2.415

    418

    0.278

    DQS4 (C665x DQS0)

    0.045

    0.716

    129

    0.086

    376

    751

    634

    CK_4 (C665x CK_0)

    0.045

    2.930

    505

    0.337

    DQS5 (C665x DQS1)

    0.045

    0.410

    77

    0.051

    428

    803

    582

    CK_5 (C665x CK_1)

    0.045

    2.930

    505

    0.337

    DQS6 (C665x DQS2)

    0.045

    0.831

    148

    0.099

    444

    819

    740

    CK_6 (C665x CK_2)

    0.045

    3.441

    592

    0.395

    DQS7 (C665x DQS3)

    0.045

    0.550

    100

    0.067

    491

    866

    692

    CK_7 (C665x CK_3)

    0.045

    3.441

    592

    0.395

    DQS_ECC

    0.000

    0.000

    0

    0.000

    0

    0

    0

    CK_ECC

    0.000

    0.000

    0

    0.000

    Register

    Address

    Hex Value

    Decimal Value

    DATA0_WRLVL_INIT_RATIO

    0x0262040C

    00000093

    147

    DATA1_WRLVL_INIT_RATIO

    0x02620410

    0000008B

    139

    DATA2_WRLVL_INIT_RATIO

    0x02620414

    00000089

    137

    DATA3_WRLVL_INIT_RATIO

    0x02620418

    00000080

    128

    DATA4_WRLVL_INIT_RATIO

    0x0262041C

    00000079

    121

    DATA5_WRLVL_INIT_RATIO

    0x02620420

    00000071

    113

    DATA6_WRLVL_INIT_RATIO

    0x02620424

    00000065

    101

    DATA7_WRLVL_INIT_RATIO

    0x02620428

    00000064

    100

    DATA8_WRLVL_INIT_RATIO

    0x0262042C

    00000000

    0

     

     

    Register

    Address

    Hex Value

    Decimal Value

    DATA0_GTLVL_INIT_RATIO

    0x0262043C

    000000B6

    182

    DATA1_GTLVL_INIT_RATIO

    0x02620440

    000000BE

    190

    DATA2_GTLVL_INIT_RATIO

    0x02620444

    000000A3

    163

    DATA3_GTLVL_INIT_RATIO

    0x02620448

    000000AC

    172

    DATA4_GTLVL_INIT_RATIO

    0x0262044C

    00000095

    149

    DATA5_GTLVL_INIT_RATIO

    0x02620450

    0000009C

    156

    DATA6_GTLVL_INIT_RATIO

    0x02620454

    0000008B

    139

    DATA7_GTLVL_INIT_RATIO

    0x02620458

    0000008C

    140

    DATA8_GTLVL_INIT_RATIO

    0x0262045C

    00000000

    0

     

     

    Register

    Address

    Hex Value

     

    DDR3_CONFIG_REG_12 OR Mask

    0x02620434

    08000000

     

     

     

     

     

     

     

    I’m still curious as to the behavior difference of the permanently-enabled-incremental-leveling approach vs. disabling-incremental-leveling-after-completion approach.

    --

    Kedric

  • Kedric,

    Which version of the PHY_CALC worksheet did you use previously?  The change history should list major improvements since that time.  There were also minor improvements added over time to properly implement rounding and ceiling functions.

    >I’m still curious as to the behavior difference of the permanently-enabled-incremental-leveling approach vs.

    >disabling-incremental-leveling-after-completion approach.

    I will answer this question in the context of what we refer to as Full Automatic Leveling in the KeyStone I DDR3 Initialization Application Report SPRABL2E.  Advisory 30 discusses a flaw in the read eye leveling portion of the start-up leveling.  Workaround #3 enables this Full Automatic Leveling as a 2-step process.  The step first is hardware write leveling and hardware read gate training without any leveling for the read eye. the second step requires a minimum of 64 incremental read eye leveling events to cause the sample point to be properly established.  At this point the incremental leveling can be disabled and the leveling process is deemed complete and successful.  The leveling results obtained are robust for long-term operation.

    However, if you choose to leave the incremental leveling active, this is not a problem.  Recall that Advisory 31 discusses an implementation issue with the write leveling portion of the incremental leveling process.  Incremental write leveling must not be used.  The  read eye and read gate portions of incremental leveling can run indefinitely.  The reason that we do not recommend this is 2-fold.  First, it is not needed for long-term robust operation, and second, it consumes DDR3 bus bandwidth.

    As stated in the previous post, we recommend use of Partial Automatic Leveling.  This is because it is simple and robust.  It is also the leveling method implemented in all sample code and GEL files.  Lastly, it has been successfully used by almost all customers.

    Tom