静态时序分析之时钟约束

FPGA静态时序分析
quartus ii中的静态时序分析工具支持以下几种类型的时钟约束:
(1)Base clocks基础时钟
(2)Virtual clocks 虚拟时钟
(3)Multifrequency clocks 多频率时钟
(4)Generated clocks 生成时钟
在sdc里编写约束文件时,首先要对时钟进行约束,因为其他的约束都是对参考时钟进行的。静态时序分析是从上面到下面
对你的约束指令进行读取并执行的
1、创建Base clocks 基础时钟约束
基础时钟是输入FPGA的主要时钟,基础时钟是由片外晶振或外部器件输入的,是整个设计的时钟源头,其余的Generated clocks
以及其他的约束都是用base clocks作为参考时钟的。
 用creat_clock指令对输入时钟进行约束,下面的7-8是对输入的时钟进行约束
 -period 10 是指输入的的时钟周期是10ns,即时钟频率是100M;
 -waveform{2.5 7.5}是指时钟偏移2.5ns(1/4周期),即相位偏移了90度;
 -get_ports clk_sys是指输入的时钟是从clk_sys这个管脚进入FPGA的。
 
 EXAMPLE 100Mhz shifted by 90degrees clock creation
 ----------------------------------------------------------
 creat_clock  -period 10 -waveform{2.5 7.5} [get_ports clk_sys]
 ---------------------------------------------------------- 
 对同一个输入管脚有多个频率的时钟进行约束,在第二条指令后加上-add,该约束命令表示从clk_sys管脚输入的时钟有100M和
 200M两种频率,格式如下:
--------------------------------------------------------------------
creat_clock  -period 10 -waveform{2.5 7.5} [get_ports clk_sys]
creat_clock  -period 5 -waveform{2.5 7.5} [get_ports clk_sys] -add
--------------------------------------------------------------------

2、创建Virtual clocks虚拟时钟约束
 虚拟时钟并没有真正的输入源,是通过指令虚拟出来的。虚拟时钟主要用在I/O输入输出约束上,用来代表与FPGA相连的外部器件的
 时钟。比如源同步输入时,就可以通过创建虚拟时钟进行最大最小延迟约束。
 creat virtual clock
 ----------------------------------------------------------------------
 creat_clock -period 10 -name my_virt_clk
 ----------------------------------------------------------------------
3、创建Multifrequency clocks多频率时钟约束
指令格式如下;
Multifrequency clocks example
--------------------------------------------------------------------
creat_clock -period 10 -name clock_primary -waveform{0 5}\[get_ports clk]
creat_clock -period 15 -name clock_secondary -waveform{0 7.5}\[get_ports clk] -add
--------------------------------------------------------------------
4、创建generated clocks 生成时钟
generated clocks是指从PLL生成的时钟,或者由程序分频产生的时钟。在SDC里用creat_generated_clock
指令对生成的时钟进行约束。Options里有中括号的表示可选的,不是必须的。格式如下:
.Command:  crear_generated_clock
.Options
   [-name<clock_name>]
   -source<master_pin>
   [-master_clock<clock_name>]
   [-divide_by<factor>]
   [-multiply_by<factor>]
   [-duty_cycle<percent>]
   [-invert]
   [-phase<degrees>]
   [-edges<edge_list>]
   [-edge_shift<shift_list>]
   [<targets>]
   [-add]
   
   -name用来指定通过creat_generated_clock指令生成的时钟名称
   -source指用来生成时钟的源时钟,比如在PLL里面,指输入PLL的源时钟
   -master_clock是指源时钟如果有几个不同的频率,该master_clock指示源时钟用哪个频率的时钟作为source clock
   -divide_by时钟的分频值
   -multipl_by时钟的倍频值
   -duty_cycle生成时钟的占空比
   -invert生成时钟反相
   -phase生成时钟相位偏移值
   
   下面是用程序进行分频产生时钟的例子
   一个寄存器把输入时钟CLK_IN进行二分频输出
   
   
   对其进行时钟约束,指令如下:
   creat_clock -period 10 [get_ports clk_in]   //Base clocks 基础时钟约束
   
   creat_generated_clock -name clk_div\
                         -source[get_pins inst|clk]\
                         -divide_by 2\
                         [get_pins inst|regout]
                         
   
   再举一个PLL生成时钟约束的例子:
   下面是程序里例化的一个PLL,输入时钟CLK是25M,产生4个输出时钟outclk_0是125M,outclk_1是25M,outclk2是2.5M,outclk_3是50M
    wire   clk_125M
    wire   clk_25M
    wire   clk_2_5M
    wire    mm_clk
    PLL     pll_inst
    (
    .rst                (0),
    .outclk_0            (CLK),
    .outclk_1              (clk_125M),
    .outclk_2              (clk_25M),
    .outclk_3               (clk_2_5M),
    .locked                  ()
    ); 
    
    首先对输入时钟clk进行约束,指令如下:
    
    set clk_in  "CLK"
    set IN_CLK_PERIOD  40
    
    creat_clock -name altera_tse_$clk_in -period $IN_CLK_PERIOD [get_ports $clk_in ]  
    
    5、derive_pll_clocks
    该命令是将程序里面所有的PLL生成的时钟都进行约束,生成约束时钟的名称不能修改,所以为了可以灵活的修改生成时钟
    的名称,很多时候都是用creat_generated_clock指令来对PLL生成的时钟进行约束。
       using derive pll command
        creat_clock -period 10.0\
        [get_ports in_clk]
        derive_pll_clocks
        
   6、derive_clock_uncertainty
   对时钟的uncertainty进行约束,时钟的uncertainty指的是时钟的jitter(抖动)和skew(偏斜)。用derive_clock_uncertainty,
   静态时序分析工具会自动的计算时钟的uncertainty,而不用手动去添加。
   
   7、set_clock_groups创建时钟分组 命令
   对于静态时序分析工具默认所有的时钟都是相关的,这样会把一些没有关联的信号进行分析,导致错误的分析结果,所以
   需要用该命令去吧时钟进行分组。
   set_clock_groups有两个类型:
   -exclusive:表示所分的组是互斥的,不能同时存在
   -asynchronous:表示所分的组是异步的,即不相关的
   下面是创建两个互斥的时钟分组,时钟clk_A和clk_B分在不同的组,是互斥的。两者不会同时在程序里面出现。
   
   example  creat mutually exclusive clock groups
   -------------------------------------------------------------------------------------
   creat_clock -period 40 -name clk_A [get_ports{port_A}]
   creat_clock -add -period 20 -name clk_B [get_ports{port_A}]
   set_clock_groups -exclusive -group{clk_A} -group{clk_B}
   --------------------------------------------------------------------------------------
   下面是创建两个异步的时钟分组,时钟clk_A和clk_B为一组,这样clk_A,clk_B和clk_C就是异步的,不相关的。
    example creat asynchronous clock groups
    --------------------------------------------------------------------------------------
    set_clock_groups -asynchronous  -group{clk_A clk_B} -group{clk_C}
    --------------------------------------------------------------------------------------
   
   
   摘抄自https://blog.csdn.net/huan09900990/article/details/77163970?t=123
                      

猜你喜欢

转载自blog.csdn.net/qq_33586509/article/details/81099214
今日推荐