Vivado集成开发环境时序约束介绍
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Vivado时序约束
本文主要介绍如何在Vivado设计套件中进行时序约束,原文出自Xilinx中文社区。
1Timing Constraints in Vivado -UCF to XDC
Vivado软件相比于ISE的一大转变就是约束文件,ISE软件支持的是UCF(User Constraints File),而Vivado软件转换到了XDC(Xilinx Design Constraints)。
XDC主要基于SDC(Synopsys Design Constraints)标准,另外集成了Xilinx的一些约束标准,可以说这一转变是Xilinx向业界标准的靠拢。
Altera从TimeQuest开始就一直使用SDC标准,这一改变,相信对于很多工程师来说是好事,两个平台之间的转换会更加容易些。
首先看一下业界标准SDC的原文介绍:
Synopsys' widely-used design constraints format, known as SDC, describes the "design intent" and surrounding constraints for synthesis, clocking, timing, power, test and environmental and operating conditions. SDC has been in use and evolving for more than 20 years, making it the most popular and proven format for describing design constraints. Essentially all synthesized designs use SDC and numerous EDA companies have translators that can read and process SDC.
Xilinx原先的自成一派(UCF)其实其实也算做的不错,相信使用过UCF的工程师也有同感,并没有什么不便。
像Apple那样软件和硬件都自成一派而且能与其它所有派别抗衡的,背后需要有多强大的团队支持,可能Xilinx可是考虑到这点,不想花费过多的精力去维护。
(个人见解)
文归正题,如果有读者以前没有使用XDC/SDC的经验,这边讲解一下如何从UCF到XDC 的转换。
如图1所示为UCF与SDC的约束命令比较,可以发现常用的命令都能对应上。
图1
下面简单举例说明:
Clock Period:
UCF :NET "clka" TNM_NET = "clka";
TIMESPEC "TS_clka" = PERIOD "clka" 13.330 ns HIGH 50.00%;
XDC :create_clock -name clka -period 13.330 -waveform {0 6.665} [get_ports clka]
Input Port:
UCF :OFFSET = IN 8 BEFORE clka;
XDC :set_input_delay -clock clka 2 [all_inputs]
注: clock period = 10 ns.
Output Port:
UCF :OFFSET = OUT 12 AFTER clkc;
XDC :set_output_delay -clock clkc 8 [all_outputs]
注:clock period = 20 ns.
除了以上约束命令的差别外,UCF和XDC间的主要差别如下:
1.XDC是顺序执行约束,每个约束指令有优先级
2.UCF一般约束nets对象,而XDC约束类型是pins, ports和cells对象
3.UCF约束默认不对异步时钟间路径进行时序分析,而XDC约束默认所有时钟是相关的,会分析所有路径,可以通过设置时钟组(set_clock_groups)取消时钟间的相关性。
下面介绍一下在Vivado中添加XDC文件以及加入约束命令的方法:
首先在Project Manager中展开Constraints类,选择Add Sources即可添加或者新建XDC 约束文件,如图2所示。
图2
选择新建的XDC文件,双击打开,选择左侧的Templates,其中有XDC约束命令的实例,所有的约束命令都可以在其中找到,非常方便,如图3,4所示。
X DC约束文件可以在编译综合和实现过程中使用时,在综合和实现设置中都能选择需要的约束,如图5。
通过创建约束文件集,如图6,设计者可以使能不同的约束集合测试FPGA 设计的性能;在约束文件集中可以包含多个XDC约束文件,在FPGA设计比较复杂时,可以分模块或者IP核约束,相应的则有多个XDC约束文件,这样设计和维护效率都能得到提高。
图6
2Timing Constraints in Vivado -- 2. Timing Basics
在深入讲解XDC约束前,先介绍一下基本的时序约束、分析的概念。
2.1Timing Path:
图1中包含了主要的时序分析路径:
1.输入端口到FPGA内部时序单元的路径
2.FPGA内部时序单元间的路径
3.FPGA内部时序单元到输出端口的路径
4.输入端口到输出端口的路径
图1
不管时序单元是在FPGA内部还是外部,除了第4条路径,它是从输入端口到输出端口,其间没有锁存,其它3条路径的时序分析都以2个时序单元间的路劲进行分析,如图2所示。
第一个时序单元上的时钟称为source clock(启动时钟),第二个时序单元上的时钟称为destination clock(锁存时钟),时序分析从source clock的上升沿开始,到之后的destination clock的上升沿结束,时序分析的过程就是检验数据在两个上升沿时间差内经过数据路径传输后是否满足要求,数据到达时需要满足后一级时序单元的setup/hold要求,其本质上是需要数据在到达后一级时序单元时不发生亚稳态,数据能够被稳定地采集到并且稳定地输出。
2.2Clock Setup Check:
检验Setup是否满足要求,这边引入setup slack概念,只要setup slack的值大于零即Setup检查满足要求,其计算公式如下:
setup slack = data required time –data arrival time
其中:
data required time=destination clock edge time + destination clock path delay
- clock uncertainty- setup time
data arrival time=source clock edge time + source clock path delay
+ clock to output time + data path delay
公式代入可得到:
setup slack =(destination clock edge time - source edge time)
+(destination clock path delay - source clock path delay)
- clock uncertainty - setup time - clock to output time - data path delay
= T destination_to_source+ (T clk-D2–T clk-D1) –T clk_uncertainty–T setup–uT co -
T data_path_delay
在Setup检查中source clock一定超前于destination clock。
其中第一部分T destination_to_source,当source clock和destination clock为异步时钟时,如图
3中实例,source clock的周期等于6ns,destination clock的周期等于4ns,首先假定2个时钟的相位差为0,图中在这种情况下有2个setup关系,setup1下T destination_to_source=4ns,setup2下T destination_to_source=2ns,在实际分析中应该选取最严格的情况,即选取setup2这种。
而当source clock和destination clock为同一个时钟时,T destination_to_source的值很显然就是时钟周期T clk_period,这也是时序分析最多的情况了,进一步推导setup slack = T clk_period+ (T clk-D2–T clk-D1) –T clk_uncertainty - T setup–T data_path_delay> 0,可以得到:
T clk_period> T clk_uncertainty+ T setup+ T data_path_delay - (T clk-D2–T clk-D1) T clk_period、T clk_uncertainty可以通过时序约束确定其值,uT co, T setup是时序单元的属性值,(T clk-D2–T clk-D1)在布局布线后其值也能确定,剩下T data_path_delay对T clk_period影响最大,一个设计Setup检查中的关键路径往往是T data_path_delay值最大的一条路径,影响其值有很多原因,如逻辑级数过多,扇出导致布线延时过大…
2.3Clock Hold Check:
对应Hold检查,也有hold slack,其计算公式如下:
hold slack=data arrival time –data required time
其中
data required time = destination clock edge time + destination clock path delay
+ clock uncertainty + hold time
data arrival time=source edge time + source clock path delay
+ clock to output time + data path delay
代入公式得到:
hold slack =(source clock edge time - destination edge time)
+(source clock path delay - destination clock path delay)
- clock uncertainty - hold time + clock to output time + data path delay
=T source_to_destination+ (T clk-D1–T clk-D2) –T clk_uncertainty–T hold+ uT co+
T data_path_delay
与Setup检查不同,在Hold检查下destination clock超前于source clock。
在Setup检查中,T destination_to_source的值选取destination clock和source clock相差最小的情况下进行分析;而Hold检查中T source_to_destination的值选取所有Setup关系分别进行分析,每一种Setup 关系对应有两种情况,然后选取所有情况中T destination_to_source值大的计算对应的T-source_to_destination
a.取Setup关系的前一个destination clock沿,如图4中Hold1a和Hold2a
b.取Setup关系的destination clock沿,如图4中Hold1b和Hold2b
根据图4中实例计算得到:
Hold1a:Tdestination_to_source= 0ns
Hold1b:Tdestination_to_source= -2ns
Hold2a:Tdestination_to_source= -2ns
Hold2b:Tdestination_to_source= -4ns
显然选取Hold1a,对应Tsource_to_destination值为0ns
当source clock和destination clock为同一个时钟时,可以计算得到:
T source_to_destination值为0ns,进一步推导
hold slack = T source_to_destination+ (T clk-D1–T clk-D2) –T clk_uncertainty–T hold+ T data_path_delay> 0可以得到:
T data_path_delay>T clk_uncertainty+ T hold+ (T clk-D2–T clk-D1)
由上得出数据路径的延时也不能过短,与Setup检查是矛盾对立的存在;在FPGA设计或者数字前端开发时,工程师考虑最多的是Setup是否满足要求,而Hold检查的工作主要交给工具或者负责数字后端的工程师解决。
2.4Timing Report in Vivado:
下面通过简单的实例说明一下vivado中的时序分析,当FPGA设计经过综合实现后,
通过Report Timing Summary打开时序报告,如图5、6所示。
图6
图中有红色部分表示设计中有时序不满足要求,此例中是Setup。
选择Setup中未满足要求的Path,打开Path Properties,如图7所示。
图7
Setup关键路径的时序报告如图8所示,报告由四部分组成:Summary, Source Clock Path, Data Path和Destination Clock Path,其中由Source Clock Path和Data Path得出Arrival Time,
由Destination Clock Path得出Required Time。
Hold检查的报告也类似,如图9所示。
图9
3Timing Constraints in Vivado -- 3. Define Clocks
Vivado进行时序分析,对时钟的约束是必不可少的,设计中的时钟可分为一下几种:
①Primary Clocks 主时钟;
②Generated Clocks 衍生时钟;
③Virtual Clocks 虚拟时钟。
3.1Primary Clocks
主时钟一般是FPGA外部芯片如晶振提供的时钟,通过FPGA引脚输入。
Vivado进行时序分析时,以主时钟的源端点作为延时计算起始点(0ns点)。
主时钟的约束命令如下:create_clock-name<clock_name> -period<period> -waveform{<rise_time> <fall_time>} [get_ports<input_port>]
下面通过几个实例说明一下约束命令:
a.
create_clock-name clk_main -period10 -waveform{0 5} [get_ports GCLK]
周期10ns,0ns上升沿,5ns下降沿。
b.
create_clock-name clk_main -period10 -waveform{0 2.5} [get_ports GCLK]
周期10ns,0ns上升沿,2.5ns下降沿;与a例周期相同,但是占空比不同,a例中50%,b例中25%。
c.
create_clock-name clk_main -period20 -waveform{0 10} [get_ports GCLK]
周期20ns,0ns上升沿,10ns下降沿;与a例占空比相同,都是50%,但是周期不同,a例中10ns,b例中20ns。
3.2Generated Clocks
衍生时钟是由设计内部产生,一般由时钟模块(MMCM or PLL)或者逻辑产生,并且对应有一个源时钟,源时钟可以是系统的主时钟或者另外一个衍生时钟。
约束衍生时钟时,除了定义周期,占空比,还需要指明与源时钟的关系。
通过create_generated_clock 命令约束衍生时钟,命令如下:
create_generated_clock -name<generated clock name> -source<master clock source pin or port> -divide_by<div_factor> <pin_or_port>
图1
如图1中,主时钟GCLK通过PLL产生两个衍生时钟CLKOUT1和CLKOUT2,其中GCLK —100MHz,CLKOUT1—100MHz,CLKOUT2—10MHz,对于MMCMx, PLLx, BUFR primitives 这几种时钟模块,Vivado会自动对主时钟和衍生时钟进行约束。
在Tcl Console中输入report_clocks可以得到时钟报告,以下是未对设计进行任何时钟约束的情况:
report_clocks
INFO: [Timing 38-35] Done setting XDC timing constraints.
INFO: [Timing 38-2] Deriving generated clocks
*************************************************************************** * Report: Clocks
* Design: top
* Part: Device=7z020, Package=clg484, Speed=-1
* Version : Vivado v2013.1 Build 248050 by xbuild on Wed Mar 27 17:27:24 MDT 2013
* Date: Tue Dec 17 12:17:09 2013
*************************************************************************** Attributes
P: Propagated
G: Generated
V: Virtual
I: Inverted
Clock Period Waveform Attributes Sources
clk_in110.00000{0.00000 5.00000}P{GCLK}
clkfbout_clk_gen 10.00000 {0.00000 5.00000}
P,G{clk_gen_u/inst/plle2_adv_inst/CLKFBOUT}
clk_out1_clk_gen 20.00000{0.00000 10.00000}
P,G{clk_gen_u/inst/plle2_adv_inst/CLKOUT0}
clk_out2_clk_gen100.00001{0.00000 50.00000}
P,G{clk_gen_u/inst/plle2_adv_inst/CLKOUT1}
====================================================
Generated Clocks
====================================================
Generated Clock: clkfbout_clk_gen
Master Source: clk_gen_u/inst/plle2_adv_inst/CLKIN1
Master Clock: clk_in1
Multiply By: 1
Generated Sources : {clk_gen_u/inst/plle2_adv_inst/CLKFBOUT}
Generated Clock: clk_out1_clk_gen
Master Source: clk_gen_u/inst/plle2_adv_inst/CLKIN1
Master Clock: clk_in1
Edges: {1 2 3}
Edge Shifts: {0.000 5.000 10.000}
Generated Sources : {clk_gen_u/inst/plle2_adv_inst/CLKOUT0}
Generated Clock: clk_out2_clk_gen
Master Source: clk_gen_u/inst/plle2_adv_inst/CLKIN1
Master Clock: clk_in1
Edges: {1 2 3}
Edge Shifts: {0.000 45.000 90.000}
Generated Sources : {clk_gen_u/inst/plle2_adv_inst/CLKOUT1}
如图2中,衍生时钟CLKOUT1通过逻辑产生一个2分频的衍生时钟CLK_DIV2,CLKOUT1的约束已自动生成,对CLK_DIV2约束指令如下:
create_generated_clock
-name CLK_DIV2 -source[get_pins clk_gen_u/clk_out1] -divide_by2 [get_pins clk_25m_reg/Q]生成的时钟报告如下:
====================================================
Generated Clocks
====================================================
Generated Clock: CLK_DIV2
Master Source: clk_gen_u/clk_out1
Master Clock: clk_out1_clk_gen
Divide By: 2
Generated Sources : {clk_25m_reg/Q}
Generated Clock: clkfbout_clk_gen
Master Source: clk_gen_u/inst/plle2_adv_inst/CLKIN1
Master Clock: clk_in1
Multiply By: 1
Generated Sources : {clk_gen_u/inst/plle2_adv_inst/CLKFBOUT}
Generated Clock: clk_out1_clk_gen
Master Source: clk_gen_u/inst/plle2_adv_inst/CLKIN1
Master Clock: clk_in1
Edges: {1 2 3}
Edge Shifts: {0.000 5.000 10.000}
Generated Sources : {clk_gen_u/inst/plle2_adv_inst/CLKOUT0}
Generated Clock: clk_out2_clk_gen
Master Source: clk_gen_u/inst/plle2_adv_inst/CLKIN1
Master Clock: clk_in1
Edges: {1 2 3}
Edge Shifts: {0.000 45.000 90.000}
Generated Sources : {clk_gen_u/inst/plle2_adv_inst/CLKOUT1}
3.3Virtual Clocks
虚拟时钟是在FPGA设计不存在的时钟,但是为什么要引入呢?先看一下图3中结构,FPGA与板上的其它芯片间有数据交互,属于FPGA内部时序单元到输出端口的路径。
芯片上的时钟并不是由FPGA提供,Vivado在进行这部分时序分析时并不知道芯片的时钟,因此需要定义一个虚拟时钟,然后约束输出端口的output delay。
图3
约束虚拟时钟的命令也是create_clock,但是其不需要指定-source,如下指令:create_clock -period100.000 -name SCLK -waveform{0.000 50.000}
时钟报告如下,定义的虚拟时钟SCLK属性为Virtual,无source。
report_clocks
INFO: [Timing 38-35] Done setting XDC timing constraints.
INFO: [Timing 38-2] Deriving generated clocks
*****************************************************************
* Report: Clocks
* Design: top
* Part: Device=7z020, Package=clg484, Speed=-1
* Version : Vivado v2013.1 Build 248050 by xbuild on Wed Mar 27 17:27:24 MDT 2013
* Date: Tue Dec 17 14:08:19 2013
***************************************************************************Attributes P: Propagated
G: Generated
V: Virtual
I: Inverted
Clock Period Waveform Attributes Sources
clk_in110.00000{0.00000 5.00000}P{GCLK}
CLK_DIV240.00000{0.00000 20.00000}P,G{clk_25m_reg/Q}
SCLK100.00000{0.00000 50.00000}V{}
clkfbout_clk_gen10.00000{0.00000 5.00000}P,G{clk_gen_u/inst/
plle2_adv_inst/CLKFBOUT}
clk_out1_clk_gen20.00000{0.00000 10.00000}P,G{clk_gen_u/inst/
plle2_adv_inst/CLKOUT0}
clk_out2_clk_gen100.00001{0.00000 50.00000}
P,G{clk_gen_u/inst/plle2_adv_inst/CLKOUT1}
4Timing Constraints in Vivado -- 4. Clock Groups
在第一节介绍过XDC与UCF的不同之处:Vivado会分析所有XDC约束时钟间的时序路径。
通过set_clock_groups约束不同的时钟组(clock group),Vivado在时序分析时,当source clock和destination clock属于同一个时钟组时,才会分析此时序路径;而source clock和destination clock属于不同时钟组时,则会略过此时序路径的分析。
下面讲解一下set_clock_groups约束:
4.1Asynchronous Clock Groups
为了判别划分时钟组,将不同的时钟划分成以下两类:
a.Synchronous Clocks
当两个时钟间的相位是固定的,则可以称这两个时钟为同步时钟(synchronous clock)。
一般同源,如由同一个MMCM or PLL产生的两个时钟可以称为同步时钟。
因此可以将主时钟和与之对应的衍生时钟约束成同一个时钟组。
b.Asynchronous Clocks
无法判定两个时钟间相位时,则可以称这两个时钟为异步时钟(asynchronous clocks)。
两个来自不同晶振的时钟,一定是异步时钟。
通常情况下设计中不同的主时钟肯定是异步时钟,因此可以将这两个主时钟及其衍生时钟约束成不同的时钟组。
对于异步时钟,由于其两个时钟间相位不固定,时序分析的结果定然不确切,因此这部分的分析可以通过设置时钟组约束忽略,但是这并不意味着这部分的设计能工作正常;对于异步时钟间的设计,必须做跨时钟域处理,避免亚稳态的产生。
异步时钟组约束命令如下:
set_clock_groups-asynchronous-group [get_clocks {clk_Aclk_B}]
-group [get_clocks {clk_C}]-group …
如图1中结构,串行AD1和串行AD2接口都带有随路时钟SCLK1和SCLK2,SCLK1和SCLK2属于异步时钟;ADC串并转换后的数据需要经过跨时钟域处理(CDC),转到GCLK主时钟域,GCLK与ADC的时钟也属于异步时钟,因此约束命令如下:
set_clock_groups-asynchronous -group[get_clocks{SCLK1}]
-group[get_clocks{SCLK2}] -group[get_clocks{GCLK}]
4.2Exclusive Clock Groups
在有些设计中,可能需要不同的工作模式,对应需要不同的时钟输入,通过时钟选择模块选择需要的时钟,如BUFGMUX,BUFGCTRL or A LUT。
但是这些输入的不同时钟间是互斥的,即一个模式只允许一个时钟输入,不同时钟间是没有时序关系,因此只需单独对每个时钟做时序分析即可,添加互斥时钟组可使Vivado进行时序分析时忽略互斥时钟组间的时序路径,约束命令如下:
set_clock_groups -logically_exclusive -group{clk_A} -group{clk_B}
或
set_clock_groups –physically_exclusive -group{clk_A} -group{clk_B}
如图2中结构,可将CLKMUX1,CLKMUX2约束成互斥时钟组,约束命令如下:
set_clock_groups - physically_exclusive -group[get_clocks {CLKMUX1}]
-group[get_clocks {CLKMUX2}]
图2
5Timing Constraints in Vivado -- 5. Constraining Input Delay
Timing Constraints in Vivado系列博文已有了一定的进展,经过上两节的介绍,约束设计中的时钟后,Vivado已能完成基本的时序分析。
在第二节“Timing Basics”中提到时序路径分为以下四种:
1)FPGA内部时序单元间的路径
2)输入端口到FPGA内部时序单元的路径
3)FPGA内部时序单元到输出端口的路径
4)输入端口到输出端口的路径
其中1. FPGA内部时序单元间的路径中,时序分析所需要的时间参数:T clk-D1, T clk-Q, T data_path_delay, T clk_D2, T setup, T hold已能确定,只要属于FPGA内部的时间参数,Vivado则会根据相应设计计算得到,因此4.输入端口到输出端口的路径的时间参数也能确定。
其它两条路径都相应缺少FPGA外部的几个时间参数,这些参数都需要通过时序约束告知Vivado,然后Vivado才能精确地进行这些路径的时序分析。
这一节先介绍2.输入端口到FPGA内部时序单元的路径这条路径的约束。
在输入端口到FPGA内部时序单元的路径中,Input Delay这段路径是在FPGA外部,因此需要约束设置其时间参数,通过set_input_delay约束命令约束,具体如下:set_input_delay –clock{clk}–max/-min input_delay_value [get_ports{DIN}]
另外根据source clock和destination clock,输入接口可分为以下两种情况:
5.1 System Synchronous Input
分析输入端口到FPGA内部时序单元的路径时,当source clock和destination clock来自同一个系统时钟时,称为系统同步输入(system synchronous input)。
如图1所示为系统同步输入,source clock是CLKA,destination clock是CLKB,其中CLKB 通过输入端口引入FPGA内部(约束成主时钟),而CLKA引到了FPGA外部的板上芯片,并没有引入到FPGA内部,CLKB是采集输入端口的时钟,因此首先约束CLKB为主时钟,约束如
下:
create_clock -name CLKB -period10 -waveform{0 5} [get_ports{CLKB}]
图1
其中T clkd_ext表示外部时钟源到外部芯片的延时;T clkd_int表示外部时钟源到FPGA输入端口的延时;T co表示外部芯片tCO时间;T bd表示外部芯片输出端口到FPGA芯片的板上延时。
对应max_input_delay和min_input_delay,以上几个时间参数都有max和min值,约束如下:
set_input_delay -clockCLKB-max[T clkd_ext_max+ T co_max+ T bd_max–T clkd_int_min] [get_portsDIN]
set_input_delay -clockCLKB-min[T clkd_ext_min+ T co_min+ T bd_min–T clkd_int_max] [get_portsDIN]
5.2 Source Synchronous Input
分析输入端口到FPGA内部时序单元的路径时,当destination clock来自外部芯片,即与数据输入同源,称为源同步输入(source synchronous input)。
结构如图2所示,从板上芯片输入到FPGA除了有数据,还有一个随路时钟,是由板上芯片产生的。
5.3Input Delay Value:
约束Input Delay分max值和min值,参考图2中时间参数,其中T cd表示外部芯片时钟输出到FPGA输入端口的延时;T co表示外部芯片tCO时间;T bd表示外部芯片输出端口到FPGA芯片的板上延时。
Input delay的计算式如下:
max_input_delay = T bd_max + T co_max - T cd_min
min_input_delay = T bd_min + T co_min - T cd_max
5.4Clock & Data:
源同步输入的约束相比于系统同步输入的复杂些,其根据时钟与数据的关系,可分为边缘对齐(Edge Aligned Clock&Data)和中心对齐(Center Aligned Clock&Data)两种:
1) Center Aligned
中心对齐是指时钟和数据到达后级时序单元时,时钟沿在数据中心,如图3所示。
在这种情况下可以直接使用时钟采集数据。
2) Edge Aligned
单倍速率数据采集只在时钟的上升沿或者下降沿采集数据,如图6所示。
2) DDR(Double Data Rate)
set_input_delay -clock[get_clocks CLKB] -max max_input_delay
[get_ports indata] -clock_fall -add_delay
set_input_delay -clock[get_clocks CLKB] -min min_input_delay
[get_ports indata] -clock_fall -add_delay
5.5Timing Check in Vivado
以上讲解了如何进行Input delay的约束,可能大家还不明白为什么需要约束input delay?那下面就讲解一下input delay 在时序分析中的作用:
在Vivado中时序分析分为setup check和hold check,其中引入了setup slack和hold slack 来界定时序是否收敛。
在《2. Timing Basics》中介绍过FPGA内部register_to_register路径setup slack和hold slack的计算方法,本文则介绍一下输入端口到FPGA内部时序单元的路径slack的计算方法,公式如下:
Setup check:
setup slack = data required time –data arrival time
其中:
data required time = destination clock edge time + destination clock path delay
- clock uncertainty
- setup time
data arrival time = source clock edge time + source clock path delay
+ max input delay
+ pin to register delay
为了确认公式的正确性,打开Vivado软件,新建了一个约束了input delay的工程,如下几图所示为中其中一条路径的setup check报告。
约束的时钟周期为40ns,max input delay为15ns
data arrival time= 15.322ns
data required time = 40.199ns
+ clock uncertainty
+ hold time
约束的min input delay = 8ns
data arrival time= 6.474ns
data required time= 1.045ns
时序报告中slack计算方式与公式完全一致,因此可以得到hold slack = data arrival time –data required time= 6.474ns –1.045ns = 5.429ns。
6Timing Constraints in Vivado -- 6. Input Delay Constraints Instance I 这一节介绍input delay约束实例,加深一下对上节中理论的理解。
如图1所示系统,以太网PHY芯片与FPGA相连,分为三组接口:
RX接口:时钟RXCK和数据RXD;
TX接口:时钟TXCK和数据TXD;
MII管理接口:时钟MDC和数据MDIO。
图1
其中RX接口属于源同步输入接口,以下就以RX接口为例讲解一下约束input delay:6.1Clock Constraints:
首先约束时钟,如图2所示为PHY(DP83849ID)在100Mb/s模式下的时序图,时钟和数据为Center Aligned关系,因此时钟在FPGA中无需再移相,可直接使用RXCK采集数据,时钟约束如下:
图2
6.1.1Input Delay Value
根据上节中源同步输入计算Input Delay的公式:
max_input_delay = T bd_max+ T co_max - T cd_min
min_input_delay = T bd_min+ T co_min - T cd_max
T bd为数据线RXD在板上的延时,也就是信号在电路板上的传播时间。
查找了网上的一些资料:
“信号速度还与不同材料的介电常数相关,具体计算公式是V=C/Er0.5,其中Er是信号线周围材料的相对介电常数。
我们常见的PCB材料Fr4的介电常数在左右,为了计算方便我们取4。
带入公式可以算出,Fr4材料制作的PCB板上面信号的传输速度是光速的二分之一。
光速大约等于12inch/ns,计算得出Fr4板上信号速度大约是6inch/ns。
换算成延时,也就是166ps/inch。
这就是我们经常说的PCB板上信号延时大约是166ps/inch。
”
在此例中,通过PCB设计软件计算得到RXD[3:0]的走线长度,分别是L RXD[3]=426mil,L RXD[2]=451mil,L RXD[1]=502mil,L RXD[0]=406mil,因此可以计算得到:
T bd_max= 502mil * 166ps/inch = 0.083332ns
T bd_min= 406mil * 166ps/inch = 0.067396ns
T cd为时钟线RXCK在板上的延时,走线长度L RXCK=399mil,因此可以计算得到:T cd_max=T cd_min=399mil * 166ps/inch = 0.066234ns
T co为RX接口clock_to_output时间,如图2中,等于时间参数,因此可得到:T co_max= 30ns
T co_min= 10ns
综上:
max_input_delay = T bd_max+ T co_max -T cd_min= 0.083332ns + 30ns -0.066234ns = 30.017098ns
min_input_delay = Tbd_min+ Tco_min -Tcd_max= 0.067396ns + 10ns -0.066234ns = 10.001162ns
6.1.2Constraints
很显然,RX接口为SDR,时钟约束和input delay值的计算后,可以对input delay进行约束,命令如下:
set_input_delay -clock[get_clocks RXCK] -max30.017098[get_ports{RXD[3] RXD[2] RXD[1] RXD[0]}]
set_input_delay -clock[get_clocks RXCK] -min10.001162[get_ports{RXD[3] RXD[2] RXD[1] RXD[0]}]
在Vivado的GUI界面中也可以进行约束,设计经过综合实现后,打开编辑约束文件,如图3所
7 Timing Constraints in Vivado -- 7. Input Delay Constraints Instance II
在《6. Input Delay Constraints Instance I 》中分享了一个实例,如图1所示,对RX 接口进行了约束。
另外MII 管理接口,其中MDIO 是双向数据接口,肯定需要input delay 的约束,由于笔者开始不确定此接口属于系统同步输入还是源同步输入,没有做进一步介绍,那就在此篇博文深入分析一下。
图1
最初以为MII接口属于源同步输入,但是仔细查看后发现不对劲儿,时钟MDC并不是由PHY提供的,而是FPGA输出给PHY的,这与源同步接口的定义矛盾,源同步需要时钟和数据来自同一个源。
因此只能划分到系统同步输入范畴了,仔细一想还是能说得通的,系统同步中只要求source clock和destination clock来自同一个时钟网络即可,不管是在FPGA外部还是内部,如图2所示,
图2
《5. Constraining Input Delay》系统同步输入的input delay value计算公式如下:max input delay = T clkd_ext_max+ T co_max+ T bd_max– T clkd_int_min
min input delay = T clkd_ext_min+ T co_min+ T bd_min– T clkd_int_max
此例的情况,时钟源到FPGA输入端口的延时T clkd_int等于0,时钟源到外部芯片的延时为TCD,因此得到变化后的公式如下:
max input delay = T CD_max+ T CO_max+ T BD_max
min input delay = T CD_min+ T CO_min+ T BD_min
各时间参数的计算如下:
T CD:时钟线MDC在板上的长度L MDC=489mil,T CD_max= T CD_min=489mil*166ps/inch= 0.081174ns
T BD:数据线MDIO在板上的长度LMDIO=634mil,T BD_max= T BD_min=634mil*166ps/inch= 0.105244ns
T CO:参考PHY(DP83849ID)的手册,如图3所示,T CO等于时间参数,得到T CO_max=30ns,T CO_min=0ns。
图3
得到input delay值如下:
Max_input_delay = T CD_max+ T CO_max+ T BD_max
=0.081174ns+30ns+0.105244ns=30.186418ns
min input delay = T CD_min+ T CO_min+ T BD_min
=0.081174ns+0ns+0.105244ns=0.186418ns
综上,MII管理接口的约束如下:
create_clock –name MDC–period400–waveform{0 200} [get_ports{MDC}]
set_input_delay -clock[get_clocks MDC] -max30.186418[get_ports{MDIO}]
set_input_delay -clock[get_clocks MDC] -min0.186418[get_ports{MDIO}]
在Vivado中的约束如图4,5所示:
图4
8 Timing Constraints in Vivado -- 8. Constraining Ouput Delay
FPGA 内部时序单元到输出端口的路径也需要约束其output delay ,如图1所示框图。
图1
约束output delay 的命令是set_output_delay ,具体的参数如下:
set_output_delay –clock reference_clock –min/-max delay_value
[get_ports {DOUT}] [-clock_fall] [-add_delay]
其中-clock表示输出端口的关联时钟;
-min/-max表示设置output delay的最小和最大值;
-clock_fall表示output delay是针对关联时钟的下降沿;
-add_delay表示对同一个输出端口约束不同的output delay值,一般是在如DDR需要约束两个时钟沿的output delay,或者输出端口后级连接了多个器件对应不同的时钟约束的情况下,需要加入此参数。
与输入接口约束类似,输出接口的约束也可分为以下两种情况:
8.1System Synchronous Output
分析FPGA内部时序单元到输出端口的路径时,当source clock和destination clock来自同一个系统时钟时,称为系统同步输出(system synchronous output)。
此处需要引入虚拟时钟(virtual clock)的概念,在讲时钟约束的一节时有提到,当source clock or destination clock不在FPGA设计中时,则需要约束一个虚拟时钟。
如图2所示为系统同步输出路径框图,source clock是CLKA,destination clock是CLKB,其中CLKA通过输入端口引入FPGA内部(约束成主时钟),而CLKB引到了FPGA外部的板上芯片,并没有引入到FPGA内部,因此需将CLKB约束成虚拟时钟,约束如下:
create_clock -name CLKA-period10 -waveform{0 5} [get_ports{CLKA}]
create_clock -name CLKB-period10 -waveform{0 5}
图2
其中T cd_ext表示外部时钟源到外部芯片的延时;T cd_int表示外部时钟源到FPGA时钟端口的延时;T setup表示外部芯片tsu时间;T hold表示外部芯片thd时间;T bd表示FPGA输出端口到外部芯片的板上延时。
Output delay value的计算式如下:
max_output_delay = T bd_max+ T setup+ T cd_int_max - T cd_ext_min
min_output_delay = T bd_min–T hold+ T cd_int_min - T cd_ext_max
相比于input delay value,上式相对于难理解些,那就推导一下,深入理解:
将此路径假想为FPGA内部register_to_register路径作分析,如图3所示,
图3
在《2. Timing Basics》节中,介绍了时序分析分为Setup Check和Hold Check:
(1)Setup Check
setup slack = (destination clock edge time - source edge time)
+ (destination clock path delay - source clock path delay)
- clock uncertainty
- setup time
- clock to output time
- data path delay
将图3中路径的时间参数代入可得:
setup slack = T clk_period+ (T cd_ext–T cd_int–T cd_int_fpga) –T clk_uncertainty–T setup–T clk-Q–T int_data_delay - T bd
其中T cd_ext,T cd_int,T setup和T bd都是FPGA外部的时间参数,需要通过约束告知vivado,上式整理一下可得:
setup slack = T clk_period–T cd_int_fpga–T clk_uncertainty–T clk-Q–T int_data_delay
+(T cd_ext–T cd_int) –T setup - T bd= T clk_period–T cd_int_fpga–T clk_uncertainty
–T clk-Q–T int_data_delay–T max_output_delay
T max_output_delay= T setup+ T bd_max+ T cd_int_max - T cd_ext_min,与前文中max_output_delay的计
算式相同。
(2)Hold Check
hold slack = (source clock edge time - destination edge time)
+(source clock path delay - destination clock path delay)
- clock uncertainty
- hold time
+ clock to output time
+ data path delay
= (T cd_int+ T cd_int_fpga - T cd_ext)
- T clk_uncertainty
–T hold
+ T clk-Q
+ T int_data_delay+ T bd
其中T cd_ext,T cd_int,T hold和T bd都是FPGA外部的时间参数,需要通过约束告知vivado,上式整理一下可得:
hold slack = T cd_int_fpga - T clk_uncertainty + T clk-Q + T int_data_delay + T bd–T hold + T cd_int - T cd_ext = T cd_int_fpga - T clk_uncertainty + T clk-Q + T int_data_delay + T min_output_delay T min_output_delay = T bd_min–T hold + T cd_int_min - T cd_ext_max,与前文中min_output_delay的计算式相同。
可以发现在setup check中使用max output delay,hold check使用min output delay,都是使slack的值较小的趋势,这样使FPGA内部的时序条件更严苛,如果在这种条件下时序收敛,就绝对能保证设计的稳定性。
经过上面的推导,回归系统同步输出主题,约束命令如下:
set_output_delay -clockCLKB -max max_output_delay [get_ports{DOUT}]
set_output_delay -clockCLKB -min min_output_delay [get_ports{DOUT}
8.2 Source Synchronous Output
分析FPGA内部时序单元到输出端口的路径时,输出到外部芯片的时钟与数据是同源的,称为源同步输出(source synchronous output)。
结构如图4所示,从FPGA输出到外部芯片除了有数据,还有一个随路时钟,由FPGA
内部时钟模块产生的。
图4
参考图4中时间参数,其中T cd表示时钟从FPGA输出到外部芯片输入端口的延时;T setup 表示外部芯片tSU时间;T hold表示外部芯片tH时间;T bd表示FPGA输出端口到外部芯片的板上延时。
Output delay的计算式如下(推导与系统同步输出类似,不再累述):max_output_delay = T bd_max+ T setup - T cd_min
min_output_delay = T bd_min–T hold - T cd_max
源同步输出的output delay约束命令如下:
set_output_delay -clockCLKB -max max_output_delay [get_ports{DOUT}]
set_output_delay -clockCLKB -min min_output_delay [get_ports{DOUT}]
9iming Constraints in Vivado -- 9. Output Delay Constraints Instance 本节讲解一下output delay的实例。
依旧是Ethernet PHY和FPGA的接口,框图如图1所示,
(1)TX接口:
TX接口由时钟TXCK和数据TXD[3:0]组成,都是从FPGA输出,即时钟和数据同源,因此TX接口为源同步输出接口。
根据上节中output delay value的计算公式:
max_input_delay = T bd_max+ T setup - T cd_min
min_input_delay = T bd_min–T hold - T cd_max
其中有4个时间参数:T bd,T cd,T setup和T hold,如图2所示。
图2
T cd和T bd分别是时钟TXCK和数据TXD[3:0]在板上的延时。
首先通过PCB设计软件计算得到它们布线长度:L TXCK=784mil,L TXD[3]=663mil,L TXD[2]=680mil,L TXD[1]=852mil,L TXD[0]=901mil,因此计算得到:
T cd_max= T cd_min=784mil*166ps/inch= 0.130144n
T bd_max=901mil*166ps/inch= 0.149566ns
T bd_min=663mil*166ps/inch=0.110058ns
T setup和T hold是PHY(DP83849ID)芯片的时间参数,如图3所示,查询datasheet得到:参考时间参数,T setup=10ns
参考时间参数,T hold=0ns
图3
综上可得到output delay value:
max_output_delay = T bd_max+ T setup - T cd_min=0.149566ns
+ 10ns - 0.130144ns=10.019422ns
min_output_delay = T bd_min–T hold - T cd_max=0.110058ns
–0ns - 0.130144ns=-0.020086ns
可能有些人会诧异,为什么min_output_delay的值会是负的?负的表示相对于输出是反方向的延时。
下面对TX接口的output delay进行约束:
create_clock -nameTXCK -period40 -waveform{0 20} [get_ports{TXCK}]
create_clock -nameTXCK_PHY -period40 -waveform{0 20}
set_output_delay –clock TXCK_PHY -max10.019422 [get_ports{TXD[3] TXD[2] TXD[1] TXD[0]}]
set_output_delay –clock TXCK_PHY -min -0.020086ns [get_ports{TXD[3] TXD[2] TXD[1] TXD[0]}]
Vivado中约束如下图所示:
约束主时钟
约束虚拟时钟
(2) MII 管理接口:
MII 管理接口由时钟MDC 和数据MDIO 组成,其中MDIO 为双向接口,因此需要对其进行input delay 和output delay 约束。
在其output 方向,MDC 和MDIO 都是从FPGA 输出的,因此也是源同步输出接口。
时间参数的计算与TX 接口类似,如图4所示
图4
其中MDC 和MDIO 在板上的布线长度分别为L MDC =924mil ,L MDIO =587mil ,可得:
T cd_max= T cd_min=924mil*166ps/inch= 0.153384ns
T bd_max=T bd_min=587mil*166ps/inch=0.097442ns
T setup和T hold的值参考datasheet,如图5所示,可得:
参考时间参数,T setup=10ns
参考时间参数,T hold=10ns
图5
综上可得到output delay value:
max_output_delay = T bd_max+ T setup - T cd_min=0.153384ns + 10ns
- 0.097442ns=10.055942ns
min_output_delay = T bd_min–T hold -T cd_max=0.153384ns -10ns -0.097442ns=-9.944058ns
下面对MII管理接口的output delay进行约束:
create_clock -nameMDC -period400 -waveform{0 200} [get_ports{MDC}]
create_clock -nameMDC_PHY -period400 -waveform{0 200}
set_output_delay –clock MDC_PHY -max10.055942 [get_ports{MDIO}]
set_output_delay –clock MDC_PHY -min -9.944058 [get_ports{MDIO}]
Vivado中约束如下图所示:
约束主时钟。