一个DDR系统由在一起工作的控制器、I/O、封装、插座、电源、时钟和外部存储器组成。在数字验证中,并不是所有这些元件都能验证到,但主要是控制器、PHY、I/O和存储器。由于在数字仿真中无法模拟所有元件的效应,验证变得更加复杂,但门级仿真(GLS)给我们提供了一个很好的基础架构,来报告主要从时序角度看可能影响控制器-PHY-I/O路径的设计问题。
在门级仿真中验证DDR时会遇到许多与时序有关的问题,从而导致验证团队与静态时序分析(STA)团队之间发生大量迭代工作。如果有彻底调试过的门级仿真环境,人们对运行于寄存器传输级(RTL)之上的DDR协议进行静态时序分析将会充满信心,并且会专注于解决数字和时序方面的问题。本文整理了DDR门级仿真验证过程中由于RTL上的时序可见性而常常报告的各种问题,并通过一些例子强调了门级仿真环境中实现DDR快速有效收敛的重要调试标准。
借助多级IO处理惯性延时问题
RTL环境没有任何时序意识,因此在设计中没有惯性/传播延时,但当我们转移到门级仿真(GLS)设置时,就必须有效地考虑惯性/传播延时了,以便模拟实际的硅片行为,同时不会使事情变得太过悲观。在逻辑单元输入端出现的持续时间小于惯性延时的脉冲,将不会导致该逻辑单元的输出端发生任何的转换,逻辑门表现出的这种现象被称为惯性延时传播。业界标准的门级仿真工具通常将传播延时作为该逻辑门的惯性延时。仿真工具采用的这种建模方法是一种非常好的实际硅片行为提取的方法,事实上它确实很好地模拟了信号通过单级逻辑门的传播。但这种行为在IO这样的复杂门中并不是想要的,因为IO是多级结构,一旦信号通过第一级,就能保证它成功地通过IO单元传输。因为仿真工具不理解逻辑单元的这种内部结构,所以即使是多级IO最终它也会抑制这种脉冲,如图1所示。
图1:默认的门级仿真(GLS)行为是抑制小于门延时的所有转换。
解决这个问题现在有两种解决方案。
第一种解决方案是人工更新标准延时格式(SDF)文件,并将延时更新到一些较小的值。在信号传播正常的情况这种方法非常管用,但当新的延时不能代表实际延时时,这种方法并不合适,并可能会抑制其它潜在的功能性问题。
工业标准的GLS仿真器确实有这样的功能/开关,即允许/禁止特定宽度的脉冲通过单元。例如当使用“拒绝与误差(Reject&Error)设置”时,将传播宽度大于“误差设置”值的所有信号。同时,这种仿真器在遇到宽度处于“拒绝与误差设置”之间的信号时将传播未知值,而且它会完全消除宽度小于“拒绝设置”的信号。下表1给出了一个例子。
表1: Pulse_e/Pulse_r行为
根据时序小组所做的平衡结果进行时钟选择
在RTL设置中,由特定源驱动的时钟将同时到达所有节点,但在使用GLS设置时,就要考虑时钟偏移了,它可能造成时序问题,即源自相同源的两个时钟路径可能产生偏移,以至于DDR数据/时钟路径并不是对所有可能组合逻辑来说都是平衡的。在DDR设计中输入时钟是最重要的参数,因为所有其它信号都与输入时钟周期和占空比有关。也有这样的情况,即可以将多个时钟源用作控制器的输入时钟。一般来说,来自任何一个时钟源的路径只要是平衡的就可以推荐用作DDR输入时钟,不过对于传播到外部DDR存储器的DDR_CLK、DDR_DQS等信号来说,在占空比、高电平时间、低电平时间等方面有很严格的要求,必须满足DDR正确工作所需的条件。在写入侧与占空比要求相关的大多数故障可能是DDR控制器输入端时钟的占空比不正确引起的。因此为了避免不必要的调试工作,必须确保我们使用了时序要求得到满足的正确时钟源。下面提到了同样一个例子,其中捕获到了存储器输入端的DQS占空比数据,而且有两个不同的时钟源被选为DDR控制器时钟。
DDR_CLK 频率:400MHz(约2.5ns)
55%×2.524ns = 1.388200ns
45%×2.524ns = 1.13580ns
表2:位于系统中不同层次的时钟占空比数据。
焊盘上的负载用于转储SDF
I/O在具有时序意识的门级仿真(GLS)DDR验证中扮演着非常重要的角色。当满足直到焊盘输入端的时序要求时,就会从用于焊盘的许可文件提供的信息中转储出I/O延时数据。也有这样的时候,即从控制器到焊盘输入端的路径得到了正确的平衡,但仍能见到故障发生。这可能是因为位于主控制器与外部DDR存储器之间的路径中的I/O引入了不正确的延时。这些延时实际上取决于施加到焊盘的负载。因此在产生SDF文件时,需要注意板子上必须应用了正确且实际的负载。做不到这一点可能在SDF文件中产生相当悲观的时序片段,并当在GLS仿真中进行反标时可能产生伪故障。这种问题很难调试,相当耗时耗力。
表3:悲观负载与实际负载比较。
输出缓冲使能(OBE)时序要求
大多数DDR控制器的设计是这样的,它们为了DQ(数据)和DQS(选通)焊盘本身而驱动OBE(输出缓冲使能),因为相同的焊盘可以用于写/读。由于各种各样的原因,OBE时序在服务路径时一般会被忽略,但在DDR场合这样做将导致灾难性结果。举例来说,在DDR协议读/写过程中,在READ/WRITE命令之后、在DQS第一个上升沿之前的DQS上的低电平(LOW)状态被认为是读/写先导码;同样,最后一个数据入单元之后在DQS上的低电平状态被认为是读/写后导码。前导部分为接收器件提供了一个时序窗口,用于激活其数据捕获电路,同时在选通信号上呈现一个已知/有效的电平,从而避免错误触发捕获电路。在前导部分过后的数据串发生期间选通信号将以与时钟信号相同的频率触发。在写入操作过程中是有特定的时序要求的,对DDR2来说必须满足比如0.35Ck的最小前导宽度,DDR3是0.9Ck。同样,对写后导时序也有要求。DDR2是0.4Ck至0.6Ck,DDR3最小是0.3Ck。如果在DDR GLS时遇到这种最常见的问题,这些参数可能会发生违例。
图2:DDR的前导和后导。
DDR焊盘的压摆率设置
焊盘以不同的压摆率进行表征,压摆率决定了单位时间内输出电压的变化率。这些设置在RTL仿真中是没有任何作用的,因为RTL仿真中不关心延时。但在GLS仿真中要考虑延时因素,因此为了避免不必要的调试工作,正确的设置非常重要。系统中针对不同焊盘的时序要求一般是要满足最大压摆率,但根据不同的参数有不同的要求。一个这样的例子是,像DDR等协议如果知道了最大压摆率,就能发现反射和干扰问题。这个参数在不同的设置情况下焊盘延时会有很大的变化,具体取决于最终在实际电路板和测试仪上使用的负载和电阻值。我们必须确保在设置了正确的焊盘参数下开展仿真,以便消除期望结果和观察结果之间的偏差。
表4提供了针对某个SoC的不同接口的推荐SRE设置值。
表4:针对SoC不同接口的推荐压摆率设置。
I/O中的表征问题
这方面的问题同样只在门级仿真(GLS)中可见,在RTL中是不会遇到这种问题的。如果从一开始就得到保证,就可以确保能够最大程度地减少验证和静态时序分析之间的反复调试和反馈。就背景而言,每个单元都有一个与上升沿和下降沿有关的延时。任何单元的延时都直接取自于拥有PVT间延时信息的许可文件。针对单元的这些上升和下降时间每个都不同。但DDR等协议对占空比、高电平时间、低电平时间等都有严格的要求,必要满足这些要求才能确保协议正确工作。设计中常用上升和下降时间几乎相同的对称缓冲器和单元,确保CLK、DQS等关键信号路径的平衡。但I/O的上升和下降时间也可能因为表征问题而存在很大差异,这种情况下将破坏占空比,进而在存储器端导致违例。
图3:上升下降延时差异导致占空比要求的违例。
SDF延时近似是高速门级仿真验证的关键
测试平台有一个时间刻度用于定义设计仿真时的事件颗粒度。在时间刻度语句中,第一个值是时间单位,第二个值是仿真的精度。对于高速电路来说定义时间刻度的精度必须非常谨慎。一般来说,测试平台中的时间刻度定义为1ns/10ps,这意味着所有延时都将被近似为最接近的10ps。但在DDR等时序非常重要的高速协议中,裕量可能非常小(在ps数量级)。举例来说,如果数据路径中有10个缓冲器,每个的延时为26ps,那么如果时间刻度是1ns/10ps,所有这些延时都将被近似为30ps,进而在门级仿真中将引入40ps的不精确性。这将在门级仿真中导致错误的时序违例。有鉴于此,仿真环境必须更新到合适的时间刻度才能避免这样的问题发生。
应该解决来自存储器的错误
一般来说,仿真中可以使用不同供应商提供的模型。这些模型可以是Verilog模型或Denali模型。这些模型可能来自美光、Spansion、Macronix等存储器供应商。针对仿真目的最好选用Denali模型,因为这些模型对所有时序参数和协议都做了非常严格的检查,而且还包括CK/DQS/DQ之间的抖动和偏移,因此非常接近于电路板中使用的实际存储器。当在存储器接口处违反任何时序规格时,模型将标记上错误信息。RTL仿真中是没有延时的,如果时序参数得到了正确配置,那么正常情况下不会遇到这些错误。但在GLS仿真中需要考虑延时因素,因此很可能发生某些参数违例,错误信息被抛出来。对这些错误必须仔细审查,并加以解决。正常情况下,当信号由控制器给出并到达存储器时,在写周期中会遇到这些问题。在读周期中,信号是模型自身产生的并到达控制器。Denali存储器模型有许多开关用于控制各种参数,如允许的差分偏移、将存储器初始化到某个值、禁止来自存储器的错误消息等。必须注意的是,没有哪个开关可以忽略,这样做很可能屏蔽重要的错误信息。
本文小结
从上述讨论的各个要点看,很明显门级仿真(GLS)有助于发现在RTL级无法预料的设计问题,并在做成硅片前得到解决。如果我们一味地从事重复劳动,那么在门级仿真中调试DDR可能是一个极具挑战性的任务,但通过经验并遵循基本的调试规则可以使工作顺利开展。这些问题与门级仿真其它协议时常常遇到的问题不同,也更有技巧性,因此经常耗费更长的调试时间。从一开始就关注这些关键的调试参数可以在门级仿真中实现高效快速的DDR调试,并有助于在更早的SoC设计阶段发现隐藏的设计问题。