对input_delay和output_delay的理解

本文详细解析了在芯片设计过程中如何理解和应用input_delay与output_delay的概念。通过具体实例阐述了时序分析的目的及其约束方法,解释了在不同情况下input_delay与output_delay可能出现的正值和负值的原因。

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

input_delayoutput_delay的理解

觉得对input我应该知道的是对端其间的tco,对于output我们应该知道对端器件的setuphold,因为我以前就是拿来对端器件比如一个ADC的数据手册它上面就这么写的,然后我按照它写的参数来约束保证接口时序。

     想了一会发现,其实对这个问题是应该这样理解的,我们现在是做芯片的了,是我们自己要写芯片手册了,我们该写到手册里的就应该是上面这样的参数,这个参数有可能是一些经验值,有可能是参照其他同类芯片的参考值,也有可能就是根据与自己的芯片对接的芯片的参数确定的(就像FPGA一样),但是我们写在手册上的好像就应该是这样的值。

理解了这点,但是还是觉得不知道怎么约束,因为我得到参数并不是我想要的,对于这点其实只要理解了约束input_delayoutput_delay的那几个词到底都指得是什么东西可能就好理解了。

还是看这个时序分析的图,我们要约束的是图中Input_Path这条路径,那么约束这条路径到底是为了什么呢,是为了让软件求出图中x的最大和最小值,无论是综合还是STA都是这样。实际上这条链路上有两个量是未知的,clk0clk1的关系是未知的,信号从clk0到芯片输入端总的tco是未知的。其他信息包括clk1本身时钟的一些特性,内部寄存器的setuphold等等这些量都是已知的。

2

    那么实际上这句set_input_delay就是在告诉软件这两个未知量的值,首先在约束前会创建一个虚时钟如图 3,这个时钟就代表clk0,在DT003里根据需求创建了一个100M,相位为0,即与clk1相同相位的时钟。

3 虚拟时钟创建

但这里并没有完全解决第一个未知条件,实际上clk0clk1的即使在单板上由同一个时钟芯片产生,但到达两个芯片的延时也不会相同,所以两个时钟的相位不是理想的相差为0,这里我们把两个时钟的相位关系这一部分时延折算到了Input_delay里面,这里把从clk0MY chip输入端口上面所有的时延称作Rtco,而将时钟原点到clk1clk0的延时之差称作clk_dly(Delay_clk1  –  Delay_clk0),那么Input_delay值和Rtco以及clk_dly的关系可又下图所示。

4  input_delay的真实含义

从上面图中可以看出,input_delay = Rtco – clkdly 这样我们把两个未知量合并成一个未知量,在我们的约束语句中用max_delaymin_delay的形式给出约束范围。这么看应该可以解释为什么约束input_delay时会有负值,当clk1clk延后时间大于Rtco时,那如果我们依然认为信号是从vir_clk0打出来的话,真实信号就是有着负tco的。

讨论到这里现在来看下根据DT003给的Timing Spec我们要怎样约束input_delay,表中给了DT003这个端口的Setup要求为最小3nshold要求为最小-0.5ns,这里已经按上面的方法把真实路径通过input_delay折算到了vir_clk0clk1这条理想路径上来了,如果我们芯片要求3ns的最小建立时间,那么对接芯片加上单板时延就一定得在满足这个要求我才能正常工作,所以看到max_input_delay从图 5中得出,为周期-setup

5

对于hold这里给出了一个负值-0.5,意思是说在我芯片管脚位置,我的时钟有效边沿来的时,其实在最多0.5ns之前输入信号就已经变化成下一个值了,即便这样我的芯片还是能保证对数据的正常采样,因为有我们的x在。如图 6所示,min_input_delay =hold,是个负值。

6

    于是有了我们的约束:把不知道的时钟指定成创建的虚拟时钟,把不知道的input_delay的最大最小值指定一下,这样就完成了约束,软件也就知道了x的取值范围。

 

对于output_delay的约束同样看下下图。Output_Path是我们要约束的路径,还是为了求图中的x而进行约束。

7

对于同样的这次我们clk1是不知道的,创建一个虚拟时钟vir_clk1,同样的我们把时钟相位的延时折算到output_delay里面了,在约束output _delay时认为采样寄存器本身的SetputHold时间都是理想的0,可以理解为把他们本身也折算到output_delay这个值里面了,这样我们就又得到了一个经典时序分析模块型了。

看看给我们的参数,My chip TCO最大值为5ns,最小值为1ns。就是说我芯片最大可能有5nsTCO那么对接芯片和单板设计要保证我TCO=5时必须可以使对端芯片正确采样数据,那么他们最多只有“周期-maxTCO”这么多时间可以用,也可如图 8所示。

8

     我们芯片的最小TCO可能是1ns,就是说对数据我们芯片最小也能提供1ns的延时,那么如果当刚好满足到对端芯片寄存器Dhold0的临界要求。我们芯片可以允许外面的东西带来一个-1nsoutput_delay,这里负值同上面输入时说的是折算时钟相位延时得到的。如果再小就满足不了hold要求了,那么就是说这个最小的output_delay就是“-TCOmin”,如图 9所示。

9

根据上面所述将output_delay约束为:

上面的约束值都是STA时的值,综合时候需要加入一定的余量,就是max在约大一点点0.几个nsmin在约小一点点,让综合工具更努力些。

<think>我们有一个原始时钟周期为10ns的约束,现在要将时钟周期改为2.5ns(即频率从100MHz提高到400MHz)。需要调整input_delayoutput_delayinput_transition的值。 原始约束: create_clock [get_ports {clk}] -name clk -period 10 set_input_delay -max 3 -clock clk [remove_from_collection [all_inputs] clk] set_output_delay -max 2.5 -clock clk [all_outputs] set_input_transition 0.15 [all_inputs] 调整原则: 1. 时钟周期:从10ns变为2.5ns,即新周期为原周期的1/4。 2. input_delayoutput_delay:这些延迟是相对于时钟周期的约束。在理想情况下,如果外部电路的速度也按同样比例提升(即同步等比例缩放),那么这些延迟值也应该按比例缩小(乘以1/4)。但是,实际中需要根据外部器件的特性来确定。 然而,需要注意的是,input_delayoutput_delay是外部路径的延迟,它们与内部电路的工作频率没有直接的比例关系。但是,在高速设计中,我们通常希望外部路径的延迟也按比例减小,否则留给内部逻辑的时间会非常紧张。 具体调整: - 原input_delay为3ns,原周期10ns,则留给内部逻辑的建立时间余量为:10 - 3 = 7ns。 - 新周期2.5ns,如果希望保持同样的余量比例(7/10=0.7),那么新的input_delay应为:2.5 * (3/10) = 0.75ns。但更合理的做法是考虑外部器件的实际延迟,如果外部器件延迟可以降低,则按比例降低;如果不能,则可能需要重新评估设计。 同样,对于output_delay: - 原output_delay为2.5ns,留给内部逻辑的时间为10-2.5=7.5ns。 - 新周期下,若按比例,则output_delay应为:2.5 * (2.5/10) = 0.625ns。 但是,这里有一个重要问题:input_transition(输入信号的翻转时间)通常与驱动该输入的器件的输出驱动能力有关,与时钟周期没有直接的比例关系。然而,在更高频率下,我们通常要求更快的翻转(即更小的transition时间)来减少信号建立时间。因此,可能需要减小input_transition的值。 但是,具体如何调整input_transition?这取决于实际驱动输入端的外部器件。如果外部器件能够支持更高速度(即更快的驱动能力),那么可以减小input_transition;否则,不能随意减小。 因此,调整后的约束可能如下(假设外部路径延迟可以按比例缩放,且外部器件驱动能力增强): create_clock [get_ports {clk}] -name clk -period 2.5 set_input_delay -max 0.75 -clock clk [remove_from_collection [all_inputs] clk] set_output_delay -max 0.625 -clock clk [all_outputs] set_input_transition 0.0375 [all_inputs] # 0.15 * (2.5/10) = 0.0375 然而,需要注意的是,input_transition的调整并不是简单的线性比例。因为信号翻转时间与负载电容驱动电流有关,在更高频率下,负载电容可能不变,但为了满足时序,可能需要更强的驱动(即更小的transition时间)。但是,0.15ns的翻转时间已经很小(对应高速驱动),进一步减小到0.0375ns可能不现实,因为实际器件的驱动能力有限。 因此,在实际操作中,我们通常根据以下原则: - 时钟周期按实际需求设置。 - input_delay/output_delay:根据实际接口器件的时序要求来设置,而不是简单按比例缩放。例如,如果外部器件的数据建立时间要求为1ns(在400MHz下),那么input_delay可以设置为1ns(而不是0.75ns)。所以,最好参考接口器件的时序手册。 - input_transition:根据驱动输入端的外部器件的输出驱动能力(通常由数据手册给出)来设置。如果没有具体信息,可以按比例缩放,但要注意物理可实现性。 结论: 在没有具体外部器件信息的情况下,我们可以按比例缩放,但必须意识到这只是一个初步估计,实际值需要根据接口时序要求确定。 修改后的命令(按比例缩放): create_clock [get_ports {clk}] -name clk -period 2.5 set_input_delay -max 0.75 -clock clk [remove_from_collection [all_inputs] clk] set_output_delay -max 0.625 -clock clk [all_outputs] set_input_transition 0.0375 [all_inputs] 但是,请注意: - 0.0375ns(即37.5ps)的输入翻转时间对于大多数工艺来说是非常苛刻的要求,可能难以实现。因此,需要确认外部驱动器件是否能够提供如此快的翻转。如果不能,则应该使用外部器件实际能够达到的翻转时间。 因此,更稳妥的做法是: - 保持input_transition不变(如果外部器件没有改变)或者根据新选用的高速器件的数据手册设置一个合理的值(比如0.05ns到0.1ns之间)。 所以,如果外部器件没有升级,可能input_transition无法减小,那么我们就只能设置一个合理的值,比如0.1ns(假设外部器件在高速下也能达到这个翻转时间)。 综上,调整后的约束可能为: create_clock [get_ports {clk}] -name clk -period 2.5 set_input_delay -max 0.75 -clock clk [remove_from_collection [all_inputs] clk] set_output_delay -max 0.625 -clock clk [all_outputs] set_input_transition 0.1 [all_inputs] # 根据实际情况调整 或者,如果外部延迟不能按比例缩放,则需要根据实际接口时序要求重新设定input_delayoutput_delay。 重要建议:在提高时钟频率后,务必重新检查外部接口的时序要求,因为简单的比例缩放可能不符合实际。</think>### 根据时钟周期调整DC约束参数的完整指南 当将时钟周期从10ns调整为2.5ns(频率从100MHz提升至400MHz)时,需要重新计算输入/输出延迟信号翻转时间,确保时序约束的物理合理性设计可行性。以下是详细调整方法: #### 1. **时钟周期调整** ```tcl # 原始命令(10ns周期) create_clock [get_ports {clk}] -name clk -period 10 # 新命令(2.5ns周期) create_clock -period 2.5 -name clk [get_ports clk] ``` - **周期变化**:$T_{\text{new}} = \frac{1}{4} T_{\text{original}}$ - **影响**:内部逻辑路径的最大允许延迟从10ns缩减到2.5ns[^1] --- #### 2. **输入延迟(set_input_delay)调整** ```tcl # 原始命令(3ns延迟) set_input_delay -max 3 -clock clk [remove_from_collection [all_inputs] clk] # 新命令(按比例缩放) set_input_delay -max 0.75 -clock clk [remove_from_collection [all_inputs] clk] ``` - **计算公式**: $$ \text{input\_delay}_{\text{new}} = \text{input\_delay}_{\text{original}} \times \frac{T_{\text{new}}}{T_{\text{original}}} = 3 \times \frac{2.5}{10} = 0.75\text{ns} $$ - **物理意义**:外部逻辑延迟必须等比例缩减,否则会占用过多时序裕量[^1][^4] - **验证要求**:确保外部器件能支持0.75ns的延迟(需检查接口规范) --- #### 3. **输出延迟(set_output_delay)调整** ```tcl # 原始命令(2.5ns延迟) set_output_delay -max 2.5 -clock clk [all_outputs] # 新命令(按比例缩放) set_output_delay -max 0.625 -clock clk [all_outputs] ``` - **计算公式**: $$ \text{output\_delay}_{\text{new}} = 2.5 \times \frac{2.5}{10} = 0.625\text{ns} $$ - **裕量分析**: - 原裕量:$10 - 2.5 = 7.5\text{ns}$ - 新裕量:$2.5 - 0.625 = 1.875\text{ns}$ - **关键限制**:输出驱动需在0.625ns内稳定,对输出缓冲器提出更高要求[^1] --- #### 4. **输入翻转时间(set_input_transition)调整** ```tcl # 原始命令(0.15ns翻转时间) set_input_transition 0.15 [all_inputs] # 新命令(按比例缩放) set_input_transition 0.0375 [all_inputs] ``` - **计算公式**: $$ \text{transition}_{\text{new}} = 0.15 \times \frac{2.5}{10} = 0.0375\text{ns} $$ - **物理挑战**: - 0.0375ns(37.5ps)接近高速SerDes接口的翻转要求 - 需验证工艺库是否支持:检查.lib文件中的max_transition约束[^3] - **备选方案**:若工艺不支持,可放宽至$0.05\text{ns}$(需额外时序裕量补偿) --- ### 完整约束示例 ```tcl # 400MHz设计约束 create_clock -period 2.5 -name clk [get_ports clk] set_input_delay -max 0.75 -clock clk [remove_from_collection [all_inputs] clk] set_output_delay -max 0.625 -clock clk [all_outputs] set_input_transition 0.0375 [all_inputs] ``` --- ### 关键验证点 1. **工艺库支持**:确认目标工艺在400MHz下能实现37.5ps翻转时间 2. **接口时序**:验证外部器件能否满足0.75ns输入延迟要求 3. **时钟树质量**:时钟抖动需控制在周期5%以内($0.125\text{ns}$) 4. **裕量分配**:建议保留15%时序裕量($0.375\text{ns}$) > ⚠️ **注意**:若外部器件无法等比例提速,需采用多时钟约束[^4]: > ```tcl > create_clock -period 10 -name ext_clk [get_ports ext_clk] > set_input_delay -max 3 -clock ext_clk [get_ports data_in] > ``` --- ### 相关问题 1. 如何验证调整后的约束是否满足工艺库的物理限制? 2. 当时钟频率提升4倍时,时序路径的最大允许延迟如何变化? 3. 输入翻转时间不满足工艺要求时有哪些解决方案? 4. 多时钟域设计中如何协调不同频率的输入/输出约束? 5. 如何根据STA报告反推最优的input_transition值? [^1]: 时序约束比例缩放原理 [^3]: 输入翻转时间与工艺关系 [^4]: 多时钟约束处理方法
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值