官方论坛
官方淘宝
官方博客
微信公众号
点击联系吴工 点击联系周老师
您的当前位置:主页 > 教程中心 > 问题解答 >

01_时序约束交流【汇总贴】

发布时间:2021-06-30   作者:admin 浏览量:
【问题1】 VIVADO的时钟约束向导,常无法找到时钟,如下图所示,位置1中应该要识别出时钟。

答:请注意,位置1的地方是列出的是“没有被约束的时钟”,如果该时钟已经被约束了,就不会在这里列出来了。
  注意上图中3的位置,该列说明了有2条时钟约束。可以点击这里看看,是不是已经对时钟进行约束了。
  为什么会有时钟被约束了呢?因为该工程已经有约束文件。

【问题2】VIVADO/QUARTUS练习中,rst_n是否需要约束?
答:一个完整的约束,其基本要求是:所有的路径都覆盖,包括所有的输入管脚和输出管脚。所以,rst_n需要约束。
  注意的是,该信号是输入信号,但没有随路时钟进来。所以该信号可以认为是无时钟的情形,按照课程理论,应该定义一个虚拟时钟。
  定义了虚拟时钟后,再重新使用约束向导,约束rst_n。


【问题3】在VIVADO中,如何设置虚拟时钟?
答:虚拟时钟不能在时序约束向导中添加,需要在下面窗口添加

 

  在Edit Timing Constraints中点击,然后在creat clock窗口中,双击“Double click to create a Create Clock Constrtaint”。在弹出的窗口中

Clock name为该时钟命一个名字,Source objects是不需要填的,因为是虚拟时钟,就是没对象了。


【问题4】时序约束出现时序违例(Slack为负数),如何处理?
答:首先指出一个误区:当约束出现错误时,想当然地认为是“时序约束做得不对”,所以应该怎么去改“时序约束”,从而让这些错误消失,这是一个错误的观念。
  时序约束的作用:在于检查“设计是否满足时序要求”,它是用来审视自己设计的,很多情况是,要改设计代码来满足时序要求。
  当时序约束提示有错误时,应该阅读“时序报告”,从报告中分析时序路径(数据到达时间、时钟到达时间和数据要求时间等),根据报告分析错误的原因,并根据原因来实行不同的方法。

【问题5】VIVADO中,如何查询未约束的时钟、未约束的输入延时和输出延时等?
答:如下图,在VIVADO的时序约束界面中,在下面栏目可显示未约束的地方。



【问题6】如下图所示,跨时钟域打两拍的方法,其实只是一个信号的传递,当第一个信号出现不稳之后或者错误之后,后面就会把这个错误的信号继续传递下去,并没有起到纠错的作用


答:上图中打两拍的方法,其本质不是为了“纠错”,它的作用是为了防止“亚稳态”。
  防止亚稳态的本质:防止中间状态过长。之所以采用两级触发器的方法,是因为D触发器出现亚稳态的可能性非常小,而两级D触发器出现亚稳态的概率就更小了。

【问题7】既然打两拍的方法不能纠错,那“打两拍”还有什么意义?
答:错误有很多种,有些错误是1次性错误,而有些是系统性错误。
  传输过程中,如果发了0,如果全部接收模块都认为是1,这并不是问题,这是可以预防和可控的(例如检测多几次就行了)。
  但是亚稳态的时候,如果发了0,但部分接收认为认为是1,而另一部分模块认为是0,至于哪些模块认为是1哪些是0,这是随机的,不可预知的,这就是灾难。
  更详细的内容,建议参考:FPGA知识大串讲  http://www.fpgabbs.cn/forum.php?mod=viewthread&tid=581

【问题8】模块A的时钟clka为100MHz,模块B的时钟clkb为300MHz。现在模块A要把32bit的数据送给模块B。模块A要如何发送,模块B要如何接收呢?

答:方法1:采用异步FIFO的方法。

方法2:采用指令信号的方法传输,模块A产生vld信号给模块B,模块B对vld进行同步化处理(打两拍)后,检测同步化信号的上升沿。需要注意的,VLD的信号是让模块B周期的三倍或以上。

  由于clka是100M,产生的vld是10ns,而clkb是300M,周期是3.33ns。所以模块A只要产生1个时钟的vld给模块B即可。

【问题9】模块A的时钟clka为300MHz,模块B的时钟clkb为100MHz。现在模块A要把32bit的数据送给模块B。模块A要如何发送,模块B要如何接收呢?

答:方法1:采用异步FIFO的方法。

  方法2:采用指令信号的方法传输,模块A产生vld信号给模块B,模块B对vld进行同步化处理(打两拍)后,检测同步化信号的上升沿。需要注意的,VLD的信号是让模块B周期的三倍或以上。

由于clka是300M,产生的vld是3.33ns,而clkb是100M,周期是10ns。所以模块A要产生10个时钟的vld给模块B。

【问题10】一块电路板上,有两个芯片,芯片A的时钟clka为100MHz,芯片B的时钟clkb为100MHz。现在芯片A要把32bit的数据送给芯片B。模块A要如何发送,模块B要如何接收呢?

答:方法1:采用异步FIFO的方法。

  方法2:采用指令信号的方法传输,模块A产生vld信号给模块B,模块B对vld进行同步化处理(打两拍)后,检测同步化信号的上升沿。需要注意的,VLD的信号是让模块B周期的三倍或以上。

虽然clka和clkb都是100M,但他们不是同一个晶振产生的,因此都是异步时钟。为了满足以上要求,所以模块A要产生3个时钟的vld给模块B。

【问题11】A, B时钟都是50M,但是他们不相关,为了防止编译器把他们默认为同一个时钟,是不是要用一个异步时钟组约束,来告诉编译器他们是不同的两个时钟?
答:一般分别产生A和B的时钟约束即可。

【问题12】 建立时间可以是负值吗?
答:建立时间当然可以是负数了。负数表示,可以在时钟上升沿后数据才变化。(建立时间是器件的属性,至于怎么器件怎么做到的,那就要问器件工程师了)

【问题13】 程序原本时序可以通过,加上singalTap节点之后时序不通过是什么原因
答:增加signaltap ILA等在线调试工具时,需要使用到内部的资源,例如RAM、选择器、寄存器等,增加后再去综合和布局布线。由于改变了资源,因此肯定对时序是有影响的,有可能改善了也有可能恶化了。如果时序有问题,分析路径,如果是在线调试工具路径,评估是否会有风险,没风险就算了

【问题14】时序约束什么时候要做?
答:1.在需要的时钟频率下,如果逻辑功能不稳定,那么就需要时序约束。   
  2.一般时钟大于100M的时候,我们就要做一下时序约束。


【问题15】时序约束建立时间和保持时间的生活案例。
答:可以想象,有一个人从家里出发去机场,搭乘13点的飞机。
   1. 13点起飞,起飞前15分钟要到机场,这个15分钟,就类似于建立时间要求。
   2. 机场每小时有要飞一趟飞机,每个小时表示的是时钟周期。
   3. 飞机起飞后,机场要保持10分钟,之后才能来下一批乘客,这个10分钟就是保持时间。
   4. 这个人出发去搭13点的飞机,因此他要在12点45分之前到机场,并且是12点10分之后到机场。既不能早到,也不能晚到机场。
   5. 如果这个人12点45分之后才到机场,那就搭不上本趟飞机,即违反了建立时间要求。(建立时间影响的是自己坐飞机)
   6. 如果这个人12点10分前就到了机场,那就会因此上一趟飞机的起飞,即违反了保持时间要求。(保持时间不满足,影响的是上一批乘客坐飞机)
   7. 这个人是计划去机场,因此他要估算几点能到机场。首先他会算所有情况下的最大延迟,如刚到路口红灯就来了、走路最慢等,在这种最慢的情况下,如果能在12点45分前到,说明建立时间没问题。然后,他会算所有情况下的最小延迟,如刚到路口绿灯,走路最快,在这种最快的情况下,如果能在12点10分后才,那说明保持时间没问题。


【问题16】为什么建立时间分析的时钟到达时间要加一个时钟周期而保持时间分析则不用呢?
答:因为建立时间是源寄存器发出数据,目的寄存器采集,也就是上一个时钟发出来,本时钟采集。这里有一个时钟周期的因素,所以要加1个时钟周期。

  而保持时间分析,则是“本个时钟”发出数据后,如果延时太小,会影响“本个时钟”对上一个数据的采集,因为不需要加1个时钟周期。

  另外,要注意一点,保持时间是跟时钟周期无关的。


【问题17】一个外部的信号,经过状态机的“组合逻辑”,这也要做同步处理吗?

答:需要做同步处理的。首先明白一点,FPGA里的时序逻辑=组合逻辑 + D触发器。组合逻辑的最终结果,还是要发D触发器的。所以还要做同步化处理的。


【问题18】时序约束什么时候要做?
答:1.在需要的时钟频率下,如果逻辑功能不稳定,那么就需要时序约束。   
   2.一般时钟大于100M的时候,我们就要做一下时序约束。


【问题19】时序约束建立时间和保持时间的生活案例。
答:可以想象,有一个人从家里出发去机场,搭乘13点的飞机。
    1. 13点起飞,起飞前15分钟要到机场,这个15分钟,就类似于建立时间要求。
    2. 机场每小时有要飞一趟飞机,每个小时表示的是时钟周期。
    3. 飞机起飞后,机场要保持10分钟,之后才能来下一批乘客,这个10分钟就是保持时间。

    4. 这个人出发去搭13点的飞机,因此他要在12点45分之前到机场,并且是12点10分之后到机场。

既不能早到,也不能晚到机场。

    5. 如果这个人12点45分之后才到机场,那就搭不上本趟飞机,即违反了建立时间要求。

(建立时间影响的是自己坐飞机)

    6. 如果这个人12点10分前就到了机场,那就会因此上一趟飞机的起飞,即违反了保持时间要求。

(保持时间不满足,影响的是上一批乘客坐飞机)

    7. 这个人是计划去机场,因此他要估算几点能到机场。首先他会算所有情况下的最大延迟,

  如刚到路口红灯就来了、走路最慢等,

  在这种最慢的情况下,如果能在12点45分前到,说明建立时间没问题。然后,他会算所有情况下的最小延迟,

  如刚到路口绿灯,走路最快,

  在这种最快的情况下,如果能在12点10分后才,那说明保持时间没问题。



【问题20】为什么建立时间分析的时钟到达时间要加一个时钟周期而保持时间分析则不用呢?

答:因为建立时间是源寄存器发出数据,目的寄存器采集,也就是上一个时钟发出来,本时钟采集。

  这里有一个时钟周期的因素,所以要加1个时钟周期。

  而保持时间分析,则是“本个时钟”发出数据后,如果延时太小,

  会影响“本个时钟”对上一个数据的采集,因为不需要加1个时钟周期。

  另外,要注意一点,保持时间是跟时钟周期无关的。


【问题21】请教下,做时序约束,做到这步时,这些都要勾选上吗? 

答:当然不是,要逐个分析确认,没有一选就全选上的道理。


【问题22】下面的生成时钟约束,是否一定要勾选?



答:这应该看生成时钟那一节视频,里面重点强调了“什么叫时钟”? 上面的图里,您应该要搞清楚,它被识别出时钟了,正不正常?如果是正常,那您肯定是要添加约束,定义频率吧。如果它不应该识别出时钟了,那您应该检查您的代码,看是不是代码不规范引起,或者有没有潜在的问题。

注意一下:约束不是目的,约束是为了查看报告,看设计有没有问题的。


【问题23】系统同步只可能是单沿采集?没法像DDR那样双沿采集?

答:系统同步也是可以是双沿采集的,但比较少。课程里,只是介绍了部分情形。

如果想看所有情形有哪些,可以打开VIVADO的时序约束向导,可以设置INPUT DELAY窗口查看。


【问题24】QUARTUS生成SDC时,默认出现的那条时钟约束是正常的么?我自己删掉就行了?

答:默认生成的当然是不正常。


   拓展阅读