Quartus中的时序约束

时序分析基础

 时序分析类型

三种路径类型

       1.时钟路径

       2.数据路径

       3.异步路径(这里的异步路径指寄存器的异步控制信号,如复位和置位信号路径)


两种分析类型

       1.同步的时钟与数据信号路径

       2.异步的时钟与控制信号路径

Setup Time 与 Hold Time

 

       Setup Time定义为数据信号必须在时钟信号边沿出现前准备好的最短时间,即有效数据出现的时间要比时钟信号边沿提早Tsu以上才能被有效抓到。Hold Time定义为数据信号必须在时钟信号边沿出现后保持的最短时间,即有效数据在时钟信号边沿出现后还要保持Th以上的时间,原先的数据才能被正确更新。

Slack

 

       Slack是一个区间,可以用来判断时序是否符合需求。Slack值为正,代表综合出来的时序符合需求,否则则不符合。

Setup Slack

 

       Setup Slack为正值,代表有效数据到达的时间满足数据建立时间的要求(Setup Time)。其估算方式如下图所示。



Hold Slack


      Hold Slack为正值,代表有效数据保持的时间满足数据保持时间的要求(Setup Time)。其估算方式如下图所示。



Data Arrival Time


       数据到达时间的定义如下图所示。Data Arrival Time定义为输入端时钟上升沿触发的时间点加上Tclk1加上Tco加上Tdata。


时序约束的基本语句

       在编译了整个工程之后,打开TimeQuest,如果原先没有.sdc文件,则选择File->New SDC File(一般推荐使用Tcl语言进行时序约束更加规范,也更方便。简单的应用也可以使用自带的GUI套件进行约束)。记得将写好的SDC文件加入进工程,再重新编译。

时钟约束

       create_clock -name sys_clk -period 8.0 [get_ports fpga_clk]

Eg: 

       create_clock -name {clk} -period 10 -waveform {0 6} [get_ports {clk}]

Note:

      1.通常不会使用到waveform(占空比),因为其默认为50%。


       derive_pll_clocks

Note:

       1.每个PLL的输出都应该通过使用create_generated_clock来进行约束。

      2.当PLL被建立时,用户输入每个PLL配置的输出。因为这样,TimeQuest可以通过derive_pll_clocks进行自动地约束。

     3.为了看到所有通过derive_pll_clocks执行的低级命令,TimeQuest会在message的Info里面显示。

     4.尽管通过使用create_generated_clockderive_pll_clocks的效果是一样的,但是由于工程设计会经常更改,这时就能凸显derive_pll_clocks的好处了,它能自动地处理。


      derive_clock_uncertainty

Note:

       1.这个命令约束的器件应该为65nm或者更新的产品。当然如果在旧器件上使用了也不会有任何危险,它只是什么也不会干。

      2.这条命令主要计算时钟到时钟的抖动,如PLL的抖动,时钟树的抖动等等。


      set_clock_groups -asynchronous -group {} -group {}

Note:

      1.在TimeQuest中,所有的时钟默认都是相关联的,因此需要用户去将不是相关联的时钟分组、分割。举个例子,一条跨时钟的路径有周期为8ns和10ns的时钟,TimeQuest就会发现在这两个时钟间有2ns的差距,然后自动去试图消解掉它,这样就可能导致设计的失败。

      2.默认的,所有的时钟都在一个大组里面,这条命令就是分割不同的时钟进不同的组。

      3.在一个单独的命令中,同一个时钟不能被分到不同的组。

      4.在set_clock_groups后的选项可以为-asynchronous或者-exclusive。-asynchronous表示时钟在相互切换,不能同步地通过数据,一般使用在跨时钟域的时候。-exclusive则表示时钟没有相互切换,相互是独立的,与此相关的设计诸如时钟选择器,在每个时刻都只能有一个时钟单独输出。


      set_false_path -from [get_clocks sys_clk] -to [get_clocks dsp_clk]

Note:

      1.这是另一种分割开不相关时钟的办法,与set_clock_groups有一样的效果。一般使用在设计简单,需分割的时钟不多的情况下。


I/O约束

     首先对于这里的I/O进行阐释当FPGA外部送入FPGA内部寄存器数据时,会有两个时钟launch clock(数据发送时钟)与latch clock(锁存时钟),前者负责将数据从外部寄存器中送出,后者要在setup与hold都满足的条件下,将数据锁入FPGA内部寄存器,输出数据也是一样,因此这里会同时关注两个时钟。


     Step1

     create_clock

     通过create_clock来建立I/O的虚拟时钟。举例来说,FPGA的设计中会有运行频率66MHZ的PCI器件与运行频率200MHZ的DAC。这个时候就可以在sdc文件中加入这两句:

create_clock -period 15.151 -name pci_clk_ext

create_clock -period 5.0 -name dac_clk_ext

     这里并没有将这些虚拟时钟与FPGA中的任何东西联系起来,在接下来的几步它是如何被使用到的就会变得清楚。


     Step2

     set_input_delay /  set_output_delay

     一旦使用到-max和-min时,在I/O端口加入set_input_delay / set_input_delay两次延迟值都使用0.0(这个只是起占位的用途,在Step5还会被修改),然后使用Step1中定义的虚拟时钟。

set_output_delay -clock dac_clk_ext -max 0.0 [get_ports DAC_DATA[*]]
set_output_delay -clock dac_clk_ext -min 0.0 [get_ports DAC_DATA[*]]

     这一步的语句很简单明了,但是实际上它并没有约束任何东西,只是描述了FPGA外的是如何运行的。在原理图层面上,它是这样的:

     正如说看到的,上面两步描述了FPGA外部的电路,同时也看到其内部有一个寄存器连接着外部的寄存器。这就是标准的FPGA内部路径描述。


      Step3

     Setup/Hold时序分析

     这里的Setup/Hold都是针对FPGA内部的时钟与设置的虚拟时钟(模仿外部时钟)来说的。

     在Step1、2执行完后,DAC_DATA通过虚拟时钟dac_clk_ext驱动外部寄存器,对于这些寄存器的最大/最小延迟都是0。因为虚拟时钟周期是5ns,并且两个时钟都没有相位偏移,因此默认的Setup Relationship为5ns,Hold Relationship为0ns。如果不确定,还可以通过TCL命令运行run_timing查看。


知识共享许可协议
本作品采用知识共享署名-非商业性使用-相同方式共享 3.0 中国大陆许可协议进行许可。

  • 28
    点赞
  • 123
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值