1 简介
知道了建立时间在数字电路中的计算方式以及时序分析的基本概念之后,就需要在软件中来查看并优化我们的时序了,首先最重要的就是学会看时序分析报告。
2 准备
查看一个设计的时序报告前,软件必须先进行综合与布局布线。在代码设计、管脚约束后,就可以进行综合与布局布线并查看时序报告了。时序约束在综合以及布局布线两个阶段均可添加。
生成bit流后点击1处即可进行时钟的约束,2处就是主时钟约束,3处是时钟抖动的约束,可以看出2和3处已经有各有一个约束在里面了,这是因为时钟该时钟经过了PLL,在PLL界面已经设置过时钟频率和时钟的抖动了,软件就会自动的把他加入到时钟约束里面而不需要用户再次约束。这里我们手动添加一个时钟来做个示范。
点击1处的加号即可弹出左边的设置框,然后在2处设置时钟的名称,这个可以自定义,但是一般与要设置的时钟同名,然后点击3处的冒号来添加时钟,点击4处的来选择需要的约束的时钟类型,这里我们选择IO PORT的管脚,可以在Options里面详细的筛选信号类型,然后点击5处的find并在6处选择需要的时钟信号添加进7处,最后点击8处的set,再设置9处的时钟频率,下面两个是上升和下降的时间,一般对半分不做设置,最后点击10处的OK。
设置完成之后可以看到1处的时钟数变成了2,2处多了一个我们刚刚设置的时钟,3处多了一个未保存的时钟(这里截图的是已保存后的界面)。这里我们点击Ctrl+S,即可保存我们设置的时钟约束到XDC文件。这里需要说明的是XDC文件叫约束文件,里面包含了管脚约束、时钟约束等多种约束文件。保存完毕后可以打开XDC文件可以看到最后一行多了一行约束语句:
create_clock -period 10.000 -name rx_clk -waveform {0.000 5.000} [get_ports rx_clk]
这就是我们刚刚添加的时钟约束。添加完约束之后所有的布局布线都将失效并需要重新生成。生成之后开始查看时序分析报告。
3 建立时间时序分析报告
这里我们把上面的那个手动添加的时序约束删除掉,因为在工程里面我们已经将时钟送入PLL并输出给其他模块了。这里我们先将时钟改为50MHz方便分析。
点击1处然后2,即可在右边框内看到总体的时序报告。可以看出3、4、5分别代表了建立时间、保持时间以及时钟相位宽度三个结果,下面分别是时间裕量、总的违例时间、总的违例条数以及总的路径条数。可以看到工程没有违例情况。点击2下面的
Timing Summary timing 1右键关闭。然后点击出现的Report Timing并弹出窗口先直接点击OK,就会直接出现一些路径的时序报告。
上面这一排数据分别代表了路径编号、裕量、逻辑延时等级(组合逻辑的长度)、布线、扇出数、源寄存器、目的寄存器、总延时、逻辑延时。
在看时序报告前我们先把建立时间有关的公式在这里贴出来。
(1)数据实际到达时间
D
a
t
a
a
r
r
i
v
a
l
t
i
m
e
=
T
c
l
k
1
+
T
c
o
+
T
d
a
t
a
(1)
Data \;arrival\;time=T_{clk1}+T_{co}+T_{data}\tag{1}
Dataarrivaltime=Tclk1+Tco+Tdata(1)
(2)时钟到达时间(Clock arrival time):
C
l
o
c
k
a
r
r
i
v
a
l
t
i
m
e
=
T
c
l
k
2
+
T
c
y
c
l
e
(2)
Clock \;arrival\;time=T_{clk2}+T_{cycle}\tag{2}
Clockarrivaltime=Tclk2+Tcycle(2)
(3)数据要求到达时间
D
a
t
a
R
e
q
u
i
r
e
t
i
m
e
=
T
c
l
k
2
+
T
c
y
c
l
e
−
T
s
u
(3)
Data \;Require\;time=T_{clk2}+T_{cycle}-T_{su}\tag{3}
DataRequiretime=Tclk2+Tcycle−Tsu(3)
(4)建立时间裕量
S
e
t
u
p
S
l
a
c
k
=
D
a
t
a
R
e
q
u
i
r
e
t
i
m
e
−
D
a
t
a
a
r
r
i
v
a
l
t
i
m
e
=
T
c
l
k
2
+
T
c
y
c
l
e
−
T
s
u
−
(
T
c
l
k
1
+
T
c
o
+
T
d
a
t
a
)
(5)
Setup \;Slack= Data \;Require\;time-Data \;arrival\;time\\ \,\\\qquad\qquad\qquad=T_{clk2}+T_{cycle}-T_{su}-(T_{clk1}+T_{co}+T_{data})\tag{5}
SetupSlack=DataRequiretime−Dataarrivaltime=Tclk2+Tcycle−Tsu−(Tclk1+Tco+Tdata)(5)
然后再来看看布局布线后vivado软件的建立时间的时序分析报告的界面:
可以看出分析报告分成了四个部分,分别是总结、源时钟路径、数据路径和目的时钟路径
3.1 Summary
Summary的界面如下:
这个界面能看到的信息就是路径名称、裕量、源端口以及目的端口、分析的路径类型、数据延时(逻辑延迟以及路径延迟)、延迟等级、时钟偏斜、时钟的不确定度。
3.2 Source Clock Path
所有的路径分析都包括延迟类型(Delay Type)、延时(Incr)、总路径延时(Path)、位置(Locatioin)、网络(Netlist Resource)。这里我们只分析一条路径,下面和此类似的时序报告就不做详细分析了。
(1)时钟先从J19口进入,到达锁相环并送入ibufg/I。这些全部没有延迟。
(2)ibufg/I进入,ibufg/O出去,此延时为1.416ns,此时路径的总延时为1.416ns。
(3)然后送入锁相环,此延时为1.065ns,此时总延时为2.481ns。
(4)进入锁相环倍频成CLKOUT0,此延时为-5.941ns(不懂,可能是相位问题,先写着)?此时路径总延时为-3.460ns。
(5)在锁相环里面分频成clk_out1并送入buf/I,此延时为1.441ns。此时总延时为-2.020ns。
(6)由buf/O出来,此延时为0.081ns。此时总延时为-1.939ns。
(6)最后映射到源端寄存器,此延时为1.422ns。此时总延时为-0.516ns。
此窗口的路径分析包含了时钟从发射到源端寄存器的时间。
3.3 Data Path
此窗口的路径分析包含了数据的逻辑延时以及寄存器的输出延时,也就是
T
c
o
+
T
d
a
t
a
T_{co}+T_{data}
Tco+Tdata。最后的
A
r
r
i
v
a
l
T
i
m
e
Arrival\,Time
ArrivalTime代表的是数据实际到达的时间。
3.4 Destination Clock Path
此窗口的路径分析包含了时钟到达时间(1处)、建立时间(4处)以及时钟悲观度(2处)和时钟不确定性(3处)还有数据要求到达的时间(5处)。
这里就延申出了一个问题,为什么时钟走相同的路径,在源时钟路径延时里面以及目的时钟延时路径里面的延时却不一样呢?
由上面的公式5可以看出,
T
c
l
k
1
T_{clk1}
Tclk1越大
T
c
l
k
2
T_{clk2}
Tclk2越小,则建立时间裕量越小。为了确保建立时间裕量大于零,则在计算的时候要尽可能的使
T
c
l
k
1
T_{clk1}
Tclk1越大
T
c
l
k
2
T_{clk2}
Tclk2越小。也就是最悲观的状态。
所以源时钟路径在时序分析的时候取延时的最大值,目的时钟路径取延时的最小值。
首先,源时钟经过共同路径与不同路径到达源端寄存器的时间为-0.516ns。目的时钟经过相同路径与不同路径到达目的端口寄存器的时间为19.030ns。由于两个时间有着一个时钟的时间差。可以算出
T
c
l
k
2
−
T
c
l
k
1
=
−
0.454
n
s
T_{clk2}-T_{clk1}=-0.454ns
Tclk2−Tclk1=−0.454ns,这个时间恰好是时钟偏斜加上时钟悲观度。