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.
你好!
在 DDR2主题上已经有一段时间了、在我们的设备不好之前、深入分析的时间也有限、但最近我们有时间测量 DDR2的完整性和时序。 前面有关 Vswing 的问题不再适用、我们使用时钟差分和串联端接上的并联端接解决了振幅。 (不确定为什么不在数据表中将其添加为 DDR2器件差分时钟的要求。)
现在、我们几乎成功地完成了资格认证、但我们遇到了一些还不好的问题。 (在测量值下方、我将分享有关设计的详细信息)。
测量读取突发时、时序失败:
- TAC-Diff、CK、DQ、需要+/- 500ps。 测量结果显示介于-628.75ps 和-282.71ps 之间。
其中信号为(所有测量值都在靠近 CPU 的位置):
- c1 -> CK_p/n
- C2 -> DQS1_p/n
- C3 -> DQ8
2.对读取突发进行第二次测量、其中时序失败:
- tDQSQ-Diff、DQ、DQS、需要小于+300PS。 测量结果显示+396.45ps (平均为288.93ps、低为-387.77ps)。
信号与之前的测量相同。
第三次测量是不符合 JEDEC 标准的信号完整性测量:
- Vox (AC) DQS、DQS、DQS#、其中低限为775mV、高限为1.025V。 从测量结果可以看出、未达到下限、结果为421.89mV。
如直方图中所示、我们不符合 JEDEC 规范。
您能就这些测量提出建议并失败吗?
该设计包含一个连接到 CPU (AM3351)的 DDR2 (ISSI)器件(IS43DR16640C-25DBLI)。
Sitara CPU 中的 DDR2设置如下:
arch/arm/include/asm/arch-am33xx/DDR_defs.h:28:# define IS43DR16640C25DBLI_EMIF_READ_DERAT延迟 0x100306
arch/arm/include/asm/arch-am33xx/DDR_defs.h:29:# define IS43DR16640C25DBLI_EMIF_SDCFG 0x43845732
arch/arm/include/asm/arch-am33xx/DDR_defs.h:30:# define IS43DR16640C25DBLI_EMIF_SDREF 0x2000040d
arch/arm/include/asm/arch-am33xx/DDR_defs.h:31:# define IS43DR16640C25DBLI_EMIF_TIM1 0x0666a392
arch/arm/include/asm/arch-am33xx/DDR_defs.h:32:# define IS43DR16640C25DBLI_EMIF_TIT2 0x142431ca
arch/arm/include/asm/arch-am33xx/DDR_defs.h:33:# define IS43DR16640C25DBLI_EMIF_TIM3 0x0000021f
arch/arm/include/asm/arch-am33xx/DDR_defs.h:34:# define IS43DR16640C25DBLI_INVER_CLKOUT 0x0
arch/arm/include/asm/arch-am33xx/DDR_defs.h:35:# define IS43DR16640C25DBLI_IOCTRL_Value 0x373
arch/arm/include/asm/arch-am33xx/DDR_defs.h:36:# define IS43DR16640C25DBLI_PHY_FIFO_WE 0x5d
arch/arm/include/asm/arch-am33xx/DDR_defs.h:37:# define IS43DR16640C25DBLI_PHY_WR_DATA 0x40
arch/arm/include/asm/arch-am33xx/DDR_defs.h:38:# define IS43DR16640C25DBLI_Ratio 0x80
arch/arm/include/asm/arch-am33xx/DDR_defs.h:39:# define IS43DR16640C25DBLI_RD_DQS 0x40
arch/arm/include/asm/arch-am33xx/DDR_defs.h:40:# define IS43DR16640C25DBLI_WR_DQS 0x6
CPU (U2000)和 DDR2 (U4001)之间的 PCB 布线长度如下:
网络 | 长度 | 时间 |
DDR2_ADD0 | 30.654 | |
U2000.F3:U4001.M8 | 30.654 | 0.18765 |
DDR2_ADD1 | 29.890 | |
U2000/J2:U4001.M3 | 29.889 | 0.18297 |
DDR2_ADD2 | 30.391. | |
U2000.D1:U4001.M7 | 30.391. | 0.18604 |
DDR2_ADD3 | 29.966 | |
U2000/B3:U4001.N2 | 29.966 | 0.18344 |
DDR2_ADD4 | 30.377 | |
U2000.E5:U4001.N8 | 30.377 | 0.18596 |
DDR2_ADD5 | 30.258. | |
U2000.A2:U4001.N3 | 30.258. | 0.18523 |
DDR2_ADD6 | 30.559 | |
U2000/B1:U4001.N7 | 30.559 | 0.18707 |
DDR2_ADD7 | 30.033 | |
U2000.D2:U4001.P2 | 30.032. | 0.18385 |
DDR2_ADD8 | 30.570 | |
U2000.C3:U4001.P8 | 30.570 | 0.18714 |
DDR2_ADD9 | 30.016. | |
U2000/B2:U4001.P3 | 30.016. | 0.18375 |
DDR2_ADD10 | 30.270 | |
U2000.E2:U4001.M2 | 30.270 | 0.1853 |
DDR2_ADD11 | 29.976 | |
U2000/G4:U4001.P7 | 29.976 | 0.1835. |
DDR2_ADD12 | 29.727. | |
U2000.F4:U4001.R2 | 29.727. | 0.18198 |
DDR2_ADD13 | 30.044 | |
U2000.H1:U4001.R8 | 30.044 | 0.18392 |
DDR2_BA0 | 29.997. | |
U2000/A3:U4001.L2 | 29.997. | 0.18363 |
DDR2_BA1 | 30.262 | |
U2000/E1:U4001.L3 | 30.262 | 0.18525 |
DDR2_BA2 | 30.175. | |
U2000/B4:U4001.L1 | 30.175. | 0.18472 |
DDR2_CAS_N | 30.260 | |
U2000.F1:U4001.L7 | 30.260 | 0.18524 |
DDR2_CKE | 30.046 | |
U2000.G3:U4001.K2 | 30.046 | 0.18394 |
DDR2_CK_N | 29.028 | |
U2000.C1:U4001.K8 | 29.029. | 0.1774 |
DDR2_CK_P | 30.298 | |
U2000.C2:U4001.J8 | 30.298 | 0.18515 |
DDR2_CS0_N | 30.306. | |
U2000.H2:U4001.L8 | 30.306. | 0.18552 |
DDR2_ODT | 29.862 | |
U2000/G1:U4001.K9 | 29.862 | 0.18281. |
DDR2_RAS_N | 30.384 | |
U2000.F2:U4001.K7 | 30.384 | 0.186. |
DDR2_WE_N | 30.282. | |
U2000.A4:U4001.K3 | 30.283. | 0.18538 |
DDR2_BYTE0 (11) | ||
DDR2_DAT0 | 17.647 | |
U2000.N4:U4001.C8 | 17.647 | 0.10803 |
DDR2_DAT1 | 16.709. | |
U2000.P4:U4001.C2 | 16.709. | 0.10229 |
DDR2_DAT2 | 16.851. | |
U2000.P2:U4001.D7 | 16.851. | 0.10316 |
DDR2_DAT3 | 17.329 | |
U2000.P1:U4001.D3 | 17.329 | 0.10608 |
DDR2_DAT4 | 16.085. | |
U4001.D1:U2000.P3 | 16.085. | 0.09847 |
DDR2_DAT5 | 17.386 | |
U2000/T1:U4001.D9 | 17.386 | 0.10643 |
DDR2_DAT6 | 15.816 | |
U2000.T2:U4001.B1 | 15.816 | 0.09682 |
DDR2_DAT7 | 18.325 | |
U2000.R3:U4001.B9 | 18.325 | 0.11218 |
DDR2_DQM0 | 16.827 | |
U2000.N3:U4001.B3 | 16.827 | 0.10301 |
DDR2_DQS0_N | 15.926 | |
U2000/R2:U4001.A8 | 15.926 | 0.09733 |
DDR2_DQS0_P | 15.876 | |
U2000.R1:U4001.B7 | 15.876 | 0.0703 |
DDR2_BYTE1 (11) | ||
DDR2_DAT8 | 16.606 | |
U2000.K2:U4001.G8 | 16.606 | 0.10166 |
DDR2_DAT9 | 15.269. | |
U2000.K1:U4001.G2 | 15.269. | 0.09347 |
DDR2_DAT10 | 16.170 | |
U2000/M3:U4001.H7 | 16.170 | 0.09899 |
DDR2_DAT11 | 15.871. | |
U2000/M4:U4001.H3 | 15.871. | 0.09716 |
DDR2_DAT12 | 14.279. | |
U2000.M2:U4001.H1 | 14.279. | 0.08741 |
DDR2_DAT13 | 16.648. | |
U2000/M1:U4001.H9 | 16.648. | 0.10192 |
DDR2_DAT14 | 14.158. | |
U2000.N2:U4001.F1 | 14.158. | 0.08667 |
DDR2_DAT15 | 16.420. | |
U2000.N1:U4001.F9 | 16.420. | 0.10052 |
DDR2_DQM1 | 16.364. | |
U2000.K3:U4001.F3 | 16.364. | 0.10017 |
DDR2_DQS1_N | 15.674 | |
U2000/L2:U4001.E8 | 15.674 | 0.0958 |
DDR2_DQS1_P | 15.727. | |
U2000.L1:U4001.F7 | 15.727. | 0.09612 |
提前感谢您!
Francois。
Francois、请务必仔细检查 DDR2数据表中的布局指南。 我看到差分时钟有一个严重违反、有些违反非常接近、这可能会导致您的合规性问题:
数据表: CK 差分对偏差长度不匹配25密耳(0.635mm)
电路板: CK_P - CK_N 长度= 30.298 - 29.028 = 1.27mm
数据表:DQ[x]至 DQS[x]偏移长度不匹配100密耳(2.54mm)
板:DAT7 - DQS0_N = 18.325 - 15.876 = 2.45mm (在技术上不违反、但与其他数据信号相比非常接近限值)
3.DQ[x] 至 DQ[x]偏移长度不匹配100mil (2.54mm)
板:DAT13 - DAT14 = 16.648 - 14.158 = 2.49mm (在技术上不违反、但接近)
板:DAT7 - DAT6 = 18.325 - 15.816 = 2.509 (在技术上不违反、但非常接近)
我只提到那些接近的规格、因为可能还有其他规格(例如中心到中心间距或其他偏差不匹配)、这些规格也可能违反、这可能会影响您的结果。
此致、
James
尊敬的 James:
感谢您指出这一点、我们将在发言时更新设计。 当我们有新电路板时、我将告诉您这是否解决了问题。
在鉴定期间、我还需要调整时钟以符合 JEDEC 标准。 为了符合要求、我在 p 和 n 信号中的 p 和 n 和10R 串联端接之间添加了一个100R 并联端接。 从测量结果来看、这已经通过、但数据表或参考设计中没有提到过、我添加的这一端接应该被添加。 您能就此发表评论吗?
我们发现、我们在差分 DQS 和 CK 上的实现为90um 布线宽度和210um 气隙、以获得100R 差分。 在查看数据表后、我们现在正在考虑将其更新为100-100um 的差异。 在本例中、我们还符合数据表2W 间距和阻抗。 您也能对此发表评论吗?
提前感谢您!
此致、
Francois
Francois、
所有读取时序都是由 DDR 存储器而不是 AM335x 生成的信号。 最可能的时序失真是由 PCB 布局和端接阻抗问题引起的。 JEDEC 信号电平和要求在 DDR 存储器的引脚上定义。 将这些测量值靠近 CPU 将会产生误导性结果。 您应该在 DDR 引脚处或附近进行这些测量。
此外、请务必遵循数据表中有关层叠、放置、布线宽度等的所有指导。 分离接地平面或不相邻接地平面的布线等可能会导致阻抗不匹配、从而使信号失真。 这可能是您需要添加串联和/或并联端接的原因。
此致、
James
James、
很抱歉、我之前的回答可能有点不清楚。
添加并联和串联端接的问题与上述测量值无关(从我的第一篇帖子中)、而是另一个问题。
我在其中添加端接的差分信号仅发送到 CK_p/n、我认为这只是 AM335x 侧的输出。 我们将在 DDR2器件侧测量该信号。 在 DDR2器件中、没有片上终端(我可以找到)、因此 DDR2器件的信号强。 添加了端接后、我能够获得符合 JEDEC 要求的信号。 我想知道这一点、因为 DDR2器件内部没有端接、Sitara 的数据表中是否应该说明这一点?
关于差分信号实现的另一个问题是、我们遇到了与数据表中所述要求有关的问题(我很想念负责绘制 PCB 的同事)。
我们的实现方案为90-210-90um、可获得100R 阻抗差分。 我们使用100um 来获得50R 的单端阻抗。 这违反了数据表的中心到中心(2W)要求。
如果我们确实希望遵循数据表、我们可以实现100-100um 等差速器、以满足中心到中心的要求。 借助我们的堆叠、我们可以满足50R 单端信号布线的阻抗要求。 但差分阻抗将低于100R、这违反了数据表中规定的2x Zo 要求。 您认为实施差异的最佳方式是什么?
此致、
François μ A
尊敬的 Francois:如果 CK 信号太强、您是否尝试从 AM335x 侧调整其驱动强度? 您的驱动强度设置是什么? 如果您具有 JTAG 访问权限、请运行下面的脚本并发回生成的文件:
git.ti.com/.../am335x-ddr-analysis.dss
运行该文件的说明可在以下位置找到: http://git.ti.com/sitara-dss-files/am335x-dss-files/blobs/master/README
至于您的差分阻抗、CK 和 CKn 是如何布线的? 理想情况下、它们应在外层布线、而不进行任何层转换。 这将使您能够更轻松地控制阻抗不匹配。 我相信、如果需要、您可以稍微加宽2W 的范围、以实现2倍 Zo。
此致、
James
尊敬的 James:
我在板上运行了该脚本、并打印了以下输出: e2e.ti.com/.../am335x_2D00_ddr_2D00_analysis_5F00_2019_2D00_11_2D00_21_5F00_165540.txt
从这个输出中、我看到我们的时钟设置为:
-压摆最慢
-驱动强度8mA
那么、您是否建议减小时钟信号的驱动强度? (DQSx 使用相同的设置、该信号接近1V - VSWING (max)参数、仅在不用于时钟的地方存在 ODT。) 如果时钟差分上没有我添加的并联和串联端接、VSWING (最大值)几乎为1.8V。
此外、为了了解您的信息、我们更新了电路板上指出的违规情况、并重新检查了电路板。 几周内、我将更新电路板以进行测试。
谢谢你。
此致、
François μ A
Francois、是的、您可以尝试降低时钟驱动强度并查看效果。 此外、我注意到您正在混合信号的压摆率并使其匹配。 我想我至少会匹配 addr/Clk 压摆率、然后匹配 data/DQS/DM 压摆率。
此致、
James
尊敬的 James:
我们收到了电路板并更新了设置、因此我们要重新测量 DDR2。
当我使用 AM335x-DDR-analysis.dss 通过 JTAG 读取设置时、我们注意到、u-boot 和 Linux 之间存在不同的设置。 当我们引导至 u-boot 时、我们设置的设置是正确的、但当引导继续并加载 Linux 时、它会将 DDR2设置设置设置设置设置为不同的设置。
我不是软件工程师、希望这不是一个小问题、但 Linux 是否使用自己的 DDR2设置? 或者、我是否会忽略 JTAG 脚本中的某些内容、因为寄存器被阻止读取? 我确实从寄存器返回了很多0x00、但系统确实可以正常工作。
感谢您的支持!
此致、
François μ A
[引用 user="Francois Veger">当我使用 AM335x-DDR-analysis.dss 通过 JTAG 读取设置时、我们注意到的一件事是 u-boot 和 Linux 之间存在不同的设置。 当我们引导至 u-boot 时、我们设置的设置是正确的、但当引导继续并加载 Linux 时、它会将 DDR2设置设置设置设置设置为不同的设置。
这是意外的。 您能否按照 u-boot 和 Linux 期间观察到的那样压缩脚本的输出? 我想更准确地了解正在发生的变化、例如、它是几个隔离式寄存器、还是看起来完全重新配置了?
e2e.ti.com/.../JTAG_5F00_read.zip
在添加的 zip 2日志中存在。 首先、当我在 U-boot 阶段暂停引导时、我通过 JTAG 读取设置。 第二次读取是在整个引导序列之后进行的。
我检查了读取操作、但在引导 Linux 时、我似乎 JTAG 无法再读取设置。 也许 Linux 会阻止 JTAG 读取?
在运行脚本之前从 Linux 控制台执行此命令:
devmem2 0x44e00414 w 0x12500002