目录
一、前言
二、时钟抖动
2.1 时钟抖动类型
2.2 set_input_jitter
2.3 set_system_jitter
2.4 set_clock_uncertainty
2.5 设计代码
2.6 约束解析
2.7 Input_jitter报告
2.8 System Jitter报告
2.9 Clock Uncertainty报告
2.9.1 Uncertainty的计算
2.9.2 Uncertainty约束设置
2.9.3 Uncertainty报告
一、前言
在时序约束中有一类约束是针对时钟特性进行约束的,如时钟源create_clock和create_generated_clock,时钟抖动set_input_jitter,set_system_jitter,时钟不确定性set_clock_uncertainty,时钟延时set_clock_latency,时钟极性set_clock_sense。考虑到内容篇幅,create_clock和create_generated_clock前面已讲解,本文主要详细展示其中的关于抖动set_input_jitter,set_system_jitter和不确定性set_clock_uncertainty的使用
二、时钟抖动
时钟抖动(Clock Jitter)是指时钟信号边沿相对于理想位置的时间偏差,这种偏差会导致建立时间和保持时间不满足要求,使电路的最高工作频率受限,严重可导致芯片失效。因此,需要对时钟抖动进行合理的约束。
2.1 时钟抖动类型
周期抖动(Period Jitter):实际时钟周期与理想周期的偏差,可能导致时序违规,影响电路功能。
周期到周期抖动(Cycle-to-Cycle Jitter):相邻时钟周期之间的偏差,影响高速电路的稳定长期抖动(Long-Term Jitter):多个时钟周期后,时钟边沿与理想位置的累积偏差,对长时间运行的电路有影响。
相位抖动(Phase Jitter):时钟信号相位与理想相位的偏差,影响同步电路的性能。
2.2 set_input_jitter
Input_jitter输入抖动是指连续时钟边沿相对于标称或理想时钟到达时间的变化差异。输入抖动是一个绝对值,表示时钟边沿两侧的变化。
使用 set_input_jitter
命令可以为每个主时钟单独指定输入抖动。不能直接为生成时钟指定输入抖动。Vivado 的时序工具会自动计算生成时钟从其主时钟继承的抖动。
a)对于由 MMCM 或 PLL 驱动的生成时钟,输入抖动会被替换为计算得到的离散抖动。
b)对于由组合逻辑或时序单元创建的生成时钟,生成时钟的抖动与其主时钟的抖动相同。
2.3 set_system_jitter
System_jitter系统抖动是指由于电源噪声、板级噪声或系统中任何额外的抖动引起的整体抖动。使用 set_system_jitter
命令可以为整个设计设置一个全局值,即适用于所有时钟。
以下命令为通过输入端口 clkin
传播的主时钟设置了 ±100 ps 的抖动:
set_system_jitter [get_clocks -of_objects [get_ports clkin]] 0.1
输入抖动和系统抖动在时钟不确定性(clock uncertainty)的整体计算中的影响并非简单直观,且不遵循单一公式。时钟不确定性的计算是路径相关的,取决于时钟拓扑结构,路径中涉及的时钟对,时钟树上是否存在 MMCM/PLL,以及其他考虑因素。不过,Report Timing 命令的文本和 GUI 会展示每条时序路径的时钟不确定性分解结果。
2.4 set_clock_uncertainty
clock uncertainty包含clock jitter,input jitter,system jitter,使用set_clock_uncertainty可以对不同的场景,延时或者是需要的时钟关系设置时钟不确定性,对于设置中的部分添加时序裕量是一种很方便的方式。
Clock uncertainty type:有两种设置不确定性方式,simple uncertainty和interclock uncertainty。simple uncertainty是针对同步时钟,objects可以是Cell pins,clocks,I/O port,interclock uncertainty针对异步时钟,需设置-from和-to参数。
跨时钟间的不确定性总是优先于简单的时钟不确定性,不受约束顺序的影响。以下面约束为例,尽管第二条简单的不确定约束放在后面,从clk1到clk2的时序路径不确定性依旧为2ns
set_clock_uncertainty 2.0 -from [get_clocks clk1] -to [get_clocks clk2]
set_clock_uncertainty 1.0 [get_clocks clk1]
当在跨时钟域的两个时钟间设置了不确定约束时,需确保约束了两个时钟域间所有的跨时钟域路径,如clk1到clk2,clk2到clk1。
2.5 设计代码
module jitter_uncertainty(clkin1,clkin2,d1,clk,ce,ff3);
input clkin1,clkin2,d1,clk,ce;
output ff3;
reg ff1,ff2,ff3;
wire bus,n_clkout0;PLLE2_ADV #(.BANDWIDTH("OPTIMIZED"), // OPTIMIZED, HIGH, LOW.CLKFBOUT_MULT(5), // Multiply value for all CLKOUT, (2-64).CLKFBOUT_PHASE(0.0), // Phase offset in degrees of CLKFB, (-360.000-360.000).// CLKIN_PERIOD: Input clock period in nS to ps resolution (i.e. 33.333 is 30 MHz)..CLKIN1_PERIOD(0.0),.CLKIN2_PERIOD(0.0),// CLKOUT0_DIVIDE - CLKOUT5_DIVIDE: Divide amount for CLKOUT (1-128).CLKOUT0_DIVIDE(1),.CLKOUT1_DIVIDE(1),// CLKOUT0_DUTY_CYCLE - CLKOUT5_DUTY_CYCLE: Duty cycle for CLKOUT outputs (0.001-0.999)..CLKOUT0_DUTY_CYCLE(0.5),.CLKOUT1_DUTY_CYCLE(0.5),// CLKOUT0_PHASE - CLKOUT5_PHASE: Phase offset for CLKOUT outputs (-360.000-360.000)..CLKOUT0_PHASE(0.0),.CLKOUT1_PHASE(0.0),.COMPENSATION("ZHOLD"), // ZHOLD, BUF_IN, EXTERNAL, INTERNAL.DIVCLK_DIVIDE(1), // Master division value (1-56)// REF_JITTER: Reference input jitter in UI (0.000-0.999)..REF_JITTER1(0.0),.REF_JITTER2(0.0),.STARTUP_WAIT("FALSE") // Delay DONE until PLL Locks, ("TRUE"/"FALSE"))PLLE2_ADV_inst (// Clock Outputs: 1-bit (each) output: User configurable clock outputs.CLKOUT0(n_clkout0), // 1-bit output: CLKOUT0.CLKOUT1(CLKOUT1), // 1-bit output: CLKOUT1// Clock Inputs: 1-bit (each) input: Clock inputs.CLKIN1(clkin1), // 1-bit input: Primary clock.CLKIN2(clkin2), // 1-bit input: Secondary clock// Control Ports: 1-bit (each) input: PLL control ports.CLKINSEL(ce), // 1-bit input: Clock select, High=CLKIN1 Low=CLKIN2.RST(ce));always@(posedge n_clkout0,negedge ce)
begin
if(!ce)
begin
ff1<=0;
end
else begin
ff1<=d1;end
endalways@(posedge n_clkout0,negedge ce)
begin
if(!ce)
ff2<=0;
else begin
ff2<=ff1;
end
endassign bus=ff2+ff1;
always@(negedge clk)
begin
if(!ce)ff3<=0;else beginff3<=bus;end
end
endmodule
对应的连接网表图如下
2.6 约束解析
基础约束中约束了3个主时钟和一个生成时钟
create_clock -period 10.000 -name clkin1 -waveform {0.000 5.000} [get_ports clkin1]
create_clock -period 8.000 -name clkin2 -waveform {0.000 4.000} [get_ports clkin2]
create_clock -period 8.000 -name clk -waveform {0.000 4.000} [get_ports clk]
create_generated_clock -name gen_clk -source [get_pins PLLE2_ADV_inst/CLKOUT0] -multiply_by 2 -add -master_clock clkin1 [get_nets n_clkout0]
2.7 Input_jitter报告
对时钟clk约束输入抖动为1.111ns
set_input_jitter [get_clocks clk] 1.111
以Path9为例,查看Clock Uncertainty,Total Input Jitter(TIJ)即为约束的set_input_jitter值
将约束对象改为生成时钟的主时钟clkin1
set_input_jitter [get_clocks clkin1] 1.111
已包含gen_clk的路径Path1为例,此时无Total Input Jitter,即输入抖动约束不会通过主时钟传递到生成时钟
移除输入抖动约束,此时Discrete Jitter的数值变化了,即体现在生成时钟gen_clk的Discrete Jitter上
2.8 System Jitter报告
查看任一时序路径报告,Clock Uncertainty中Total System Jitter(TSJ)为0.157ns,TSJ的计算公式为Tsj = sqrt(SourceClockSystemJitter^2 + DestinationClockSystemJitter^2),因为SourceClockSystemJitter和DestinationClockSystemJitter都为set_system_jitter值1.234ns,
TSJ=sqrt(1.234^2+1.234^2)=1.745ns。
set_system_jitter对所有时钟都生效,因此约束中只有一个抖动值,不能指定对象进行设置
2.9 Clock Uncertainty报告
2.9.1 Uncertainty的计算
相比于Input Jitter和System Jitter,Uncertainty的约束方式更复杂,根据计算公式可看出
公式中Clock Uncertainty = (√(Tsj^2+Tij^2+Dj^2))/2 +PE+UU 各项含义如下
-
Tsj = 总系统抖动(Total System Jitter),由系统抖动确定。参见 Set System Jitter
-
Tij = 总的输入抖动(Total Input Jitter),由用于约束的Set Input Jitter决定,有的路径也会不存在该项
-
Dj = 离散抖动(Discrete Jitter),是由硬件原语(如 MMCM 或 PLL)引入的抖动量。离散抖动是 MMCM 生成的时钟的特性,包括在主时钟上定义的输入抖动。参见 Set Input Jitter
-
PE = 相位误差(Phase Error),来自 MMCM/PLL 器件模型
-
UU = 用户不确定性(User Uncertainty),即在此指定的用户时钟不确定性。
2.9.2 Uncertainty约束设置
相关设置项含义如下
Uncertainty value:指定要分配的不确定性值,以纳秒为单位。
Uncertainty applies to:指示不确定性是用于建立时间分析、保持时间分析,还是两者都适用。
Clock Uncertainty Type:简单不确定性(Simple uncertainty):将时钟不确定性应用于指定的对象。
Objects:列出应分配时钟不确定性的时钟、I/O 端口或单元引脚。
Inter-clock uncertainty:将时钟不确定性应用于跨两个时钟域的时序路径。
From:指定跨时钟不确定性的源时钟。
Transition:指定用于时序分析的源时钟边沿。可以选择上升沿、下降沿或两者。只有由指定时钟边沿触发的路径会受到不确定性的影响。
To:指定跨时钟不确定性的目标时钟。
2.9.3 Uncertainty报告
以Path9为例,展示相关约束对Uncertainty的影响
a) 无Set_Input_Jitter时,路径总的uncertainty为(√(Tsj^2+Dj^2))/2 +PE
b) 增加input jitter约束时,路径总的uncertainty(√(Tsj^2+Tij^2+Dj^2))/2 +PE,TIJ为约束的input jitter值
c)增加set_clock_uncertainty约束,路径总的uncertainty(√(Tsj^2+Tij^2+Dj^2))/2 +PE+UU,为约束的clock uncertainty值,以约束clk时钟的uncertainty为2.222ns为例
set_clock_uncertainty 2.222 [get_clocks clk]
d)set_clock_uncertainty约束中设置setup有效
set_clock_uncertainty -setup 2.222 [get_clocks clk]
查看对应的hold路径,clock uncertainty中不存在UU
e)通过interclock uncertainty指定起点和终点上时钟的uncertainty,对象只能为时钟,以约束gen_clk到clk为例
set_clock_uncertainty -from [get_clocks gen_clk] -to [get_clocks clk] 2.222
Path9存在约束UU
f) 对clk时钟指定为下降沿生效
set_clock_uncertainty -from [get_clocks gen_clk] -fall_to [get_clocks clk] 2.222
因clk驱动的触发器ff3_reg为上升沿触发,非下降沿,故约束不生效
如果需要clk时钟为下降沿触发,则对应的代码需改为
always@(negedge clk)
begin
if(!ce)ff3<=0;else beginff3<=bus;end
end
ff3_reg为下降沿触发时约束生效