添加时序约束的技巧分析(实用)

本文详细介绍了FPGA设计中的时序约束概念及其应用方法,包括周期约束、偏移约束和分组约束等内容,帮助读者理解如何有效地进行时序约束以优化FPGA设计。

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

文章转载网址:http://xilinx.eetrend.com/article/469


一般来讲,添加约束的原则为先附加全局约束,再补充局部约束,而且局部约束比较宽松。其目的是在可能的地方尽量放松约束,提高布线成功概率,减少ISE 布局布线时间。典型的全局约束包括周期约束和偏移约束。

在添加全局时序约束时,需要根据时钟频率划分不同的时钟域,添加各自的周期约束;然后对输入输出端口信号添加偏移约束,对片内逻辑添加附加约束。
1.周期约束
周期约束是附加在时钟网路上的基本时序约束,以保证时钟区域内所有同步组件的时序满足要求。在分析时序时,周期约束能自动处理寄存器时钟端的反相问题,如果相邻的同步元件时钟相位相反,则其延迟会被自动限制为周期约束值的一半,这其实相当于降低了时钟周期约束的数值,所以在实际中一般不要同时使用时钟信号的上升沿和下降沿。
硬件设计电路所能工作的最高频率取决于芯片内部元件本身固有的建立保持时间,以及同步元件之间的逻辑和布线延迟。所以电路最高频率由代码和芯片两部分共同决定,相同的程序,在速度等级高的芯片上能达到更高的最高工作频率;同样,在同一芯片内,经过速度优化的代码具有更高的工作频率,在实际中往往取二者的平衡。

在添加时钟周期之前,需要对电路的期望时钟周期有一个合理的估计,这样才不会附加过松或过紧的周期约束,过松的约束不能达到性能要求,过紧的约束会增加布局布线的难度,实现的结果也不一定理想。常用的工程策略是:附加的时钟周期约束的时长为期望值的90%,即约束的最高频率是实际工作频率的110% 左右。
附加时钟周期约束的方法有两个:一是简易方法,二是推荐方法。简易方式是直接将周期约束附加到寄存器时钟网线上,其语法如下所示:
[ 约束信号] PERIOD = { 周期长度} {HIGH | LOW} [ 脉冲持续时间];
其中,[] 内的内容为可选项,{} 中的内容为必选项,“|”表示选择项。[ 约束信号] 可为“Net net_name”或“TIMEGRP group_name”,前者表示周期约束作用到线网所驱动的同步元件上,后者表示约束到TIMEGRP所定义的信号分组上( 如触发器、锁存器以及RAM 等)。{ 周期长度} 为要求的时钟周期,可选用ms、s、ns以及ps 等单位,默认值为ns,对单位不区分大小写。{HIGH | LOW} 用于指定周期内第一个脉冲是高电平还是低电平。[ 脉冲持续时间] 用于指定第一个脉冲的持续时间,可选用ms、s、ns 以及ps 等单位,默认值为ns,如果缺省该项,则默认为50% 的占空比。如语句:
Net“ clk_100MHz” period = 10ns High 5ns;
指定了信号clk_100MHz 的周期为10ns,高电平持续的时间为5ns,该约束将被添加到信号clk_100MHz
所驱动的元件上。
推荐方法常用于约束具有复杂派生关系的时钟网络,其基本语法为:
TIMESPEC“ TS_identifier” = PERIOD“ TNM_reference” {周期长度}

{HIGH | LOW} [ 脉冲持续时间];
其中,TIMESPEC 是一个基本时序相关约束,用于标志时序规范。“TS_identifier”由关键字TS 和用户定义的identifier 表示,二者共同构成一种时序规范,称为TS 属性定义,可在约束文件中任意引用,大大地丰富了派生时钟的定义。在使用时,首先要定义时钟分组,然后再添加相应的约束,如:
NET“ clk_50MHz” =“ syn_clk”;
TIMESPECT“ TS_syn_clk” = PERIOD“ syn_clk” 20 HIGN 10;
TIMESPEC 利用识别符定义派生时钟的语法为:
TIMESPEC“ TS_identifier2” = PERIOD“ timegroup_name” “ TS_identifier1”
[* | /] 倍数因子 [+| -] phasevalue [ 单位]
其中,TS_identifier2 是要派生定义的时钟,TS_identifier1 为已定义的时钟,“倍数因子”用于给出二者周期的倍数关系,phasevalue 给出二者之间的相位关系。如:
定义系统时钟clk_syn :
TIMESPEC“ clk_syn” = PERIOD“ clk” 5ns;
下面给出其反相时钟clk_syn_180 以及2 分频时钟clk_syn_half :
TIMESPEC“ clk_syn_180” = PERIOD“ clk_180” clk_syn PHASE + 2.5ns;
TIMESPEC“ clk_syn_180” = PERIOD“ clk_half” clk_syn / 2;
2.偏移约束
偏移约束也是一类基本时序约束,规定了外部时钟和数据输入输出引脚之间的相对时序关系,只能用于端口信号,不能应用于内部信号,包括OFFSET_IN_BEFORE,OFFSET_IN_AFTER,OFFSET_OUT_BEFORE,
OFFSET_OUT_ AFTER 等4 类基本约束。偏移约束的基本语法为:
OFFSET = [IN | OUT]“ offset_time” [units] {BEFORE | AFTER}“ clk_name”
[TIMEGRP“ group_name”];
其中[IN | OUT] 说明约束的是输入还是输出。“offset_time”为数据和有效时钟沿之间的时间差,{BEFORE
| AFTER} 表明该时间差是在有效时钟之前还是之后,“clk_name”为有效时钟的名字,[TIMEGRP “group_
name”] 是用户添加的分组信号,在缺省时,默认为时钟clk_name 所驱动的所有触发器。偏移约束通知布局布线器输入数据的到达时刻,从而可准确调整布局布线的过程,使约束信号建立时间满足要求。
1)“OFFSET IN”偏移约束
“OFFSET IN ”偏移约束是输入偏移约束,有OFFSET_IN_AFTER 和OFFSET_IN_BEFORE 两种,前者定义了输入数据在有效时钟到达多长时间后可以到达芯片的输入管脚,这样可以得到芯片内部的延迟上限,从而对那些与输入引脚相连的组合逻辑进行约束;后者定义数据比相应的有效时钟沿提前多少时间到来,是与其相连的组合逻辑的最大延时,否则在时钟沿到来时,数据不稳定,会发生采样错误。输入偏移的时序关系如图5-10所示。

DATA_IN
TIN_AFTER TIN_BEFORE
TP
CLK_SYS
图5-10 输入偏移的时序关系
例如:
NET“ DATA_IN” OFFSET = IN 10.0 BEFORE“ CLK_50MHz”;
表明在时钟信号CLK_50MHz 上升沿到达前的10ns 内,输入信号DATA_IN 必须到达数据输入管脚。
NET“ DATA_IN” OFFSET = IN 10.0 AFTER“ CLK_50MHz”;
表明在时钟信号CLK_50MHz 上升沿到达后的10ns 内,输入信号DATA_IN 必须到达数据输入管脚。
2)“OFFSET OUT”偏移约束
“OFFSET OUT”偏移约束是输出偏移约束,有OFFSET_OUT_AFTER 和OFFSET_OUT_BEFORE 两种,前者定义了输出数据在有效时钟沿之后多长时间稳定下来,是芯片内部输出延时的上限;后者定义了在下一个时钟信号到来之前多长时间必须输出数据,是下一级逻辑建立时间的上限。输出偏移的时序关系如图5.3.11 所示。
Q_OUT
TOUT_BEFORE TOUT_AFTER
TP
CLK_SYS
图5-11 输出偏移的时序关系
例如:
NET“ DATA_OUT” OFFSET = OUT 10.0 BEFORE“ CLK_50MHz”;
表明在时钟信号CLK_50MHz 上升沿到达前的10ns 内,输出信号DATA_OUT 信号必须离开数据输出管脚。
NET“ DATA_OUT” OFFSET = OUT 10.0 AFTER“ CLK_50MHz”;
表明在时钟信号CLK_50MHz 上升沿到达后的10ns 内,输出信号DATA_OUT 信号必须一直保持在数据输
出管脚上。
3.分组约束
分组约束可有效管理大量的触发器、寄存器和存储器单元,将其分为不同的组,每组附加各自的约束,在大型设计中有着广泛的应用。
1)TNM/TNM_NET 约束
TNM/TNM_NET 约束用于选出可构成一个分组的元件,并对其重新命名,然后整体添加约束。除了IBUFG和BUFG 外,所有的FPGA 内部元件都可以用TNM 来命名,其语法规则为:
{NET|INST|PIN}“ ob_name” TNM =“ New_name”;
其中“ob_name”为NET、INST 以及PIN 的名称,New_name 为分组的名称。例如:
48.
FPGA开发全攻略—工程师创新设计宝典上册 基础篇
INST ff1 TNM = MY_FF1;
NIST ff2 TNM = MY_FF1;
将实例ff1 与ff2 添加到新分组MY_FF1 中。
此外,TNM 语法也支持通配符“?”和“*”,提高了在大规模设计中添加分组约束的效率。
当TNM 约束附加在线网上时,则该路径上所有的同步元件都会被添加到分组中,但不会穿过IBUFG 组件;
当TNM 约束附加到宏或原语的管脚上,则被该引脚驱动的所有同步元件会被添加到新分组中;当TNM 约束附
加到原语或宏上,则将原语或宏添加到新的分组中。
TNM_NET 约束专门用来完成网线的分组,与TNM 不同的是,TNM 可以穿越IBUFG/BUFG。因此,如果把TNM 约束添加到端口上,则只能定义该端口;而要是把TNM_NET 添加到端口上,则可穿越BUFG,受该端口驱动的所有组件都将被添加到分组中。
2)TIMEGRP 约束
TIMEGRP 用于分组合并和拆分,将多个分组形成一个新的分组。其合并分组的语法为:
TIMEGRP“ New_group” =“ Old_group1” “ Old_group2” … ;
其中,New_group 为新建的分组,而Old_group1 和Old_group2 以及…为要合并的已有分组。
拆分分组的语法为:
TIMEGRP“ New_group” =“ Old_group1” EXCEPT“ Old_group2”;
其中Old_group2 是Old_group1 的子集,New_group 为Old_group1 中除去Old_group2 之外所有的部分。
3)TPSYNC 约束
TPSYNC 用于将那些不是管脚和同步元件的组件定义成同步元件,以便可以利用任意点来作为时序规范的
终点和起点。其相应的语法为:
{NET|INST|PIN}“ ob_name” TPSYNC=“ New_part”;
将TPSYNC 约束附加在网线上,则该网线的驱动源为同步点;附加在同步元件的输出管脚上,则同步元件
中驱动该管脚的源为同步点;附加在同步元件上,则输出管脚为同步点;附加在同步元件的输入管脚上,则该
引脚被定义成同步点。
4)TPTHRU 约束
TPTHRU 用于定义一个或一组路径上的关键点,可使用户定义出任意期望的路径。其相应的语法为:
{NET|INST|PIN}“ ob_name” TPTHRU =“ New_name”;
例如,在图5-12 所示场景中,从A1 到A2 有两条路径,其中逻辑1 的延迟很大,需要提取出来完成特定的约束:

逻辑1
逻辑2
D O
D O
A1 to A2_1
A1 to A2_2
A1
A2
图5-12 TPTHRU约束示例场景
INST“ A1” TNM =“ S”;
INST“ A2” TNM =“ E”;
NET“ A1toA2_1” TPTHRU =“ M”;
TIMESPEC“ SME” = FROM“ S” THRU“ M” TO“ B” 10;
其中第三句指令利用TPTHRU 定义了中间点“M”,然后第4 句在此基础上定义了通过M 点的整条路径,从两条平行的路径中挑出了期望路径。
4.局部约束
局部约束包括FROM_TO 约束、最大延时约束、最大偏移约束、虚假路径、系统时钟抖动约束、多周期路径和多时钟域约束等。在实际开发中,正如本章前沿所述,时序是设计出来,而不是靠约束自动得到的,因此这里不再对局部约束作过多讨论。

<think>嗯,我现在需要帮用户解决关于电路时序约束设计方法和最佳实践的问题。用户特别提到了FPGA和ASIC的时序分析,还引用了四篇相关文献。首先,我需要回顾用户提供的引用内容,看看哪些信息可以直接应用。用户引用的[1]提到FPGA在通信行业的应用广泛,但可能对具体约束方法帮助不大,可以先放一边。[2]详细介绍了四种时序路径的约束类型,这是关键点。[3]解释了输入延迟的计算方法,包括Tco、Tpd、Tsu和Tclk,还给出了具体例子。[4]则讨论了时序例外,尤其是多周期路径设置。这些引用内容覆盖了时序约束的主要部分,我需要整合这些信息,并结合用户的实际需求。用户的上次问题是关于FPGA时序约束技巧和ASIC时序分析,所以需要区分两者。虽然两者有相似之处,但FPGA的约束通常在工具中设置,而ASIC可能更灵活但更复杂。用户提到的“最佳实践”和“技巧”暗示需要实用、可操作的方法。接下来,思考用户的具体问题:常见设计方法、FPGA技巧、ASIC分析。根据引用[2],四种路径(输入到寄存器、寄存器间、寄存器到输出、输入输出组合)是心。必须分别讨论如何约束这些路径,并引用提供的公式,如输入延迟计算。引用[3]中的inputdelay公式需要详细解释,可能用户希望了解如何实际计算各个参数,比如Tco来自外部芯片手册,Tpd根据PCB走线估算(10cm/ns)。这里需要强调实际计算例子,如用户给出的3.5ns的例子,说明如何推导最大路径延迟。关于多周期路径(引用[4]),这是常见的例外情况,比如某些路径需要多个时钟周期完成。用户可能遇到这种情况,需要说明如何设置,同时避免过度约束导致优化不足。此外,伪路径(falsepath)和异步时钟域处理也是关键点,用户可能没有提到,但属于最佳实践的一部分。另外,用户可能关心如何选择正确的时钟频率,包括时钟不确定性(jitter和skew)的预留,这在高速设计中尤为重要。引用中提到时钟延迟Tclk的影响,这部分需要结合setup/hold时间分析,可能引入余量的概念。FPGA和ASIC的差异方面,ASIC可能需要更多自定义约束,而FPGA工具自带优化,但正确设置约束仍至关重要。例如,FPGA的布局布线工具依赖约束来优化关键路径,因此用户需明确指定约束条件。用户可能没有意识到时序约束的步骤,比如从时钟定义开始,然后设置输入输出延迟,再处理例外路径。需要结构化步骤,比如按优先级排序,先全局后例外。最后,生成的问题需要引导用户深入学习,比如多周期路径的应用场景、跨时钟域的处理方法,或者时序分析工具的使用。这些扩展问题能帮助用户更全面地理解主题。需避免遗漏关键点,如保持时间约束的处理,引用中未详细提及,但实际设计中和建立时间同样重要,尤其是holdtime的公式可能与输入延迟计算不同。需要补充这方面的信息,确保用户了解完整时序分析流程。总结:整合引用中的四种路径约束时序例外处理,结合时钟和余量设置,区分FPGA与ASIC的异同,给出实际计算案例,结构化步骤,并补充遗漏的保持时间分析和跨时钟域处理,最后通过问题引导深入学习。</think> 以下是FPGA/ASIC时序约束设计的心方法与最佳实践总结,结合理论规范与实际工程技巧: ### 一、基础时序路径约束方法 1. **时钟定义(基础)** - **约束公式**:`create_clock -period [周期] -name [名称] [时钟源]` - **关键参数**:周期需包含时钟抖动(Jitter)和偏斜(Skew)余量(通常预留10-15%) *例:100MHz时钟需约束为8.5ns而非理论值10ns[^3]* 2. **输入延迟(Input Delay)** - **计算公式**: $$T_{input\_delay} = T_{co\_ext} + T_{pd\_pcb} + T_{su\_fpga} - T_{clk\_skew}$$ - $T_{co\_ext}$:外部器件时钟到输出延迟(查器件手册) - $T_{pd\_pcb}$:PCB走线延迟(通常0.15ns/cm) *例:当$T_{co\_ext}=3ns, T_{pd\_pcb}=2ns, T_{su}=0.2ns, T_{clk\_skew}=1.7ns$时,需约束`set_input_delay 3.5ns`[^3]* 3. **输出延迟(Output Delay)** - **计算公式**: $$T_{output\_delay} = T_{su\_ext} + T_{pd\_pcb} - T_{clk\_skew}$$ ![时序路径示意图](https://via.placeholder.com/400x200?text=FPGA时序路径示意) [^2] 4. **寄存器到寄存器路径** - **自动约束**:工具根据时钟周期自动优化 - **关键技巧**:对高频路径手动设定`max_delay`(如将10ns周期路径约束为9ns) ### 二、高级时序例外处理 1. **多周期路径(Multicycle Path)** ```tcl set_multicycle_path 2 -setup -from [起点] -to [终点] # 声明2周期完成 set_multicycle_path 1 -hold -from [起点] -to [终点] # Hold检查周期需匹配 ``` *适用于跨时钟域分频器、低速控制信号等[^4]* 2. **伪路径(False Path)** ```tcl set_false_path -from [异步模块A] -to [异步模块B] ``` *用于异步时钟域、测试逻辑等无需时序分析的路径* 3. **跨时钟域约束(CDC)** - 添加`set_clock_groups -asynchronous`声明异步时钟 - 对同步器链第一级设置`set_max_delay 0.5ns -datapath_only` ### 三、关键实践技巧 1. **分层约束策略** ```mermaid graph TD A[顶层时钟约束] --> B[模块级I/O约束] B --> C[关键路径例外] C --> D[时序验证报告] ``` 2. **时序余量优化** - 高温/低压场景预留额外15%余量 - 高速接口使用`set_clock_uncertainty`补偿抖动 3. **工具协同优化** ```tcl # 物理综合阶段约束 set physopt_enable_via_res_support true set_boundary_optimization [模块] true ``` ### 四、FPGA vs ASIC差异对比 | **约束类型** | FPGA实现重点 | ASIC实现重点 | |--------------------|------------------------------|----------------------------| | **时钟约束** | 依赖全局时钟树 | 需手工定制时钟树 | | **布线延迟** | 工具自动优化为主 | 需预留金属层延迟余量 | | **PVT影响** | 使用厂商预封装模型 | 需建立多工艺角约束 | | **时序例外** | 依赖SDC文件声明 | 需结合DFT协同验证 | ### 五、验证流程 1. 静态时序分析(STA)通过PrimeTime/Tempus 2. 门级仿真覆盖异步路径 3. 板级实测眼图验证(>1.6UI张开度) --- **
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值