在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 22190|回复: 44

[转贴] 转帖--有关约束

[复制链接]
发表于 2013-5-18 10:03:13 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x

今天突然发现一博客专门写了关于约束的文章,比较详细也比较全面,希望自己可以通读深读吧。

在给FPGA做逻辑综合和布局布线时,需要在工具中设定时序的约束。 通常,在FPGA设计工具中都FPGA中包含有4种路径:从输入端口到寄存器,从寄存器到寄存器,从寄存器到输出,从输入到输出的纯组合逻辑。 通常,需要对这几种路径分别进行约束,以便使设计工具能够得到最优化的结果。下面对这几种路径分别进行讨论。
1,从输入端口到寄存器:
        这种路径的约束是为了让FPGA设计工具能够尽可能的优化从输入端口到第一级寄存器之间的路径延迟,使其能够保证系统时钟可靠的采到从外部芯片到FPGA的信号。约束名称:input delay.   约束条件的影响主要有4个因素:外部芯片的Tco,电路板上信号延迟Tpd,FPGA的Tsu, 时钟延迟Tclk.  Tco的参数通常需要查外部芯片的数据手册。 计算公式:input delay = Tco+Tpd+Tsu-Tclk.    FPGA的Tsu也需要查FPGA芯片的手册。 FPGA速度等级不同,这个参数也不同。 Tpd和Tclk需要根据电路板实际的参数来计算。通常,每10cm的线长可以按照1ns来计算.   例如:系统时钟100MHz,  电路板上最大延迟2ns, 时钟最大延迟 1.7ns, Tco 3ns, FPGA的Tsu为0.2ns. 那么输入延迟的值: max Input delay = 2+3+0.2-1.7=3.5ns.  这个参数的含义是指 让FPGA的设计工具把FPGA的输入端口到第一级寄存器之间的路径延迟(包括门延迟和线延迟)控制在 10ns-3.5ns=6.5ns 以内。


2,寄存器到寄存器:
      这种路径的约束是为了让FPGA设计工具能够优化FPGA内寄存器到寄存器之间的路径,使其延迟时间必须小于时钟周期,这样才能确保信号被可靠的传递。 由于这种路径只存在于FPGA内部,通常通过设定时钟频率的方式就可以对其进行约束。对于更深入的优化方法,还可以采用对寄存器的输入和寄存器的输出加入适当的约束,来使逻辑综合器和布线器能够对某条路径进行特别的优化。 还可以通过设定最大扇出数来迫使工具对其进行逻辑复制,减少扇出数量,提高性能。


3,寄存器到输出:
      这种路径的约束是为了让FPGA设计工具能够优化FPGA内部从最后一级寄存器到输出端口的路径,确保其输出的信号能够被下一级芯片正确的采到。 约束的名称: output delay,            约束条件的影响主要有3个因素:外部芯片的Tsu,电路板上信号延迟Tpd,时钟延迟Tclk.  Tsu的参数通常需要查外部芯片的数据手册。 计算公式:output delay = Tsu+Tpd-Tclk.         例如:系统时钟100MHz,  电路板上最大延迟2ns, 时钟最大延迟 1.7ns, Tsu 1ns, 输出延迟的值: max output delay = 1+2-1.7=1.3ns .  这个参数的含义是指 让FPGA的设计工具把最后一级寄存器到输出端口之间的路径延迟(包括门延迟和线延迟)控制在 10ns-1.3ns=8.7ns 以内。

4,从输入端口到输出端口:
    这种路径是指组合逻辑的延迟,指信号从输入到输出没有经过任何寄存器。给这种路径加约束条件,需要虚拟一个时钟,然后通过约束来指定哪些路径是要受该虚拟时钟的约束。 在Synplifypro和Precision中都有相应的约束来处理这种路径。

  前面的帖子里讲述了关于输入输出延迟的一些参数的含义和计算方法。如果要把这些参数和altera,xilinx的软件结合起来,也不是一件容易的事情。以前altera和xilinx的约束条件设定非常复杂,各自都有一套。似乎大家也不太看重约束条件的设定,大多时候都是无论如何先上板,然后通过signaltap和Chipscope来调。当FPGA规模大了之后,布线一次都需要很长时间,这种方法的弊端就越来越严重。 实际上可以借鉴asic的设计方法:加比较完善的约束条件,然后通过RTL仿真,时序分析,后仿真来解决问题,尽量避免在FPGA电路板上来调试。 altera最先意识到这一点,它采用了Synopsys的SDC格式。SDC的格式也得到了逻辑综合器的支持。而且设定方法比较容易掌握。 这个帖子会详细讨论一下这种格式的约束设定方法。

        时钟的设定方法: 时钟要分成两种,一种是从端口上直接输入的时钟,另一种是在FPGA内部产生的时钟。内部产生的时钟又要分成两种,从锁相环出来的(包括altera的PLL和Xilinx的DLL)和从逻辑单元出来的,例如一般的计数器分频就是这种情况。 从锁相环出来的时钟可以通过端口直接加,因为一般的综合工具和布线工具都能够自动的把端口的时钟约束传递到锁相环,并且根据锁相环的倍频关系自动施加到下一级。 而从逻辑单元出来的就需要单独对其进行约束。

  在SDC格式中,创建时钟的命令 create_clock, 后面要带3个参数:name ,period, waveform.  name的含义是指创建这个时钟约束的名字,而不是时钟本身的名字。 要把这个约束和时钟信号关联起来,还需要在后面加些东西。 period的单位缺省是ns. waveform是用来指定占空比。 除了这三个参数以外,常常还要加 get_ports的命令,来指定时钟的输入端口。 下面的例子是一个较为完整的设定时钟的例子:
            create_clock  -name clk1  -period 10.000 –waveform { 2.000 8.000 } [get_ports sysclk]
        这个例子表示,有一个clk1的约束,在这个约束中设定了时钟的周期为10ns, 占空比为2ns低电平,8ns高电平。 这个叫做clk1的约束是针对sysclk这个端口的。
    如果是利用内部锁相环分频出来很多其他时钟的约束,可以不再另外施加其他约束,逻辑综合器和布线器都能根据锁相环的参数自动计算。  如果是利用内部的逻辑单元分频出来的信号,则必须利用get_registers指定分频的寄存器名。 例如上例:
         create_clock  -name clk1  -period 10.000 –waveform { 2.000 8.000 } [get_registers cnt_clk].
       对于逻辑单元分频的时钟信号,也可以采用命令create_generated_clock会更加精确。举例如下:
         create_generated_clk -name clk2 -source [getports sysclk] -div 4 [get_registers  cnt_clk]
       这个约束命令描述了 一个clk2的约束,约束的对象是由sysclk分频4次得到的时钟,这个时钟是由cnt_clk这个寄存器产生的。

  在高速的系统中,对时钟的描述可能会要求的更多,更加细致。 例如,会要求对时钟的抖动和时钟的延迟进行描述。 在SDC的文件格式中,可以通过两个命令来描述:set_clock_uncertainty 和 set_clock_latency 来设定。
     时钟的延迟相对来讲比较简单。延迟一般分为外部延迟和内部时钟线网的延迟。 通常在约束时只对外部延迟做约束,在set_clock_latency的命令后带 -source的参数就可以了。 例如:
       set_clock_latency -source 2  [get_clocks {clk_in} ]
     时钟的抖动要稍微复杂一些。因为这个值不但会影响到对Tsu的分析,也会影响到对Thold的分析。 因此,采用set_clock_uncertainty的参数要多一些。 如果要理解这个命令对系统时序分析的影响,就需要对altera的延时计算的概念需要做更多的说明。

  对于set_clock_uncertainty的情况,就稍微复杂一些。 因为set_clock_uncertainty的值既影响建立时间的计算,也影响保持时间的计算,因此,需要在设定时分别指明:
           set_clock_undertainty –setup 0.500 –from clkA –to clkA
        set_clock_uncertainty –hold 0.300 –from clkA –to clkA

  前面的内容里面提供了计算输入输出延迟的计算方法。输出延迟的命令是set_output_delay. 有几个参数要加:参考时钟,最大最小值,和端口的名称。如下面的例子中描述。   
     set_output_delay -clock CLK -max 1.200  [get_ports OUT]
        set_output_delay -clock CLK -min 0.800 [get_ports OUT]

   输入延迟的命令很类似:
     set_input_delay -clock CLK -max 2.000         [get_ports IN]
       set_input_delay -clock CLK -min 1.600         [get_ports IN]
 对一些特殊的设计要求,例如不关心的数据传递路径和多拍的路径,还需要增加false path 和 Multicycle的设定。
  这两个约束比较简单,容易设定,但是非常关键。 如果设定的不好,系统性能会大打折扣。
    false path是指在时序分析中不考虑其延迟计算的路径。例如有些跨越时钟域的电路等。 设定的方法:
        set_false_path -from [get_clocks clkA] -to [get_clocks clkB]
        set_false_path -from  regA -to  regB
     第一条命令是设定了从时钟域clkA到时钟域clkB的所有路径都为false path. 第二条命令设定了从 regA到regB的路径为false path.  这两种路径在做时序分析时都会被忽略。

multicycle的设定和false path的设定方法差不多。

    为了让逻辑综合器和布局布线器能够根据时序的约束条件找到真正需要优化的路径,我们还需要对时序报告进行分析,结合逻辑综合器的时序报告,布线器的时序报告,通过分析,可以看出是否芯片的潜能已经被完全挖掘出来。 关于如何看时序分析报告,如果有机会,也可以专门搞个讲座进行详细的讲解。

以上是在某个论坛上转过来的,只是感觉对约束中路径的解释比较好一点,至于后面的关于SDC我自己也没有接触过了,暂时看看。

 楼主| 发表于 2013-5-18 13:09:56 | 显示全部楼层
转帖---动态时序分析vs静态时序分析
动态时序验证是在验证功能的同时验证时序,需要输入向量作为激励。随着规模增大,所需要的向量数量以指数增长,验证所需时间占到整个设计周期的50,且这种方法难以保证足够的覆盖率,因而对片上系统芯片设计已成为设计流程的瓶颈,所以必须有更有效的时序验证技术取代之。
动态时序仿真的优点是比较精确,而且同静态时序相比较,它适用于更多的设计类型。
但是它也存在着比较明显的缺点:
首先是分析的速度比较慢;
其次是它需要使用输入矢量,这使得它在分析的过程中有可能会遗漏一些关键路径(critical paths),因为输入矢量未必是对所有相关的路径都敏感的。
静态时序分析技术是一种穷尽分析方法,用以衡量电路性能。它提取整个电路的所有时序路径,通过计算信号沿在路径上的延迟传播找出违背时序约束的错误,主要是检查建立时间和保持时间是否满足要求,而它们又分别通过对最大路径延迟和最小路径延迟的分析得到。静态时序分析的方法不依赖于激励,且可以穷尽所有路径,运行速度很快,占用内存很少。它完全克服了动态时序验证的缺陷,适合进行超大规模的片上系统电路的验证,可以节省多达20的设计时间。因此,静态时序分析器在功能和性能上满足了全片分析的目的

IC时序验证用两种方法实现:一是动态时序分析,即根据电路中提取的延时参数,通过仿真软件动态的仿真电路以验证时序是否满足要求。二是静态时序分析,即通过分析设计中所有可能的信号路径以确定时序约束是否满足时序规范。
  动态时序分析的时序确认通过仿真实现,分析的结果完全依赖于验证工程师所提供的激励。不同激励分析的路径不同,也许有些路径(比如关键路径)不能覆盖到,当设计规模很大时,动态分析所需要的时间、占用的资源也越来越大。
  静态时序分析根据一定的模型从网表中创建无向图,计算路径延迟的总和,如果所有的路径都满足时序约束和规范,那么认为电路设计满足时序约束规范。静态时序分析的方法不依赖于激励,且可以穷尽所有路径,运行速度很快,占用内存很少。它完全克服了动态时序验证的缺陷,适合大规模的电路设计验证。对于同步设计电路,可以借助于静态时序分析工具完成时序验证的任务
 楼主| 发表于 2013-5-18 13:14:34 | 显示全部楼层
转帖---
同步复位和异步复位各有利弊,很难说哪种更有优势。除了在编码风格时讲到的一个问题,在这里再对两种策略中可能出现的问题进行分析说明。
  同步复位有一个好处就是复位的时刻发生在时钟的边沿,这样可以防止复位信号的Glitch。如果是内部生产的Reset信号,就必须保证Reset脉冲有足够的宽,至少2个Cycles,能够让时钟采样到。同时,这也是它的缺点,因为它需要一个活动的时钟,在加电时无法对一些电路产生复位。另外,综合可能把同步复位的逻辑移到触发器的D输入端,作为普通的信号处理,由于Reset信号通常有传输负载和延迟,这样处理会导致DataPath上较长的延迟。
  异步复位的最大好处就是不需要活动的时钟,对于一些需要加电复位的电路,如总线,是很必要的;同时,不像同步复位那样,复位信号会被用作D端的输入逻辑,使得整个DataPath非常干净。如果异步复位有Glitch可能使芯片进入复位状态,这时可以通过两级DFF接收Reset,再通过tree给复位触发器使用,这样可以消除输入引起的Glitch,如果设计中有多个时钟域,可以对每个时钟分配两个DFF接收Reset信号。
 楼主| 发表于 2013-5-18 14:34:13 | 显示全部楼层
转帖---
同步设计和跨时钟域数据传输
尽管异步系统有很多优势,如低功耗,也没有同步系统中让工程师头疼的时钟分布以及skew问题,但是其复杂的各种握手协议,以及异步电路在测试上的困难,使得同步系统还是数字电路设计的首选。同步设计的一个特点就是所有的时序单元都是对统一的时钟边沿敏感。要使整个芯片只采用一个时钟并不现实,因此,异步时钟域之间的数据传输以及其中的一些问题将是本节讨论的重点。
  通常,为了能够更好的综合和STA,需要对设计进行划分,一般的原则是将异步时钟域之间有数据交换的部分独立出来单独处理,其他的模块都在单一的同步时钟域中工作。对于这些模块如何在综合过程中特殊处理在下面的章节中讨论,本节主要讨论在代码设计中需要考虑的问题。
  异步时钟之间的亚稳态(Metastability)问题,亚稳态主要是由于被采样数据的变化十分靠近采样时钟的边沿引起的,这样接收(采样)触发器的输出就是亚稳态,并在传输过程中发散而引发逻辑错误,也就是通常所说的同步失败。在同步时钟域中的这种问题是Hold问题,可以通过EDA工具或插入buffer消除,因为EDA工具可以检测到这种问题。那么在异步接收设计中通过两级Flipflop来消除这种可能出现的亚稳态。现在也有工具检测代码中可能出现的亚稳态问题。多位接收控制信号之间的skew引起的问题如图1,如果其中一位如C2延迟大于C1,Ck采样的数据就变成了C2=1,C1=0,如果按照无skew传输的波形是C2’的样子,应该是00才对。而skew是不可避免的,可能是由于C2C1信号的Launch时钟本身的skew引起,也可能是传输延迟引起。对于简单的情况,我们可以通过简化逻辑,尽量让控制信号是1位宽。而这样的问题同样出现在多位宽的数据接收情况。这时通常推荐使用异步FIFO接收,或者通过握手协议接收。有的系统设计数据交换协议约定,异步接收过程中,当某个事件发生后(如图1中采样到V信号为1后)的1个Cycle后(也可以约定多个Cycle)数据肯定是正确的;也可以消除这种skew问题,但是,这种实现需要后端设计时保证这些相关信号的skew不会超过约定的周期,同时发送方的数据也要保持足够的周期数。如图1中C2”信号,如果skew2>Period(一个CKCycle),则收到V信号一个Cycle后采样数据还是错误的。
 楼主| 发表于 2013-5-18 15:00:12 | 显示全部楼层
转帖---
亚稳态是指触发器无法在某个规定时间段内达到一个可确认的状态。当一个触发器进入亚稳态时,既无法预测该单元的输出电平,也无法预测何时输出才能稳定在某个正确的电平上。在这个稳定期间,触发器输出一些中间级电平,或者可能处于振荡状态,并且这种无用的输出电平可以沿信号通道上的各个触发器级联式传播下去。
解决方法:
1 降低系统时钟频率
2 用反应更快的FF
3 引入同步机制,防止亚稳态传播
4 改善时钟质量,用边沿变化快速的时钟信号
关键是器件使用比较好的工艺和时钟周期的裕量要大。亚稳态寄存用d只是一个办法,有时候通过not,buf等都能达到信号过滤的效果
发表于 2013-5-18 15:15:36 | 显示全部楼层
感谢分享
 楼主| 发表于 2013-5-20 10:31:43 | 显示全部楼层
转帖---【转】ff(flip flop)与latch区别(详细)
关于latch的讨论 latch和flip-flop都是时序逻辑,区别为:latch同其所有的输入信号相关,当输入信号变化时latch就变化,没有时钟端;flip-flop受时钟控制,只有在时钟触发时才采样当前的输入,产生输出。当然因为二者都是时序逻辑,所以输出不但同当前的输入相关还同上一时间的输出相关。
latch缺点:
1、没有时钟端,不受系统同步时钟的控制,无法实现同步操作;
2、对输入电平敏感,受布线延迟影响较大,很难保证输出没有毛刺产生;
在xilinx和altera器件的slice和LE中都能够同时支持生产d-latch和d-ff,在这一层面上二者有什么区别暂时没有想到。如果使用门电路来搭建latch和ff,则latch消耗的门资源比ff要少,这是latch比ff优越的地方。 latch的最大缺点就是没有时钟端,和当前我们尽可能采用时序电路的设计思路不符。 latch是电平触发,相当于有一个使能端,且在激活之后(在使能电平的时候)相当于导线了,随输出而变化,在非使能状态下是保持原来的信号,这就可以看出和flip-flop的差别,其实很多时候latch是不能代替ff的 1.latch对毛刺敏感
2.在ASIC中使用latch的集成度比DFF高,但在FPGA中正好相反,因为FPGA中没有标准的latch单元,但有DFF单元,一个LATCH需要多个LE才能实现
3.latch将静态时序分析变得极为复杂
4.目前latch只在极高端电的路中使用,如intel 的P4等CPU。 FPGA中有latch单元,寄存器单元就可以配置成latch单元,在xilinx v2p的手册将该单元成为register/latch单元,附件是xilinx半个slice的结构图。其它型号和厂家的FPGA没有去查证。——个人认为xilinx是能直接配的而altera或许比较麻烦,要几个LE才行,然而也非xilinx的器件每个slice都可以这样配置
altera的只有DDR接口中有专门的latch单元,一般也只有高速电路中会采用latch的设计。
altera的LE是没有latch的结构的
又查了sp3和sp2e,别的不查了,手册上说支持这种配置。有关altera的表述wangdian说的对,altera的ff不能配置成latch,它使用查找表来实现latch,
一般的设计规则是:在绝大多数设计中避免产生LATCH.
它会让您设计的时序完蛋,并且它的隐蔽性很强,非老手不能查出.
latch最大的危害在于不能过滤毛刺。这对于下一级电路是极其危险的。
所以,只要能用D触发器的地方,就不用latch。
有些地方没有时钟,也只能用latch了。
很简单一个例子来说明:
比如现在用一个clk接到latch的使能端(假设是高电平使能),这样需要的setup时间,就是数据在时钟的下降沿之前需要的时间,但是如果是一个DFF,那么setup时间就是在时钟的上升沿需要的时间.这就说明如果数据晚于控制信号的情况下,只能用latch,这种情况就是,前面所提到的latch timing borrow.基本上相当于借了一个高电平时间.也就是说,latch借的时间也是有限的.

对latch进行STA的分析其实也是可以,但是要对工具相当熟悉才行.不过很容易出错.当前PrimeTime,是支持进行latch分析的.现在一些综合工具内置的STA分析功能也支持,比如RTL compiler, Design Compiler.
除了ASIC里可以节省资源以外。
我感觉latch这个东西在同步设计里出现的可能还是挺小的吧,
现在处理过程中大都放在ff里打一下,
影响不太大吧
组合逻辑避免产生latch的一种常用做法。
              在process里面的最开头对组合逻辑的输出赋初值。举例说明如下:
              process (Rdlenth,WrAddr_En,RdAddr_En,MRd_En,MWr_En,lm_Ackn)
          begin
            next_state<=cur_state;
            case  cur_state  is
                       when idle=>
                         if(xxxx) then
                              next_state<=busy;
                            else
                              。。。。。。
                            endif;
                     。。。。。。
              End process;
       相当的电路是在每个状态底下,如果下一个clk到来时,下一个状态条件没满足,状态机继续留在原状态,相当于在cur_state的寄存器前面做了一个选择器。
  原因分析:为什么是这样的,要把VHDL的语法拿出来复习了:在一个进程以内,对一个信号如果多次赋值,最后一个对信号的赋值有效。
在if语句和case不全很容易产生latch
  
VIA题目显然   
题目问的是这两个代码哪个综合更容易产生latch
if case不全会产生latch
代码1
always @(enable or ina or inb)
   begin
    if(enable)
     begin
      data_out = ina;
     end
     else
     begin
       data_out = inb;
     end
   end
代码2
input [3:0] data_in;
always @(data_in)
    begin
      case(data_in)
        0 :          out1 = 1'b1;
        1,3 :        out2 = 1'b1;
        2,4,5,6,7 : out3 = 1'b1;
        default :    out4 = 1'b1;
       endcase
    end
当然是下面一个更容易产生LATCH啦。其实,对于下面的情况,如out1而言,只是类似于if(data_in == 0) out1 = 1'b1;如果在default里面,把out1,out2,out3都描述一下就不会产生LATCH了
 楼主| 发表于 2013-5-22 22:05:06 | 显示全部楼层
[转]Clock Tree Pins - Nonstop、ExcludeNonstop pins are pins that would normally be considered endpoints of the clock tree, but
instead IC Compiler traces through them to find the clock tree endpoints. The clock pins of
sequential cells driving generated clocks are implicit nonstop pins. In addition, IC Compiler
supports user-defined (or explicit) nonstop pins.

To specify a nonstop pin, use the set_clock_tree_exceptions -non_stop_pins


Exclude pins are clock tree endpoints that are excluded from clock tree timing calculations
and optimizations. IC Compiler uses exclude pins only in calculations and optimizations for
design rule constraints. In addition to the exclude pins inferred by IC Compiler (the implicit
exclude pins), IC Compiler supports user-defined (or explicit) exclude pins. For example, you
might define an exclude pin to exclude all branches of the clock tree that fan out from some
combinational logic or to exclude an implicit stop pin.

During clock tree synthesis, IC Compiler isolates exclude pins (both implicit and explicit) from
the clock tree by inserting a guide buffer before the pin. Beyond the exclude pin, IC Compiler
never performs skew or insertion delay optimization, but does perform design rule fixing.

To specify an exclude pin, use the set_clock_tree_exceptions -exclude_pins
command.


                               
登录/注册后可看大图





Float pins are clock pins that have special insertion delay requirements. IC Compiler adds
the float pin delay (positive or negative) to the calculated insertion delay up to this pin.


                               
登录/注册后可看大图








Stop pins are the endpoints of the clock tree that are used for delay balancing. During clock
tree synthesis, IC Compiler uses stop pins in calculations and optimizations for both design
rule constraints and clock tree timing (skew and insertion delay).

The default clock sinks are implicit stop pins. In addition, IC Compiler supports user-defined
(or explicit) stop pins. For example, you might define a stop pin to end a branch at an input
to a combinational cell or to use an implicit exclude pin as a clock sink.

IC Compiler assigns a phase delay of zero to all stop pins (implicit and explicit) and uses this
delay during delay balancing.

To specify a stop pin, use the set_clock_tree_exceptions -stop_pins command



CTS的全称是Clock Tree Synthesis,其目的是尽可能的使同一个时钟信号到达各个终端节点的时间相同。

CTS的实现办法最常见的是通过在时钟信号的各个分支上插入buffer或者inverter来balance时钟信号的延迟。

Pin结点的类型
Pin类型别名备注
exclude pinignore pin不用平衡的节点
stop pinsync pin需要平衡的节点
non_stop pin信号会穿过这个节点
float pin最终节点”藏“在后面


                               
登录/注册后可看大图





近日使用IC Compiler过程中,在做CTS时,发现有一个register的clock pin既是ignore pin又是non-stop pin。

如果是ignore pin,则意味着CTS时应把这个sink排除在外;如果是non-stop pin,则意味着要穿过这个sink。而这两种情况是矛盾的。

研究的结果,发现是由于特殊的clock结构造成的。如下图:


                               
登录/注册后可看大图

其中的register被用做二分频,输出端Q通过一个inverter连接到了自己的输入端上;Q端上定义了一个Generated Clock(GCLK)。
因此工具推导出这个register的CLK pin是一个non-stop pin。

同时,这个GCLK通过一个PAD输出到芯片外部,没有再与其他register相连。因些,工具推导出这是一个implicit ignore pin。

知道了原因,解决办法就容易多了。将图中register的CLK pin设置为 ignore pin 更为合理些。




不想用generated clock做clock tree
让master clock 一次性全做完clock tree,就要在generated clock的定义点设through pin

就是让clocktree自动穿过的意思, 直到下一个 leaf pin

  ICC                             EDI
stop pin                       leaf pin
non_stop_pin          through pin
float_pin                      macromodel
exclude_pin                 exclude pin
 楼主| 发表于 2013-5-23 16:51:49 | 显示全部楼层
关于 时钟抖动 Jitter 和 偏移 Skew
系统时序设计中对时钟信号的要求是非常严格的,因为我们所有的时序计算都是以恒定的时钟信号为基准。但实际中时钟信号往往不可能总是那么完美,会出现抖动(Jitter)和偏移(Skew)问题。

所谓抖动(jitter),就是指两个时钟周期之间存在的差值,这个误差是在时钟发生器内部产生的,和晶振或者PLL内部电路有关,布线对其没有影响。除此之外,还有一种由于周期内信号的占空比发生变化而引起的抖动,称之为半周期抖动。总的来说,jitter可以认为在时钟信号本身在传输过程中的一些偶然和不定的变化之总和。0Y7J

时钟偏移(skew)是指同样的时钟产生的多个子时钟信号之间的延时差异。它表现的形式是多种多样的,既包含了时钟驱动器的多个输出之间的偏移,也包含了由于PCB走线误差造成的接收端和驱动端时钟信号之间的偏移。
信号完整性对时序的影响,比如串扰会影响微带线传播延迟;反射会造成数据信号在逻辑门限附近波动,从而影响最大/最小飞行时间;时钟走线的干扰会造成一定的时钟偏移。有些误差或不确定因素是仿真中无法预见的,设计者只有通过周密的思考和实际经验的积累来逐步提高系统设计的水平。
Clock skew 和Clock jitter 是影响时钟信号稳定性的主要因素。很多书里都从不同角度里对它们进行了解释。

其中“透视”一书给出的解释最为本质:

Clock Skew: The spatial variation in arrival time of a clocktransition on an integrated circuit;
Clock jitter: The temporal vatiation of the clock period at a givenpoint on the chip;
简言之,skew通常是时钟相位上的不确定,而jitter是指时钟频率上的不确定(uncertainty)。造成skew和jitter
的原因很多。由于时钟源到达不同寄存器所经历路径的驱动和负载的不同,时钟边沿的位置有所差异,因此就带来了
skew。而由于晶振本身稳定性,电源以及温度变化等原因造成了时钟频率的变化,就是jitter。

skew和jitter对电路的影响可以用一个简单的时间模型来解释。假设下图中t(c-q)代表寄存器的最大输出延迟,
t(c-q, cd)表示最小输出延时;t(su)和t(hold)分别代表寄存器的setup, holdtime(暂不考虑p.v.t)差异;t(logic)
和t(logic, cd)分别表示最大的组合逻辑传输延迟和最小组合逻辑传输延迟;
                           
在不考虑skew和jitter的情况下,及t(clk1)和t(clk2)同频同相时,时钟周期T和t(hold)需要满足
                       T > t(c-q) + t(logic) + t(su)
                      t(hold) < t(c-q, cd) + t(logic, cd)
这样才能保证电路的功能正常,且避免竞争的发生。如果考虑CLK2比CLK1晚t1的相位,及skew=t1。
则                 t(hold) < t(c-q, cd) + t(logic, cd) - t1
这意味着电路由更大的倾向发生hold time violation;如果考虑CLK1比CLK2晚t2的相位,及skew=-t2,
则                 T > t(c-q) + t(logic) + t(su) + t2
这意味着电路的性能下降了,但由于R2的hold time始终满足,所以不会有竞争的麻烦存在。clock jitter
始终是对性能造成负面的影响,一般设计中都需要专门留取10%左右的margin来保证。

clock uncertainty = clock jitter + clock skew.

jitter 是由时钟源产生的抖动。skew是时钟树不平衡引起的到达两个寄存器的延迟差。在cts之后,skew由工具算出,因此sta的时候clockuncertainty 可以设一个比较小的值。另外做holdcheck的时候因为检查的是同一个时钟沿,因此没有jitter只有skew.
发表于 2013-5-29 08:42:53 | 显示全部楼层
楼主有心了啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /3 下一条

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-4-19 08:25 , Processed in 0.029538 second(s), 8 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表