Verdvana

空持千百偈 不如吃茶去

时序约束之时钟

22 Sep 2019 » FPGA, Digital IC Design

1 前言

同步设计是指在控制信号触发下电路从一个状态过渡到另一个状态。这样的触发过程可以发生在控制信号的上升沿或下降沿或者两种边沿都可以触发。在合适的触发沿,可能是高电平有效也可能是低电平有效,输入信号、输出信号、内部寄存器和节点状态会达到一个稳定状态。同步设计中作为触发器的控制信号称为时钟,设计触发所在的沿称为时钟的有效沿。产生该时钟信号的电路称作时钟发生器。

        时钟信号在行为上都有一个特定的周期,它控制设计中的时序,通过其特征和使用方式来识别。这些特征是:

  • 周期;
  • 有效沿;
  • 占空比。

        适用于任何信号的其他特征,如边沿速度、上升或下降时间等,也适用于时钟信号。


2 时钟的周期和频率

        时钟,是个人都知道,但是电路的速度/性能经常回合时钟周期相互混淆。设备若具有短时钟周期则表示有高时钟速度或频率,意味着所做的设计在给定的周期内有更多的时钟信号有效沿,时钟频率是影响设计性能的参数之一,但仅仅提高这些参数值并不一定能表示微处理器将会运行的更快和效率更高,设计中还有体系结构、流水线等其他指标能够影响性能和功耗。这种错误叫做“兆赫神话”,乔布斯说的。


3 时钟沿和占空比

        玩过单片机尤其PWM的应该都知道。


4 create_clock

        在设计中具体说明信号的SDC指令是“create_clock”。该指令的BNF(Backus-Naur Form,巴斯科范式)为:

create_clock     -period period_value
                [source_objects]
                [-name clock_name]
                [-waveform edge_list]
                [-add]
                [-comment comment_string]

4.1 定义时钟周期

        -period选项用于定义时钟周期。时钟周期的单位由库时间单位推导得出,默认单位ns,值必须大于0。

        set_units命令提到了SDC文件中使用的单位。

4.2 标识时钟源

        create_clock通常在时钟源的设计对象中进行声明。这些源对象可以是端口、引脚或网络。如下图:

1

        源对象可以是端口A、网络N或者触发器的引脚P。如果在网络中定义时钟,则要确保网络中有驱动信号(引脚或端口),否则时钟信号将没有信号源。一个时钟信号可能有多个时钟源。这种情况通常用在设计必须支持时钟切换冗余或者不同操作模式中。时钟切换通常的特点是锁相环可用,在主时钟停止运行的时候,可以打开冗余时钟。

        上图中,假设驱动电路的时钟信号的周期为10ns,该电路可以表示为:

#代表作为时钟源的端口
create_clock    -period 10 [get_port A]

OR

#代表作为时钟源的网络
create_clock    -period 10 [get_nets N]

OR

#代表作为时钟源的引脚
# 假设触发器实例名称为FF
create_clock    -period 10 [get_pins FF/P]

4.3 命名时钟

        每个时钟定义都会给时钟信号命名。用“-name”选项可以指定一个字符串作为时钟名称。当“-name”选项没有明确指定字符串并且时钟已被声明时,工具将指定自己的名字给时钟信号命名。

        时钟名称提供了更加简单的方法来统称时钟信号的所有特征。

4.4 指定占空比

        时钟信号占空比用“-waveform”选项来指定。该选项是典型的有序实数对,表示时钟的上升沿和下降沿。数字表示在t=0之后出现上升沿和下降沿的时间。例如波形在t=5时出现上升沿,在t=10时出现下降沿,可以表示为:

create_clock    -period 10 -name CLK -waveform {5 10} [get_ports A]

        如果不指定,占空比为50%。

        “-waveform”选项中的数字表示一个完整时钟周期,因此必须是单调递增的。如果在t=4时刻为下降沿,t=5时刻为上升沿,那么必须考虑两个时钟周期内时钟信号的变化。在两个周期内,该时钟在t=5时出现第一个上升沿,接着在t=14出现一个下降沿,因此该时钟信号表示为:

create_clock -period 10 -name CLK -waveform {5 14} [get_ports C2]

        如果出现较为复杂的时钟信号波形,可以通过使用有两个以上边沿的-waveform选项来完成,但该选项必须只能用偶数个边沿来表示上升沿和下降沿相互交替过渡的次数。例如:

create_clock -period 10 -name CLK -waveform {3 5 8 9} [get_ports C3]

4.5 同源多时钟

        许多设计需要在时钟源指定多个时钟,从而满足多I/O速度协议的需求,如以下电路:

2

        假设通过一个多路选择器从电路单元外部驱动时钟端口,多路选择器的两个时钟具有不同的特征。为了模拟该电路单元的时钟约束,设计者需要在相同的对象中指定两个不同的时钟。可以表示为:

create_clock -name C1 -period 10 [get_ports CLK]
create_clock -name C2 -period 15 [get_ports CLK] -add

        在这种情况下,如果想在综合分析和静态时序分析中考虑所有时钟,则需要为随后的同一个对象中的时钟指定一个“-add”选项。每个时钟信号需要唯一的名称来区分,当使用“-add”选项时,由于工具不知如何命名这两个时钟信号(应用于相同对象),因此需要强制使用“-name”选项。当用户在同一个对象中指定多个时钟信号,但没有指定“-add”选项时,最后一个时钟定义将覆盖之前的时钟定义。

        时钟信号是应用于对象的属性,它具有唯一的波形和周期,因此所有的属性(设计对象、波形、周期)一起定义了时钟信号。从概念上讲,时钟信号与其应用的对象(端口、引脚)不同,所以定义在相同对象上的两个不同波形表示两个不同的时钟信号。类似地,定义在两个不同对象上的具有相同波形和周期的时钟信号是两个不同的时钟信号,这恰恰就是为什么时钟信号需要给定唯一名称。

4.6 注释时钟

        从SDC1.9开始,包含create_clock在内的一些SDC指令增加了一个新的选项“-comment”。该选项用一个字符串作为变量,主要用于显示时钟信号的文档信息,以帮助理解、复用、增强SDC的可移植性,并不影响综合和时序。例如:

create_clock    -period -name clk [get_ports clk]\
-comment "Clock for USB block generated by PLL"

5 虚拟时钟

        在某些情况下用户需要单元电路中的约束没有时钟信号的端口或引脚。在这种情况下,端口或引脚假设被电路单元外部的时钟信号所触发或依赖。为了获取这些位于电路单元之外或者片外的时钟信号的特征,需要用到虚拟时钟的概念。虚拟时钟是指物理上在特点电路单元中不存在的时钟,但它表示影响改电路单元时序的外部触发器。虚拟时钟没有指定的时钟源。

        实际上虚拟时钟可能有时钟源,该时钟源可能是约束的电路单元外部。用create_clock模拟虚拟时钟的时候只有“period”、“waveform”和“name”选项,而没有源对象,例如:

create_clock    -period 10 -name v_clk -waveform {0 5}

6 其它时钟特征

        大部分设计都需要多个时钟。为每个时钟信号都设置一个独立的时钟信号发生器是不可行的,这就需要利用基本时钟生成多个时钟信号。当多个时钟信号在设计中交互时,设计者需要模拟时钟信号之间的偏离、延迟、相位关系等特征。


7 时钟规格的重要性

        对于由时钟信号触发的同步设计,都有很多顺序元素(触发器、寄存器、同步储存器等)。设计中超过90%的时序路径都是从一个顺序元素到另一个顺序元素。通过定义合适的时钟,工具就可以确定每个顺序元素应该在哪个时间点被触发,反过来它又将决定什么时间数据将从这些顺序元素中启动,以及什么时间这些元素将捕获新数据。

        当定义时钟的时候,也就定义了许多个用该时钟计时的顺序设备的触发时间;当定义了触发事件路径的起点和终点之后,该路径需要的时序也就定义好了。

        通常情况下,大多数路径都是同步路径,这意味着路径的起点和终点都用同一个根时钟触发。因此当定义好一个时钟后,设计中的无数路径就都得到了它们的时序需求。

        如上图,两个触发器F1和F2都是由同一个时钟的上升沿触发,该时钟信号源为CLK端口。在此时钟源定义一个周期为10ns的时钟,然后马上就能获得时序需求,数据从F1启动,在10ns内达到F2。

        进一步假设F2是下降沿触发的,时钟信号的占空比为50%。F2的有效边沿将在F1有效边沿到达后5ns出现。因此,该路径的时序需求变为了5ns,而不是10ns。


        告辞。