多图























A,B相邻的两村,有一年夏天大旱,两村的村支书带领抗旱
AB村相传下来,大旱之后必有大涝
A村村支书在冬天带领大家修水利,B村村支书认为a脑子坏了
结果:第二年夏天,发洪水
A村,提前修水利,啥事都没有,平安度过
B村,决堤,村支书冲在一线带领大家抗洪,事迹突出,被提拔为乡长






xx_clk_160m :左数第一个LMK00301的输入时钟
LMK00301_clk_160m :左数第一个LMK00301的输出时钟,单片的时钟skew为50ps,按0.1计算
pcb_clk_160m :上下两端路径的pcb之和。时钟线路等长,数据路径为正负0.5。即从第二片LMK00301到Max的pcb走线,比从fpga到Max的pcb走线,可能短0.5ns,也可能长0.5ns
LMK00301_clk_160m1 :左数第二个LMK00301的输出时钟,由多片组成,路径延时,最大0.2ns,最小0.6ns
divider1:评估最恶劣情况下的保持时间,即到达Max的时钟,比到达fpga的时钟晚
此时,假设pcb走线长0.5ns,第二个lmk00301延时最大为0.6ns,第一个lmk00301输出差0.1ns,则clk_max比clk_tr晚1.2ns
divider2:评估最恶劣情况下的建立时间,即到达Max的时钟,比到达fpga的时钟早
此时,假设pcb走线长-0.5ns,第二个lmk00301延时最大为0.2ns,第一个lmk00301输出差-0.1ns,则clk_max比clk_tr早0.4ns
结论:fpga输出的数据,必须在时钟上升沿之前2.4ns准备好,在时钟上升沿之后再保持2.7ns


同一个建立保持小系统,尽可能时钟是同一个:
比如p24的例子。fpga和外部芯片的时钟路径,中间就有一个buffer
同一个芯片的不同窗口,是否重合:
比如fpga外部有多个芯片,每个芯片的窗口都不重合
fpga内部走线绕线造成的延时是有限的,不是任意窗口都行的





Data路径的延时,会导致整体数据窗口右移,因此表达式需要加上该延时
Data路径的最大延时,对建立时间的要求最苛刻
Data路径的最小延时,对保持时间的要求最苛刻

1.Data太多,加buf费钱
2.Fpga管脚够,完全可以自己出,不需要复制
3.Data要求低,不需要中继
时钟信号要求高,所以需要中继
时钟出的路数,往往不够用,所以需要buf复制
谁说data没有buf,发射信号就有buf
但是有buf之后,外部ic就变成了buf,fpga跟外部ic之间,还是没有buf

clk路径的延时,等同于整体数据窗口右移,因此表达式需要减掉该延时
clk路径的最小延时,对建立时间的要求最苛刻
clk路径的最大延时,对保持时间的要求最苛刻

Clk buf在fpga路径上怎么办:取反,放到wbic路径上
Clk到外部ic的延迟也是一个范围怎么办:范围放到clk_buf的值里面
Pcb只能给等长信息,不能给出具体值怎么办:抵消掉,反正后面的公式也是要抵消的




对单根线而言,建立时间窗口在0.8左右,对总线而言,建立时间窗口大概是1.5
所以,为什么并行总线被高速串行总线取代了







请计算一下,逻辑时序约束应该如何做
set clk_path_max 2
set clk_path_min 1
set data_path_max 2
set data_path_min 2
set wbic_setup 1
set wbic_hold 1
set output_delay_max [expr $data_path_max - $clk_path_min + $wbic_setup]
set output_delay_min [expr $data_path_min - $clk_path_max - $wbic_hold]

clk_fpga_100M:系统时钟100M
data_fpga_xdc:逻辑时序约束值(数据有效窗口[-2,1])
data_fpga_report:逻辑工程报告结果(数据有效窗口[-4,2]),即:逻辑实际跑出来的结果,建立时间有2ns裕量,保持时间有1ns裕量
data_fpga_test:实际在板卡上测试到的fpga输出数据的跳变时刻。在固定的条件下,是一个定值
data_wbic_test:数据到达外部ic芯片,在板卡上的测试值
clk_wbic_test:外部ic芯片的输入时钟,在板卡上的测试值
从图中可以看到,ic芯片的要求窗口,本来只有2ns,由于时钟buff的延时不确定性,给到逻辑的约束窗口变成了3ns
而逻辑实际做到的窗口为6ns
而板卡实测到的窗口,为10ns
整体上看,有窗口扩大化的趋势
所以,之前测量10ns窗口,来跟2ns窗口做比较,做为接收准则,是不够的

逻辑给出特定逻辑版本的相关管脚的tco值,
板卡工程师给出后续的值,并计算出数据和时钟的理论窗口
硬件测试工程师实测,并填入实测值一栏
如何判断测试结果正确?
1.时钟路径,是不是只测试最终结果即可(建议每条pcb路径都测一下,因为buf延时不确定性会掩盖掉一部分错误。比如插座的延时)
2.最好是画个图,凭经验再次判断一下

















数据到达时间的示意和计算方法
Tclk1:时钟从管脚到达第一个寄存器的演示
Tco:第一个寄存器的输出延时tco
Tdata:数据从第一个寄存器,到达第二个寄存器的延时




































Used falling clock edge:相对于时钟的下降沿约束(即数据是时钟的下降沿发出的)
Input delay options
Minimum:输入最小延时,即input_delay min
Maxmum
Rise:相对于数据的上升沿约束(有些信号,上升沿和下降沿的延时不一致,或者说,信号上升和下降的速度是不一样的)
Fall
Delay value
Add delay:如果该信号上已经有其他约束了,该约束是进行附加,而不是替代
Targets:目标信号


输出源同步,相对的时钟,是fpga管脚
之前所有的约束,都是相对于输入的100M来约束的,即使内部使用200m采样(注意时序约束的实质,是告知,肯定是相对于管脚进行告知)
可以看到,源同步系统,开的窗口要大一些,为什么?
你抖我抖一起抖


注意2个窗口,分别是 数据到达窗口、数据要求窗口,跟之前的讲解是一样的
3ns:input delay
0.782:信号进管脚的延时
2.852:管脚到达寄存器的走线延时
0.139:穿越le内部的查找表的延时(虽然没用这个查找表,但走线还是走了,虽然可以不走的。所以,布线软件的智商和内部算法啊)
0.115:到达寄存器
2.347:时钟从管脚到pll
-7.926:pll补偿
2.378:从pll到达全局时钟
1.622:从全局时钟到达寄存器(可见,信号上全局,消耗的时间也是很长的,所以下次面试问到为什么信号要上全局,不要再回答:上全局延时小了)
0.618:到达寄存器

注意上图中的2个时刻
clk的latch time时刻为10ns,时钟到达寄存器的时刻为9.855,基本一致,与altera的说明比较一致

pll的4种模式,每种模式都是怎样的,分别用于什么场合。进阶问题,这几种模式,都是怎么通过反馈实现的
普通模式:AB两点同相。时钟输入无延时,数据有延时,会吃掉建立时间,但是建立时间一般比较多(tco一般不大),符合一般情况
源同步 :AB两点的延时,等于FG两点的延时,一般用于源同步系统,有随路时钟,可以把管脚上的时钟和数据的关系,复制到reg处
零延时 :AC同相,可以输出一个无延时的外部时钟
外部反馈:pcb保证CD延时与CE延时一致。pll通过调相实现AD同相,从而达到AE同相,使fpga和外部芯片输入时钟同相
无补偿 :pll本身无延时,AB两点延时等于时钟输入延时+时钟网络延时,此时路径上没有延时单元,所以抖动性能最好







输入约束
非图形化界面,要差一些。
但是走线延时,看得很清楚
注意看,输入时钟是5ns,到达寄存器时间,是3.459ns,提前了1.5ns

源同步输出约束
可以看到输出源同步时钟,专门加了一个窗口



可以看到,altera和xilinx的输入延时不确定窗口,都是2ns,但是位置不一样。
xilinx的时钟,经过pll之后,前移了,导致输入有效窗口,也要跟着前移
后面的约束,迭代了多次,不太容易稳定
稳定下来后,其他都一致,但是源同步输出,窗口要小于altera的
我印象中,xilinx的k7,io特性应该很不错的,但是不知道为什么这样





多周期不再详述,记忆语法是很困难,且容易出错的
相信经过之前的培训,应该已经懂如何根据时序报告,来检查自己的约束是否正确。
所以,多周期约束,可以自己试验一下,看看结果,再迭代一下







