DC概论三之setup time 与 hold time 之二

本文介绍了时序分析中关键概念如input_delay和output_delay的作用,并探讨了它们如何影响内部逻辑延迟。此外还讨论了时钟偏移(latency)、抖动(jitter)及其对时序的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

注明:如需转载,请注明作者出处,谢谢~,Author:pythonlong

 以下根据资料和个人体会整理,如果错误,疑问欢迎请指正,讨论!!

前面一篇讲了基本的建立时间和保持时间以及时序路径划分。在这篇开始之前,先介绍一下很经典而且会时常用到的用来讲解的一个电路图,如下。这篇文章的讲解也会给予这个电路图,讲解的时候我把电路图分割成需要的部分:)

既然我们知道了建立时间和保持时间的含义,这篇主要是根据工厂提供的标准单元库中时序器件的建立时间和保持时间来预估我们的约束对设计的影响,是否满足时序要求,简单点就是说,时序有没有violator

 

set_input_delay :

input_delay是设置外部信号到达输入端口的时间,dc会用它来计算留内内部逻辑的空余时间是多少。

之所以让ClkAClk的时钟周期不一致,主要是用来说明上图中黄色部分的。黄色部分的确认是很重要的。这是DC用来确定时间余量(slack)的关键。如上图所示,黄色部分已经确实是最小相位差。那么根据input_delay时间以及库中触发器的setup建立时间,可以知道留给内部逻辑的延迟时间是红色部分Tmin-Tinput_delay-Tsetup。综合过程中,dc会优化Logic2的时序,以使他达到时序要求。

 

同样set_output_delay是设置输出端口到数据采集处的延迟。如下图:

DC会根他来计算留给内部逻辑的时间。

这里还是要强调一下不同频率的问题:)

 

介绍完了input_delayoutput_delay,以及skew(上篇:http://bb2hh.blogbus.com/logs/20563101.html

在分析时间余量之前再介绍下时钟的latency

Latency分为source lantency  一般的latency

Source latency 指的是时钟源到时钟端口的延迟。

Latency指的是时钟端口到内部时序器件的时钟管脚的延迟。

一般只考虑latency即可。

再看下latency对于内部逻辑的影响.下图是不考虑latency的情况:

内部逻辑延迟的限度为T2-T1-Tinput_delay-Tsetup

当考虑了latency的时候。D1上的clock会变成时序图中的红色部分

那么留给内部逻辑的最大延迟为:T2’T2+Tlatency-T1-Tinput_delay-Tsetup。会发现留给内部逻辑的延迟会变大,那么会给DC更大的空间来综合。

 

同样如果ClakA上面如果也设置了Latency在分析slack的时候也要算进去。

 

顺便介绍一下时钟的jitter,如下图

正常的时钟到来时蓝色的时序图。但是由于无法预知的因素,时钟可能提前(粉色)或者延迟(红色)到来,这就是jitter。提前到来充为setup jitter,延迟到来充为 hold jitter

 

DC中把skewjitter合成一个uncertainty。用set_clock_uncertainty来设置。

下文中提到的skew指的是合体,即uncertainty

Uncertainty分为setuphold,顾名思义,如上图理解即可。

 

转载于:https://www.cnblogs.com/liuokay/archive/2011/04/05/2005653.html

<think>我们使用HSPICE测量DFF的SetupTimeHoldTime的基本思路是通过扫描扫描时钟沿和数据沿之间的时间差,观察DFF的输出是否出现错误(比如亚稳态或错误锁存)。具体步骤如下:1.**定义测试电路**:包括DFF、时钟信号、数据信号和必要的激励源。2.**参数扫描**:扫描数据信号相对于时钟信号的变化时间(即SetupHold时间检查的偏移量)。3.**监测输出**:在特定的时间点检查DFF的输出(Q或QN)是否正确锁存了输入数据。4.**确定临界点**:找到当输出开始出现错误时的数据-时钟时间差,这个时间差就是SetupTimeHoldTime。###1.SetupTime测量方法SetupTime定义为在时钟有效边沿到来之前数据必须保持稳定的最小时间。在测量时,我们固定时钟边沿,然后逐渐改变数据信号的变化时间(让数据越来越靠近时钟边沿变化),直到DFF的输出不能正确锁存数据。这个临界点即为SetupTime。###2.HoldTime测量方法HoldTime定义为在时钟有效边沿到来之后数据必须保持稳定的最小时间。类似地,我们固定时钟边沿,然后让数据信号在时钟边沿之后更早地变化(即减少数据在时钟沿后的稳定时间),直到DFF的输出出现错误,这个临界点即为HoldTime。###3.HSPICE测量示例以下是一个使用HSPICE测量DFF的SetupTime的例子(HoldTime的测量方法类似,只调整扫描方向):####步骤1:构建测试电路我们使用一个标准的DFF(例如,从库中调用),并连接时钟(CLK)和数据(D)输入。输出为Q。我们还要一个脉冲源作为时钟,另一个脉冲源作为数据(但数据脉冲的边沿相对于时钟可调)。####步骤2:编写HSPICE网表```spice*DFFSetupTimeMeasurement.optionpost=2.paramtd_delay=0n*扫描参数:数据D相对于时钟CLK的延迟*电压源定义VddVdd0DC1.8VssVss0DC0*时钟信号:周期=20ns,占空比50%VclkCLK0PULSE(01.800.1n0.1n10n20n)*数据信号:在时间td_delay处跳变(假设从0跳变到1.8)VdD0PULSE(01.8'td_delay'0.1n0.1n20n40n)*调用DFF模型(假设使用工艺库中的标准DFF)X1DCLKQ0VddVssDFF*分析设置:瞬态分析,同时使用参数扫描.tran0.01n100nsweeptd_delay0n10n0.1n*监测输出Q在时钟上升沿之后一段时间(例如,15ns后)的值*我们期望:在时钟上升沿采样数据,如果数据在时钟上升沿之前td_delay时间已经稳定,则输出应该为高(1.8V)*我们测量在时钟上升沿之后(例如,时钟上升沿在10ns,30ns,50ns等)的15ns时刻(即25ns,45ns,65ns)的输出值*但由于时钟周期为20ns,我们可以在每个时钟上升沿之后固定时间点测量.measuretranq_valuefindV(Q)at=50n*这里选择50ns是因为在40ns时钟沿后的10ns(即50ns)应该已经稳定.measuretransetup_timeparam='td_delay'whenV(Q)=0.9*当输出不再是高电平(1.8V)而是下降到0.9V(中点)时,记录此时的td_delay.end```**注意**:上述测量方法在实际中要调整,因为我们要在多个时钟沿进行测量,并且临界点判定要更精确的方法。实际中,我们可能通过扫描参数td_delay,观察输出波形中是否出现亚稳态或错误,然后找到临界点。####步骤3:改进临界点检测更准确的方法是:在时钟上升沿后足够长的时间(满足建立时间要求)检查输出是否正确。例如,在时钟上升沿后5ns(保证DFF内部已经稳定),测量输出Q的值。然后,我们扫描参数`td_delay`(从大到小变化),当输出值从正确变为错误时的`td_delay`就是SetupTime。实际SetupTime测量中,数据变化时间应该从大于SetupTime的值开始(比如5ns)逐渐减小(比如扫描到-1ns,即数据在时钟后变化),直到输出出现错误。临界点即SetupTime。###4.完整示例(SetupTime测量)下面是一个更实际的例子,通过参数扫描找出SetupTime:```spice*DFFSetupTimeMeasurement.optionpost=2.paramtd_delay=5n*初始数据延迟5ns(大于预估的SetupTime)*时钟信号:周期=20ns,第一个上升沿在10nsVclkCLK0PULSE(01.800.1n0.1n10n20n)*数据信号:在时间'td_delay'处从0跳变到1.8,然后保持(在时钟的第二个上升沿采样,即30ns时刻)*我们希望数据在时钟第二个上升沿(30ns)之前稳定。因为第一个上升沿时数据还没跳变(在td_delay=5ns时,在5ns跳变),所以第一个上升沿采样的是0,而第二个上升沿(30ns)采样的是1(因为数据在5ns时已经跳变)。*因此我们关注第二个上升沿(30ns)后的输出。VdD0PULSE(01.8'td_delay'0.1n0.1n40n80n)*注意:只跳变一次,在td_delay时刻跳变后保持高电平直到80ns*调用DFF模型X1DCLKQVddVssDFF*电源VddVdd0DC1.8VssVss0DC0*瞬态分析并扫描td_delay(从5n到-2n,步长0.1n).tran0.01n100nsweeptd_delay5n-2n-0.1n*测量在第二个时钟上升沿(30ns)后的15ns(即45ns)时刻的输出*预期:如果数据在时钟上升沿(30ns)之前稳定时间足够,那么输出为1.8V*当td_delay减小(数据变化越来越靠近30ns)到一定程度,输出会变为0(不稳定导致采样到0?或者亚稳态?)或中间值*我们设置测量点:当输出在45ns的电压低于1.8V的90%(即1.62V)时,认为采样失败.measuretransetup_timeparam='5n-td_delay'whenV(Q)<1.62at=45n.end```**解释**:-我们扫描`td_delay`从5ns(数据在5ns跳变,然后在30ns时钟沿之前有25ns的稳定时间)到-2ns(数据在时钟沿后2ns才跳变,即稳定时间不足)。-在45ns时刻(第二个时钟上升沿30ns之后15ns),我们测量Q的电压。在正常情况下(数据稳定足够),Q应该是1.8V(高电平)。当`td_delay`过小时(即数据跳变太靠近时钟沿),DFF可能采样失败(输出非高电平)。-我们设定一个阈值(1.62V,即1.8V的90%),当电压低于此值时,记录此时的`td_delay`。注意,我们测量的是`5n-td_delay`,因为数据跳变时间td_delay越小,说明数据跳变离时钟沿(30ns)越近,那么建立时间(即数据跳变到时钟沿的时间差)就是`30n-td_delay`。我们设置的初始条件td_delay=5n,此时建立时间为25ns,然后逐渐减小。当找到临界点时,setup_time=`30n-(临界td_delay)`。但是,上述测量指令`.measuretransetup_timeparam='5n-td_delay'whenV(Q)<1.62at=45n`会在第一次检测到电压低于1.62V时记录,此时`td_delay`的值设为td_delay_critical,则SetupTime为:$$t_{setup}=30\text{ns}-t_{d}\_{\text{delay}\_critical}$$###5.HoldTime测量示例类似地,对于HoldTime,我们要数据在时钟沿之后保持足够长的时间。因此,我们让数据跳变发生在时钟沿之后,然后逐渐提前数据跳变(即让数据跳变越来越早,靠近时钟沿),直到输出出现错误。```spice*DFFHoldTimeMeasurement.optionpost=2.paramth_delay=1n*数据跳变在时钟沿后1ns发生*时钟信号:周期20nsVclkCLK0PULSE(01.800.1n0.1n10n20n)*数据信号:我们希望数据在时钟沿(如10ns)之前是稳定的高电平(1.8V),然后在时间10ns+th_delay(即11ns)处跳变到0*这样,时钟在10ns采样数据(应该是高电平),但是数据在11ns跳变为低。如果th_delay太小(如0.5ns),那么数据在10.5ns跳变,则时钟10ns后数据保持时间不足,可能导致输出错误。VdD0PULSE(1.80'10n+th_delay'0.1n0.1n40n80n)*DFFX1DCLKQVddVssDFF*电源VddVdd0DC1.8VssVss0DC0*扫描th_delay:从1n(保持时间1ns)到-2n(数据在时钟沿前跳变),步长-0.1n(递减,即th_delay越来越小,保持时间变短).tran0.01n100nsweepth_delay1n-2n-0.1n*测量输出:在时钟沿(10ns)后5ns(15ns)时,输出应该是高电平(1.8V)*当输出低于1.62V时,认为采样错误.measuretranhold_timeparam='th_delay'whenV(Q)<1.62at=15n.end```**解释**:-时钟在10ns上升沿采样数据D,此时D应该是高电平(1.8V),因此Q在之后应变为高电平。-如果数据在时钟沿后很快跳变(即th_delay很小),那么DFF可能不能正确保持数据,导致输出错误(比如变为0V或亚稳态)。-我们设置th_delay从1ns(数据在11ns跳变,保持时间1ns)减小到-2ns(数据在8ns跳变,意味着时钟沿10ns时数据已经是低电平了)。-在15ns时(10ns+5ns)测量输出Q,正常情况下应为高电平(1.8V)。当低于1.62V时,记录此时的th_delay,即为临界保持时间,这个临界值就大约是我们测得的HoldTime(即临界点对应的th_delay值)。**注意**:这些例子是概念性的,实际应用时根据具体DFF和工艺库调整。同时,亚稳态可能表现为电压在一个中间值,或者振荡,因此阈值设定要根据实际情况调整。###总结:通过HSPICE的瞬态分析和参数扫描,我们可以测量DFF的Setup/Hold时间。关键点:1.使用脉冲源产生时钟和数据,并通过参数控制数据相对于时钟的延迟。2.通过扫描这个延迟参数,观察输出波形,找到输出开始不满足要求的临界点。3.使用`.measure`命令自动捕捉临界点,计算Setup/HoldTime。[^1]:建立时间约束要求在时钟采样边沿之前数据必须稳定一定时间[^1]。§§相关问题§§1.HSPICE中如何设置参数扫描的步长才能得到精确的Setup/HoldTime?2.测量Setup/HoldTime时如何避免亚稳态对判断的影响?3.HSPICE中是否有直接测量Setup/HoldTime的命令?4.如何将测量得到的Setup/HoldTime用于后续的时序约束?</think> ### HSPICE 测量 DFF 的 Setup/Hold Time 方法及示例 #### 📌 核心原理 在 HSPICE 中测量 DFF 的 Setup TimeHold Time 的核心思想是:**扫描数据信号相对于时钟边沿的偏移时间**,找到导致 DFF 输出错误的临界点: - **Setup Time**:数据变化最晚不晚于时钟边沿多久能正确采样 - **Hold Time**:数据变化最早不早于时钟边沿多久能正确采样 --- #### 🔧 测量步骤 1. **构建测试电路** ```spice * DFF 测试电路 Vdd Vdd 0 DC 1.8V Vclk CLK 0 PULSE(0 1.8 0 0.1n 0.1n 4.9n 10n) * 时钟周期10ns Vd D 0 PULSE(0 1.8 't_delay' 0.1n 0.1n 5n 20n) * t_delay为扫描参数 * 调用标准DFF单元 XDFF D CLK Q Vdd 0 DFF_CELL ``` 2. **设置参数扫描** ```spice .param t_delay = 0n * 初始数据延时 .tran 0.01n 100n SWEEP t_delay 0n 5n 0.05n * 扫描延时[0-5ns],步长50ps ``` 3. **关键测量指令** ```spice * 检测输出Q在时钟上升沿后的状态 .measure tran setup_find FIND t_delay WHEN V(Q)=0.9 TRIG V(CLK) VAL=0.9 TD=5n RISE=1 .measure tran hold_find FIND t_delay WHEN V(Q)=0.9 TRIG V(CLK) VAL=0.9 TD=5n RISE=2 ``` --- #### 🛠️ 完整测量示例 ```spice * DFF Setup/Hold 时间测量 .option post=2 ingold=1 * 电源和信号源 Vdd Vdd 0 DC 1.8V Vclk CLK 0 PULSE(0 1.8 0 0.1n 0.1n 4.9n 10n) Vd D 0 PULSE(0 1.8 't_delay' 0.1n 0.1n 5n 20n) * 调用标准DFF库单元 XDFF D CLK Q QN Vdd 0 DFF_STD * 参数扫描设置 .param t_delay = 0n .tran 0.01n 100n SWEEP t_delay -0.5n 5n 0.02n * 扫描[-0.5,5ns]步长20ps * Setup Time测量: 数据在CLK上升沿前临界点 .measure tran setup_time FIND t_delay WHEN V(Q)=1.6 + TRIG V(CLK) VAL=0.9 TD=10n RISE=2 * 检测第二个时钟沿 + CROSS=1 TARG V(D) VAL=0.9 CROSS=1 * Hold Time测量: 数据在CLK上升沿后临界点 .measure tran hold_time FIND t_delay WHEN V(Q)=0.2 + TRIG V(CLK) VAL=0.9 TD=10n RISE=2 * 检测第二个时钟沿 + CROSS=1 TARG V(D) VAL=0.9 CROSS=1 .end ``` #### 📊 结果解析 1. **Setup Time**:当`t_delay`减少到数据变化过于接近时钟边沿时,Q输出未达到高电平阈值(V(Q)<1.6V) > $$t_{setup} = t_{clk\_edge} - t_{data\_transition}$$ 2. **Hold Time**:当`t_delay`过小导致数据在时钟后过早变化时,Q无法保持正确值(V(Q)>0.2V) > $$t_{hold} = t_{data\_transition} - t_{clk\_edge}$$ 3. **输出波形分析**:在Avanti Waves等工具中观察: - CLK和D信号的时间差 - Q输出信号的亚稳态/错误跳变点 - 临界点对应的`t_delay`值 --- #### ⚠️ 注意事项 1. **精度控制**:扫描步长建议取工艺节点的1/5 (如28nm工艺用5ps步长) 2. **电压阈值**:检测点电压取电源电压的10%~90%(如1.8V工艺用0.2V/1.6V) 3. **多周期验证**:至少扫描3个时钟周期避免亚稳态干扰 4. **工艺角覆盖**:在SS/TT/FF等不同工艺角下重复测量[^3] --- #### 📈 工程应用 测量结果可用于: 1. 时序约束文件`.sdc`中的setuptime/holdtime值 2. 静态时序分析(STA)的边界条件 3. 高速电路时序裕量验证[^1] > 当出现违例时,可通过增加缓冲器、调整时钟树或优化布局修复[^2]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值