DRAM Input Impedance (ODT) Calibration(DRAM输入阻抗校准)
ODT技术通过在DRAM内部集成终结电阻,实现对信号线的终端匹配。当DRAM作为接收器时,ODT电阻能够吸收信号线上的反射波,防止信号反射对后续信号造成影响,从而提高信号质量。ODT的启用与禁用由主控芯片控制,在DRAM模组工作时通常关闭ODT,而对于不工作的DRAM模组则进行终结操作。
ODT值的设置
-
DDR3/DDR3L设备:ODT值通过模式寄存器MR1进行控制。可以将其禁用,或设置为以下值之一:120Ω、60Ω或40Ω。这些值的选择取决于系统的具体需求,以及DRAM与控制器之间的信号完整性要求。
-
DDR2设备:在DDR2设备中,ODT值通过扩展模式寄存器EMR进行控制。同样可以将其禁用,或设置为75Ω、150Ω或50Ω之一。与DDR3/DDR3L类似,ODT值的选择也是基于信号完整性的考虑。
DDR2和DDR3/DDR3L设备都配备了一个专用的ODT输入引脚。这个引脚在写操作期间用于启用ODT,而在其他时间则禁用ODT。通过这种方式,系统可以灵活地控制ODT的启用与禁用,以适应不同的操作场景。
校准过程
DRAM Input Impedance (ODT) Calibration通常是在系统初始化或外部环境条件发生显著变化时进行的。校准过程涉及调整DRAM内部的终结电阻值,以确保其与传输系统的阻抗匹配。这通常通过发送特定的校准命令给DRAM来实现,DRAM会根据这些命令调整其内部的电阻网络,以达到预期的阻抗值。
DRAM Output Impedance (RON) Calibration(DRAM输出阻抗校准)
RON代表DRAM输出驱动逻辑的内部电阻,相当于DRAM的输出阻抗。在DRAM与控制器之间的点到点传输系统中,如果DRAM的输入输出阻抗与控制器端以及传输线不匹配,信号传输的质量会下降。因此,通过调整RON的阻值,可以确保DRAM的输出阻抗与传输系统的阻抗相匹配,从而提高信号完整性。
RON值的设置
-
DDR2设备:在DDR2设备中,RON的值通过模式寄存器EMR进行控制,可以设置为全强度(full strength)或降低强度(reduced strength)。具体值取决于DRAM的设计和制造商的规范。
-
DDR3/DDR3L设备:在DDR3/DDR3L设备中,RON的值通过模式寄存器MR1进行控制,可以设置为40Ω或35Ω等固定值。这些值的选择同样取决于系统的具体需求和信号完整性要求。
-
LPDDR2设备:在LPDDR2设备中,RON的值通过模式寄存器MR3进行控制,可以在34Ω到120Ω的范围内设置(默认值为40Ω)。这种可调范围提供了更大的灵活性,以适应不同的应用场景和性能需求。
校准过程
在DDR3/DDR3L和LPDDR2设备中,RON的校准通常通过发送ZQCL(上电初始化时的ZQ校正)和ZQCS(正常工作时的周期性ZQ校正)命令来实现。这些命令由内存控制器发出,DRAM接收到命令后执行相应的校准流程,以调整RON的阻值。
-
ZQCL命令:用于上电初始化时的ZQ校正。在上电后,DRAM需要从整个校准窗口中找到MRx中设置的RON值,所需时间相对较长。ZQCL命令确保DRAM在初始化阶段能够正确设置RON的阻值。
-
ZQCS命令:用于正常工作时的周期性ZQ校正。由于外部环境和电压条件可能发生变化,DRAM需要定期校正RON的阻值以确保信号传输质量。ZQCS命令能够在较短的时间内完成校准过程,减少对系统性能的影响。
注意事项
-
在发送ZQCL/ZQCS命令前,DRAM的所有Bank需要处于预充电状态,并且在校准期间不能发送任何命令或数据。
-
ZQCL和ZQCS命令的执行时间和条件可能因DRAM类型和制造商而异,具体细节请参考DRAM设备的数据手册或JEDEC规范。
-
DDR2设备通常不支持外部校准程序(如OCD),因此RON的校准可能依赖于内部的默认设置或制造商的特定调整方法。
DRAM Training
旨在通过一系列步骤来优化DRAM的读写性能,确保数据信号在DRAM上正确对齐,并计算出DRAM的正确读写延迟。DRAM Training通常包括Write Leveling(写均衡)、Read DQS Gate Training(读DQS门控训练)和Read Data Eye Training(读数据眼图训练)三个步骤,但这些步骤并非所有DRAM类型都支持。
启用Training步骤
当启用某个训练步骤时,用户需要提供一个初始延迟值,这个值将作为自动训练过程的起点。这个初始值是对系统板上预期延迟或偏差的一个粗略估计,但通常会减去一定的裕量以确保训练的准确性。
禁用训练Training步骤
如果某个训练步骤被禁用,用户则需要手动提供一个延迟值来补偿主板的延迟或偏差。这通常是因为:
- DRAM类型不支持:例如,DDR2和LPDDR2不支持写平衡(Write Leveling)。
- 已知的低延迟和稳定的操作条件:在这种情况下,系统的延迟和偏差非常稳定,无需进行动态训练。
- 已知延迟设置:如果之前的训练事件已经确定了合适的延迟设置,那么在相同或类似条件下,这些设置可以被重复使用。
Training时间
Training时间通常很短,对于500 MHz的DRAM时钟,训练时间大约在1-2毫秒。
数据信号连接
为了确保Training成功,即使在使用ECC(错误检查和纠正)时,也需要将所有数据信号连接到DRAM设备。这是因为ECC虽然能增加数据的可靠性,但它本身并不改变数据信号的物理连接需求。在16位数据、10位ECC的配置中,所有的26条线路都需要正确连接到DRAM设备。
写均衡
目标:对齐CLK和DQS,以满足DRAM规范的要求。
过程:由于DDR3/DDR3L系统推荐的飞线拓扑结构,时钟(CLK)相对于写DQS在DRAM输入处会有延迟。PHY会延迟DQS信号以匹配板级偏斜。通过DRAM异步反馈CLK(用DQS的上升沿采样),控制器反复延迟DQS直到检测到0到1的转换。
适用范围:DDR3/DDR3L
注意事项:
- DDRC支持写均衡作为初始化过程的一部分。
- 可选禁用写均衡并通过寄存器编程预定延迟值(DDR2和LPDDR2不支持写均衡)。
- 成功训练依赖于提供近似的DQS到CLK延迟最小值,该值应基于系统板布局和封装延迟信息来估算。
读DQS门控训练
目标:调整有效的读DQS窗口,确保读数据能够正确捕获。
期望效果:名义上,这个窗口应该围绕4个(在BL=8时)有效的DQS脉冲。
最终比例:基于板级延迟的2倍,如果时钟是反向的,则额外增加0.5个周期。
初始比例:最终比例减去0.125个周期(0x20单位),但不能小于0。
适用范围:DDR3/DDR3L, LPDDR2
过程:由PHY执行,以识别读DQS的有效间隔并捕获读数据。需要将对齐的读窗口与读数据突发对齐,并排除前导码期间以及DQS信号被三态或PHY驱动的任何时期。
注意事项:
- DDRC支持此训练作为初始化过程的一部分。
- 可选禁用训练并通过寄存器编程预定延迟值(DDR2必需)。
- 对于LPDDR2,推荐分步训练偶数和奇数字节通道,并在DRAM控制器初始化时应用结果,禁用自动训练。
- 成功训练依赖于提供近似的SoC到DRAM板级延迟最小值。
读数据眼训练
目标:调整RD DQS相对于RD数据的时序,确保DQS边沿位于数据眼的中间。
最终比例:名义上的理想值是0.25个周期,因为DRAM输出时DQ和DQS是对齐的。
初始比例:无需设置。
适用范围:DDR3/DDR3L, LPDDR2
过程:通过DDR3/DDR3L的MR3寄存器中的MPR位字段启用。DRAM输出一串01010101的数据模式,内存控制器根据这个已知模式调整内部DQS延迟。
注意事项:
- DDRC支持此训练作为初始化过程的一部分。
- 可选禁用训练并通过寄存器编程预定延迟值(DDR2必需)。
- 对于DDR3/DDR3L,如果初始比例计算出的值小于0,则设置为0;如果偏斜太小,则反转时钟。
Write Data Eye Adjustment(写数据眼调整)
虽然DDR控制器通常不支持写数据眼的自动训练(即自动调整写数据相对于写DQS(数据选通信号)的对齐),但手动对齐是可行的。写数据眼是指在DRAM输入端,写数据信号相对于写DQS信号的有效窗口,这个窗口的大小和位置对于确保数据的正确传输至关重要。
理论上,写DQS的边沿应该在写数据眼的中间位置与写数据对齐。DDRC的物理层提供了一个用户可编程的相位偏移值,用于调整数据相对于DQS的相位。默认情况下,这个相位偏移值被设置为90度,这在DQ和DQS信号在板上具有相同延迟和负载的均衡设计中是足够的。
然而,在实际应用中,由于PCB布局、走线长度、信号负载等因素的差异,DQ和DQS信号可能不会完全平衡。在这种情况下,用户需要提供一个不同的相位偏移值来优化写数据眼的位置。基于工艺、电压和温度的表征结果,推荐使用的相位偏移值通常会略小于90度。
Vivado Design Suite可以自动提供这个优化后的相位偏移值,并将其包含在第一阶段引导加载程序(FSBL)或其他用户代码中。这样,在系统启动时,就可以自动应用这个优化值,从而确保写数据眼在DRAM输入端得到最佳的对齐,进而提高数据传输的可靠性和效率。
总之,虽然DDRC不支持写数据眼的自动训练,但用户可以通过手动调整数据相对于DQS的相位偏移值来优化写数据眼的位置,从而提高系统的整体性能。
自动DRAM Training的替代方案
在DRAM的自动训练因某些原因未能成功时,可以采用替代的校准方案来确保数据信号的准确对齐和系统的稳定运行。
可以通过执行简单的内存写读比较测试来检测训练失败。由于每个字节通道的训练都是独立完成的,因此内存测试应该独立检查每个数据字节。如果训练失败,这里提出了两种可能的解决方案:半自动和手动训练方法。随着该方法变得更加手动,训练时间也会增加。因此,建议遵循以下顺序:
以下是在自动训练失败时,可以采用的两种主要替代方法:半自动训练和手动训练。每种方法都有其适用场景和优缺点,因此建议按照以下顺序尝试:
- 尝试自动训练并验证基于板载测量的初始值:
- 如果自动训练失败,尝试半自动训练:
- 如果半自动训练也失败,使用手动训练:
自动训练
标准训练程序如上所述。
初始化和训练的估计时间为1-2ms。
半自动训练
在DRAM自动训练失败的情况下,半自动训练方法是一个有效的替代方案,特别是当系统/板载延迟已知,但工艺、电压和温度(PVT)的时序不确定性导致自动训练失败时。半自动训练的关键在于利用已知的延迟参数作为起点,并通过迭代测试来找到最优的训练参数。
半自动训练方法步骤
- 确定延迟参数范围:
- 已知名义延迟值T,以及由PVT变化引起的最大偏差delta。
- 将范围(T-delta, T+delta)分成n个部分,从而为每个延迟参数创建(n+1)个可能的值。
- 执行迭代训练:
- 对每个延迟参数的每个可能值组合(共有(n+1)^2种组合),执行自动训练程序。
- 每次训练后,都进行内存测试(如写-读-比较测试)以验证训练结果。
- 选择最佳参数:
- 在所有成功的测试区域中,选择位于中心的参数值作为最终的训练参数。
- 注意,每个数据字节通道(或称为数据切片)都有自己独立的参数,并应在内存测试中独立测试。
时间估算
- 单次训练迭代时间:大约1-2毫秒(用于初始化和训练),加上内存测试的时间。
- 内存测试时间:假设一个简单的1000字读写测试,在500 MHz下,平均访问时间为30个周期,则测试时间约为60,000个周期,即约0.12毫秒。
- 总时间:对于25次迭代的半自动训练,总时间可能长达25-50毫秒。
注意事项
- 半自动训练方法虽然比完全手动训练节省时间,但仍需要一定的技术专长和耐心来正确执行。
- 迭代次数n的选择取决于PVT变化的范围和预期的精度。n越大,找到最优参数的可能性越高,但训练时间也越长。
- 在实际应用中,可能需要根据具体情况调整内存测试的大小和复杂度,以确保测试的全面性和准确性。
在自动训练和传统的半自动训练方法都未能成功时,推荐采用多组半自动训练方法。这种方法结合了自动训练的效率和手动调整的灵活性,通过改变未被自动训练调整的两个延迟元素(写数据延迟和控制路径延迟)的值,来进一步探索最佳的训练参数组合。
DDR PHY延迟元素概述
DDR PHY包含五个可调整的延迟元素,其中四个是每个字节通道特有的(因此,实际上有17个独特的可调整延迟元素)。自动训练过程仅调整其中的三个元素:写DQS延迟、读DQS延迟和读数据延迟。另外两个元素——写数据延迟和控制路径延迟——的值来自可编程寄存器,且这些值在自动训练过程中不会被调整。
多组半自动训练
对于写数据延迟和控制路径延迟,根据系统的PVT变化和设计规范,定义合理的延迟值范围。
在这个范围内选择多个不同的延迟值组合,每个组合构成一组训练参数。
对每组训练参数,执行半自动训练过程。这包括在扩大的延迟范围内调整自动训练所涵盖的三个元素,并使用当前组的写数据延迟和控制路径延迟值。每次训练后,进行内存测试以验证训练结果。
根据内存测试的结果,选择表现出最佳性能的训练参数组合。如果某组训练参数未能通过测试,可以进一步细分该组的延迟值范围,或尝试其他组合。
重复上述步骤,直到找到满足性能要求的最佳训练参数组合。
优点
与完全手动训练相比,多组半自动训练方法显著减少了需要进行的实验次数。通过调整未被自动训练覆盖的延迟元素,能够探索更广泛的参数空间。结合了自动训练的准确性和手动调整的精细控制,提高了找到最佳训练参数组合的可能性。
注意事项
尽管比完全手动训练更快,但多组半自动训练仍然需要一定的时间来执行和验证每个训练组。执行此方法需要深入理解DDR PHY的工作原理和延迟元素的影响。某些硬件设计可能限制了可调整延迟元素的范围和精度,这可能会影响训练结果。
手动训练方法
是在完全不了解系统状态或半自动训练方法失败时的一种有效手段。该方法的核心在于完全禁用自动训练功能,并手动遍历所有延迟参数在其整个范围内的所有可能值,以找到最佳的配置。以下是手动训练方法的基本步骤:
-
禁用自动训练:确保DDR控制器的自动训练功能被禁用,以便能够手动控制延迟参数。
-
参数扫描:
- 初始化DDR控制器(DDRC),确保训练功能被禁用。
- 对每个延迟参数(如写DQS延迟、读DQS延迟、读数据延迟、写数据延迟和控制路径延迟),在其整个可能范围内进行手动扫描。建议的每次迭代延迟增量为时钟周期的1/32,因此每个参数覆盖一个时钟周期延迟范围需要32次迭代。
-
内存测试:在每次延迟参数设置后,执行内存测试(如写-读-比较测试)以验证当前参数配置的性能。
-
记录结果:使用一个记分板来记录每次迭代的结果,包括成功或失败,以及可能的性能指标(如读写延迟、错误率等)。
-
寻找最佳点:根据测试结果,找到每个数据通道(或字节通道)的最佳延迟参数值。这些最佳值可能是各自通道的中点值,但也可能根据具体情况而有所不同。
-
优化:如果必要,可以根据测试结果进一步优化延迟参数,直到找到满足性能要求的最佳配置。
时间估算
- 单次迭代时间:大约为700微秒(DDR3/DDR3L的DRAM重置/初始化过程需要500微秒),加上内存测试的时间,总共约为0.8毫秒。
- 总时间:简化假设下,如果搜索范围较小,迭代次数可能较少;但在最坏情况下,如果每个参数都需要遍历整个范围(即每个参数32次迭代),并且考虑到多个参数和多个数据通道,迭代次数可能达到数千次,总时间可能长达数秒甚至更长。
注意事项
- 时间成本:手动训练过程可能需要较长时间,特别是当参数范围较大或需要优化多个参数时。
- 精度与复杂性:较高的迭代密度(如每次迭代1/32时钟周期)可以提高训练精度,但也会显著增加时间成本。
- 测试全面性:确保内存测试能够全面覆盖可能的故障情况,以便准确评估每种参数配置的性能。
表10-9总结了涉及手动训练的寄存器值,这些值均以时钟周期的1/256为单位(即256个单位等于1个时钟周期,8个单位等于时钟周期的1/32)。此表应包含每个可调整延迟参数的寄存器地址、初始值、最大值、最小值以及步长(增量)等信息。不过,请注意,具体的寄存器值和范围将取决于具体的DDR控制器和硬件设计。