9.3 DDR SDRAM 接口

DDR SDRAM 接口可以看作是上一节中所介绍的 SRAM 接口的一种扩展。就像 SRAM 接口一样,有两条主要的总线,图 9-9 说明了 DUA 和 SDRAM 之间的总线及其方向。由命令、地址和控制引脚(通常称为 CAC)组成的第一条总线将使用以下标准方案:在存储器时钟的一个时钟沿(或每个时钟周期一次)处发送信息。双向总线由 DQ(数据总线)和 DQS(数据选通脉冲)组成,DDR 接口的不同之处就在于双向数据选通 DQS。DQS 选通脉冲可用于一组数据信号,这使得数据信号(每字节一个或每半字节一个)与选通脉冲的时序紧密匹配。如果时钟是整个数据总线共用的时钟,那么使用时钟信号进行这种紧密匹配可能不可行。双向选通信号 DQS 可用于读操作和写操作,并且在选通脉冲的两个边沿(下降沿和上升沿,或称双倍数据速率)上都可捕获数据。在 SDRAM 的读模式期间,DQ 总线与数据选通引脚 DQS(而不是存储器的时钟引脚)同步,即 DQ 和 DQS 从 SDRAM 中被输出时彼此是对齐的。而对于另一个方向,即当 DUA 发送数据时,DQS 将相移 90 度。请注意,数据 DQ 和选通 DQS 的沿均来自 DUA 内部的存储器时钟。

 

图 9-9

 

如上所述,对于一组 DQ 信号(4 个或 8 个 bit)存在一个数据选通 DQS。这样做是为了使 DQS 和 DQ 的所有 bit 之间的偏斜平衡(skew balancing)要求更容易满足。例如,如果对于一个字节使用一个 DQS,则一组中只需平衡 9 个信号(8 个 DQ 和 1 个 DQS),这比平衡 72 位的数据总线和时钟要容易得多。

 

上面的描述并不是对 DDR SDRAM 接口的完整说明,但足以说明这种接口的时序要求。

 

图 9-10 显示了典型 DDR SDRAM 接口中 CAC 总线(在 DUA 处)的 AC 特性。

 

图 9-10

 

上述建立时间和保持时间的要求对应到 CAC 总线上的接口约束如下所示:

 

create_generated_clock -name DDRCLK -source [get_pins UPLL0/CLKOUT] -divide_by 1 [get_ports DDRCLK]

 

set_output_delay -max 0.75 -clock DDRCLK [get_ports CAC]

 

set_output_delay -min -0.75 -clock DDRCLK [get_ports CAC]

 

在某些情况下,尤其是与无缓冲(unbuffered)存储器模块接口时,地址总线可能会比时钟驱动更大的负载。在这种情况下,地址信号对存储器的延迟要比时钟信号大,并且这种延迟差异可能会导致 AC 特性不同于图 9-10 中所示。

 

DQS 和 DQ 的对齐方式在读周期和写周期中有所不同,以下小节将对此进行进一步探讨。

 

9.3.1 读周期

在读周期中,存储器输出的数据与 DQS 是边沿对齐(edge-aligned)的,如图 9-11 中波形所示。图中的 DQ 和 DQS 代表存储器引脚上的信号。数据(DQ)由存储器在 DQS 的每个沿上发出,并且 DQ 改变数据的时刻也与 DQS 的下降沿和上升沿对齐。

 

图 9-11

 

由于 DQS 选通信号和 DQ 数据信号彼此对齐,因此 DUA 内部的存储控制器(memory controller)通常使用 DLL(或其它替代方法来实现四分之一周期延迟)来延迟 DQS,从而使 DQS 的边沿对齐于数据有效窗口的中心。

 

即使 DQ 和 DQS 在存储器中彼此对齐,但 DQ 和 DQS 选通信号也可能无法再在 DUA 内部的存储控制器上对齐,这可能是由于 IO 缓冲器之间的延迟差以及 PCB 互连走线等因素所导致的。

 

图 9-12 中为基本的数据读取原理图。上升沿触发的触发器在 DQS_DLL 的上升沿捕获数据 DQ,而下降沿触发的触发器在 DQS_DLL 的下降沿捕获数据 DQ。虽然图中的 DQ 路径上没有 DLL,但某些设计可能在数据路径上也会放置一个 DLL。这样可以用来延迟信号(以解决由于 PVT 或互连走线长度或其它差异引起的变化),以便可以在数据有效窗口的中间准确地采样数据。

 

图 9-12

 

为了对存储控制器上的读接口进行约束,我们在 DQS 上定义了一个时钟,并相对于该时钟在数据上指定了输入延迟。

 

  • create_clock -period 5 -name DQS [get_ports DQS]

 

假定存储器读接口以 200MHz(当在两个时钟沿上都传输数据时相当于 400Mbps)的频率进行工作,这对应于每 2.5ns 采样一次 DQ 数据信号。由于数据是在两个边沿上捕获的,因此需要为每个边沿分别指定输入约束。

 

set_input_delay 0.4 -max -clock DQS [get_ports DQ]

 

set_input_delay -0.4 -min -clock DQS [get_ports DQ]

 

set_input_delay 0.35 -max -clock DQS -clock_fall [get_ports DQ]

 

set_input_delay -0.35 -min -clock DQS -clock_fall [get_ports DQ]

 

set_multicycle_path 0 -setup -to UFF0/D

 

set_multicycle_path 0 -setup -to UFF5/D

 

输入延迟命令指定了 DUA 引脚上 DQ 和 DQS 沿之间的延迟差,即使这两个信号通常是从存储器中同时输出的,但由于不同存储器的规格,在时序上仍会存在偏差。因此,DUA 内的控制器设计应考虑到两个信号之间可能存在偏斜(skew)。以下是两个触发器建立时间检查的路径报告。假设捕获触发器的建立时间要求为 0.05ns、保持时间要求为 0.03ns,且 DLL 延迟设置为 1.25ns,即四分之一周期。

 

 

以下是保持时间检查的路径报告:

 

 

9.3.2 写周期

在写周期中,DQS 沿会与从 DUA 内存储控制器输出的 DQ 信号相差四分之一周期,因此存储器可以直接使用 DQS 选通脉冲去捕获数据。

 

图 9-13 显示了存储器引脚上所需的波形,在存储器引脚处,DQS 信号必须与 DQ 数据窗口的中心对齐。请注意,仍然是由于 IO 缓冲器延迟不匹配或者 PCB 互连走线的变化,仅在存储控制器(DUA 内部)中对齐 DQ 和 DQS 还不足以使这些信号在 SDRAM 存储器引脚处真正的对齐。因此,DUA 通常在写周期中使用额外的 DLL 去进行控制,以实现 DQS 和 DQ 信号之间所需的四分之一周期偏移(offset)。

 

图 9-13

 

如何约束此模式的输出取决于控制器中时钟的生成方式,接下去我们考虑两种不同情况。

 

情况 1:内部二倍频时钟

如果内部时钟是 DDR 时钟频率的两倍,则输出逻辑可以类似于图 9-14 中所示。DLL 提供了一种必要时使 DQS 时钟偏斜的机制,从而满足存储器引脚上的建立时间和保持时间要求。在某些情况下,可以不使用 DLL,而是使用负沿触发的触发器来获得 90 度的偏移。

 

图 9-14

 

对于图 9-14 中所示情况,可以进行如下输出延迟约束:

 

create_clock -period 3 [get_ports CLK2X]

 

create_generated_clock -name pre_DQS -source CLK2X -divide_by 2 [get_pins UFF1/Q]

 

create_generated_clock -name DQS -source UFF1/Q -edges {1 2 3} -edge_shift {1.5 1.5 1.5} [get_ports DQS]

 

DQ 输出引脚上的时序必须相对于衍生时钟 DQS 进行约束。

 

假设 DDR SDRAM 的 DQ 和 DQS 引脚之间建立时间要求分别为 DQ 上升沿的 0.25ns 和下降沿的 0.4ns。类似地,假设 DQ 引脚上升沿和下降沿的保持时间要求分别为 0.15ns 和 0.2ns。DQS 输出上的 DLL 延迟已设置为四分之一周期,即 1.5ns,所有波形如下图 9-15 所示:

 

图 9-15

set_output_delay -clock DQS -max 0.25 -rise [get_ports DQ]

 

set_output_delay -clock DQS -max 0.4 -fall [get_ports DQ]

 

set_output_delay -clock DQS -min -0.15 -rise [get_ports DQ]

 

set_output_delay -clock DQS -min -0.2 -fall [get_ports DQ]

 

以下是通过输出 DQ 路径的建立时间检查报告。建立时间检查从 0ns 处发起 DQ 的 CLK2X 上升沿到 1.5ns 处的 DQS 上升沿进行。

 

 

请注意,上述报告中的四分之一周期延迟出现在了时钟 DQS 上升沿的第一行中,而不是在 DLL 实例 UDLL0 的那行中。这是因为 DLL 延迟已被建模为了衍生时钟 DQS 定义的一部分,而不是 DLL 时序弧中的一部分。

 

以下是通过输出 DQ 路径的保持时间检查报告。保持时间检查从 3ns 处发起 DQ 的时钟 CLK2X 上升沿到 1.5ns 处的 DQS 前一个上升沿。

 

 

情况 2:内部一倍频时钟

当内部只有一倍频时钟可用时,输出电路通常可能类似于图 9-16 所示的电路。

 

图 9-16

 

有两个触发器用于生成 DQ 数据:第一个触发器 NEGEDGE_REG 由时钟 CLK1X 的负沿触发,而第二个触发器 POSEDGE_REG 由时钟 CLK1X 的正沿触发。每个触发器会锁存适当的边沿数据,然后使用 CLK1X 作为多路复用器的选择信号来多路复用该数据:CLK1X 为高电平时,触发器 NEGEDGE_REG 的输出发送到 DQ;而当 CLK1X 为低电平时,触发器 POSEDGE_REG 的输出发送到 DQ。因此,数据会在时钟 CLK1X 的两个边沿都到达输出 DQ。请注意,每个触发器都有半个周期将数据传播到多路复用器的输入端,以确保在由 CLK1X 边沿选择输入数据之前,已在多路复用器的输入端口上准备好了输入数据。相关波形如图 9-17 所示。

 

图 9-17

 

这种情况的输出延迟约束如下:

 

create_clock -name CLK1X -period 6 [get_ports CLK1X]

 

create_generated_clock -name DQS -source CLK1X -edges {1 2 3} -edge_shift {1.5 1.5 1.5} [get_ports DQS]

 

set_output_delay -max 0.25 -clock DQS [get_ports DQ]

 

set_output_delay -max 0.3 -clock DQS -clock_fall [get_ports DQ]

 

set_output_delay -min -0.2 -clock DQS [get_ports DQ]

 

set_output_delay -min -0.27 -clock DQS -clock_fall [get_ports DQ]

 

建立时间和保持时间检查可验证从多路复用器到输出的时序。建立时间检查之一是从多路复用器输入处的 CLK1X 上升沿(发起 NEGEDGE_REG 数据)到 DQS 的上升沿。另一个建立时间检查是从多路复用器输入处的 CLK1X 下降沿(发起 POSEDGE_REG 数据)到 DQS 的下降沿。同样,保持时间检查是从(与建立时间检查)相同的 CLK1X 边沿到 DQS 的前一个下降沿或上升沿。

 

以下是通过 DQ 端口的建立时间检查报告,该检查在(选择输出 NEGEDGE_REG 的)CLK1X 的上升沿和 DQS 的上升沿之间进行。

 

 

这是通过 DQ 端口的另一个建立时间检查报告,该检查在(选择输出 POSEDGE_REG 的)CLK1X 的下降沿和 DQS 的下降沿之间进行。

 

 

这是通过 DQ 端口的保持时间检查报告,该检查在 CLK1X 的上升沿和 DQS 的前一个下降沿之间进行。

 

 

这是另一个通过 DQ 端口的保持时间检查报告,该检查在 CLK1X 的下降沿和 DQS 的前一个上升沿之间进行。

 

 

尽管以上接口时序分析已忽略了任何负载对输出的影响,但我们也可以指定额外的负载(使用 set_load 命令)来提高准确性。STA 同样可以通过电路仿真来补充,以实现可靠的 DRAM 时序。

 

DDR 接口的 DQ 和 DQS 信号通常在读模式和写模式下使用终端电阻 ODT(On-Die Termination),以减少由于 DRAM 和 DUA 处的阻抗不匹配而引起的任何反射(reflection)。在使用 ODT 的情况下,用于 STA 的时序模型将无法提供足够的精度。设计人员可以使用另一种机制,例如详尽的电路级仿真,来验证信号完整性和 DRAM 接口的时序。

 

9.4 DAC 接口

考虑下图 9-18 的一个典型 DAC 接口,其中高速时钟将数据传输到 DAC 的低速时钟接口。

 

图 9-18

 

时钟 DAC_CLK 是时钟 XPLL_CLK 的 2 分频,DAC 建立时间和保持时间检查针对的是 DAC_CLK 的下降沿。

 

在这种情况下,即使可以根据需要将从快时钟域到慢时钟域的接口指定为多周期路径,但也可以将建立时间视作单周期(XPLL_CLK)路径。如图 9-18 所示,XPLL_CLK 的上升沿发起数据,而 DAC_CLK 的下降沿捕获数据。以下是建立时间检查的路径报告:

 

 

请注意,该接口是从较快的时钟域到较慢的时钟域,因此如有必要,完全可以将其设置为两周期路径。

 

以下是保持时间检查的路径报告:

 

 

保持时间检查是在建立时间捕获沿之前一个周期完成的。在这种接口情况下,最关键的保持时间检查是在发起沿和捕获沿重合处执行的,这在以上保持时间检查的报告中可以看出。