数字集成电路(11)时序报告

本人《数字集成电路设计》课程笔记,老师为王仁平。

本文主要讲述如何查看时序报告。如何书写时序约束,可以参见《DC-lab4和lab6的略解》一文。


第七章 时序组合电路设计

3. 时序报告——求裕量slack

1. 建立时间

建立时间定义:对于捕获沿到来之前,数据需要保持稳定的最小时间

image-20211125175830676

关于建立时间裕量$slack_{setup}$​的定义,需要以下几个参数:

  1. 数据要求到达的时间——Date Required Time,令为$t_{date\ required}$

    其中,

    $T$:周期,如图整段的阴影部分

    $t_{su}$:建立时间

  2. 数据实际到达的时间——Date Arrival Time,令为$t_{date\ arrival}$

    其中,

    $t_{c-q}$:寄存器的(最坏)传播延时

    $t_{logic}$:两个寄存器之间组合逻辑的(最坏)传播延时

则有

为了充分考虑各种情况下,组合逻辑的建立时间裕量$slack_{setup}$​,以下将分情况讨论。

在此之前,先明确几个概念:

  • 理想时钟(ideal clock):以下的情况均不存在。
  • 时钟偏差(clock skew):指同一个时钟域之间,时钟信号到达各个寄存器的最大时间差
  • 时钟抖动(clock jitter):芯片某一给定点上,时钟周期宽度发生变化,或缩短或变宽。一般我们会考虑最坏情况,具体见下文。
  • (网络)时钟延迟(latency 或 network latency):外部时钟输入该模块后,时钟信号达到寄存器时钟输入端的延时。
  • 源时钟延迟(source latency):从整个系统时钟源产生的时钟,到该模块时钟输入端的延时。

1. 理想时钟——ideal clock

指令:

1
2
create_clock -period 10 [get_ports CLK] 
# 产生一个周期为10的时钟

电路图:

image-20211125184608609

报告:

image-20211125184935488

波形图:

image-20211125185441369

根据公式$slack_{setup}=t_{date\ required}-t_{date\ arrival}$​:

2. 时钟偏差——clock skew

指令:

1
2
3
4
create_clock -period 10 [get_ports CLK] 
# 产生一个周期为10的时钟
set_clock_uncertainty 0.5 [get_ports CLK]
# 设置0.5的时钟偏差

电路图:

image-20211125185521836

报告:

image-20211125192836430

波形图:

image-20211125190351622

可知,引入时钟偏差之后,(注意:因为负偏差对于建立时间不利,因此取$-t_{skew}$)

即,$t_{date\ required}=10-0.5-0.21=9.29$​

因此,

小贴士

​ 和理想时钟相比,最坏情况下,捕获沿向前移动了$t_{skew}$,使得$t_{date\ required}$减小,从而减小了建立时间裕量。​

3. 时钟网络延时——latency或network latency

代码:

1
2
3
4
5
6
create_clock -period 10 [get_ports CLK] 
# 产生一个周期为10的时钟
set_clock_uncertainty 0.5 [get_ports CLK]
# 设置0.5的时钟偏差
set_clock_latency 1 [get_ports CLK]
# 设置1的时钟网络延时

电路图:

image-20211125191128178

报告:

image-20211125191903536

波形图:

image-20211125192313593

引入时钟网络延时后,模块内的各个寄存器整体偏移了一个$t_{network\ latency}=1$​

相比理想:

其中,$T-t_{skew}-t_{su}=10-0.5-0.21=9.29$​,$t_{c-q}+t_{logic}=0.72$​

因此,

小贴士:

​ 和理想时钟相比,时钟网络延时是输入模块之后,时钟到寄存器时钟输入端的延时。

​ 对于模块内的各个寄存器,相当于整体偏差了一个$t_{network\ latency}$​

​ 如时序报告所示,整体偏差了$t_{network\ latency}=1$

4. 源时钟延时——source latency

代码:

1
2
3
4
5
6
7
8
create_clock -period 10 [get_ports CLK] 
# 产生一个周期为10的时钟
set_clock_uncertainty 0.5 [get_ports CLK]
# 设置0.5的时钟偏差
set_clock_latency 1 [get_ports CLK]
# 设置1的时钟网络延时
set_clock_latency -source 3 [get_ports CLK]
# 设置3的源时钟延时

电路图:

image-20211125194853863

报告:

image-20211125195012065

波形图:

image-20211125194930684

引入源时钟延时后,输入模块的时钟同时钟源整体偏移一个$t_{source\ latency}=3$​​​,也相当于模块内的各个寄存器整体偏移了一个$t_{source\ latency}=3$​

相比理想:​​

其中,$T-t_{skew}+t_{network\ latency}-t_{su}=10-0.5+1-0.21=10.29$​,$t_{c-q}+t_{logic}+t_{network\ latency}=0.72+1=1.72$​

因此,

小贴士:

​ 和理想时钟相比,引入源时钟延时后,输入模块的时钟同时钟源整体偏移一个$t_{source\ latency}=3$

​ 也相当于模块内的各个寄存器整体偏移了一个$t_{source\ latency}=3$

​ 对于模块内的各个寄存器,相当于整体偏差了一个$t_{source\ latency}$​​

​ 如时序报告所示,整体偏差了$t_{source\ latency}=3$​

5. 时钟抖动——clock jitter

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
create_clock -period 10 [get_ports CLK] 
# 产生一个周期为10的时钟
set_clock_uncertainty 0.5 [get_ports CLK]
# 设置0.5的时钟偏差
set_clock_latency 1 [get_ports CLK]
# 设置1的时钟网络延时

# set_clock_latency -source 3 [get_ports CLK]
# 设置3的源时钟延时

set_clock_latency 2.5 -source -early [get_ports CLK]
# 设置源时钟,最小绝对时钟抖动2.5
set_clock_latency 3.5 -source -late [get_ports CLK]
# 设置源时钟,最大绝对时钟抖动3.5

# 如下电路图,设置时间抖动为±0.5
# 上面代码取最坏情况,即前级向后抖动0.5,后级向前抖动0.5
# 故前级延时为3+0.5=3.5,后级为3-0.5=2.5

电路图:

image-20211125202435173

报告:

image-20211125202511055

波形图:

image-20211125202603447

取最差情况——前一级时钟向后抖动,本级时钟向前抖动 ,如下图

image-20211125203620946

最坏情况下,前一级时钟向后抖动0.5,本级时钟向前抖动0.5

因此,

其中,$T-t_{skew}+t_{network\ latency}-t_{su}=10-0.5+1-0.21=10.29$,$t_{c-q}+t_{logic}+t_{network\ latency}=0.72+1=1.72$

因此,

2. 保持时间

保持时间定义:对于捕获沿到来之后,数据需要保持稳定的最小时间

注意:保持时间看的是同一个时刻

image-20211125211751676

同样的,对于保持时间裕度$slack_{hold}$​,有

1.理想时钟——ideal clock

代码:

1
2
create_clock -period 10 [get_ports CLK] 
# 产生一个周期为10的时钟

电路图:

image-20211125211556540

报告:

image-20211125214133403

波形图:

image-20211125212006757

注意:保持时间看的是同一个时刻,即同一时刻的$u_1$​​寄存器时钟和$u_4$​寄存器时钟。

因此,

此处报告中,$slack_{hold}=0.53$应该是小数点近似的结果。​

2. 源时钟延时、时钟网络延时——latency

代码:

1
2
3
4
5
6
7
8
create_clock -period 10 [get_ports CLK] 
# 产生一个周期为10的时钟
set_clock_uncertainty 0.5 [get_ports CLK]
# 设置0.5的时钟偏差
set_clock_latency 1 [get_ports CLK]
# 设置1的时钟网络延时
set_clock_latency -source 3 [get_ports CLK]
# 设置3的源时钟延时

电路图:

image-20211125212049653

波形图:

image-20211125215658364

因为正偏差对于保持时间不利,故此使用的是$+t_{skew}$

因此,