原创 【博客大赛】换位思考多周期约束(上)

2012-4-27 09:46 2625 13 15 分类: FPGA/CPLD

 

在开篇前先推荐两篇文档,一篇是altera的官方文档 Appling Multicycle Execptions in the TimeQuest Timing Analyzer ,另一篇是riple兄很早之前推荐过的Multicycles Exception Between Two Synchronous Clock,这两篇都是关于多周期约束很好的上手文档,虽然可以快速上手解决当务之急,但事后不免还会有些疑惑。TimeQuest中的多周期约束语法的设置选项有:基于setup(建立时间)的个数,基于hold(保持时间)的个数,start模式和end模式,如下所示。
 
set_multicycle_path -setup -start from  [get_clocks {clk_s}]  to  [get_clocks {clk_r}]  2
set_multicycle_path -hold  -end  from  [get_clocks {clk_s}]  to  [get_clocks {clk_r}]  2
 
但在使用过程中,为什么有时只设置基于建立时间的多周期个数就可以了?而为什么有时建立时间和保持时间的多周期个数都要设置?保持时间设置和建立时间设置存在什么依赖关系?为什么会有start和end两种模式,分别在什么情况下使用?我们是TimeQuest的用户,用户使用产品时只会去关心自己的需求,而用户成千上万,需求也千奇百怪,产品设计者为了满足所有用户,必须提高产品的通用性,最简单的方法就是增加选项模式,当一个需求简单的用户使用这个通用产品时,面对多重的选择和模式,往往会无从下手,因为根本就不知道这些选项设置的作用,自然就会产生上述的那些为什么。要解答这些为什么,我们可以试着换位思考,从TimeQuest设计者的角度出发,如何设计多周期约束的语法规则?
 
明确设计目的
 
先来看看一个最常见的发送接收波形如图一所示,A时刻发送的数据B时刻锁存,launch(发送)边沿和latch(锁存)边沿间隔为一个时钟周期。
1.jpg
图一
 
这种情况下,建立时间和保持时间裕量为
setup slack = (current latch edge - current launch edge ) + Tskew - (Tdelay + Tco + Tsu) 
                 = T + Tskew - (Tdelay + Tco + Tsu)  
hold  slack  = Tdelay + Tco - (Th + previous latch edge - current launch edge)
                    = Tdelay + Tco - Th
其中Tskew是时钟偏斜,Tdelay为传输延迟,Tco为源寄存器的输出延迟,Tsu和Th为寄存器需要的建立保持时间。
 
如果接收波形整体延迟一个时钟周期,如图二所示,latch边沿改变了,A时刻发送的数据C时刻锁存,B时刻发送的数据D时刻锁存。
2.jpg
图二
 
此时,我们期望的建立时间和保持时间裕量为
setup slack  = (current latch edge - current launch edge ) + Tskew - (Tdelay + Tco + Tsu)   
                 = 2*T + Tskew - (Tdelay + Tco + Tsu)
hold  slack  = Tdelay + Tco - (Th + previout latch edge - current launch edge)
                 = Tdelay+Tco - (T+Th)
 
和前一种情况比较,建立时间裕量宽裕了一个周期,保持时间裕量缩紧了一个周期,但TimeQuest并不知道latch边沿变了,如果不进行多周期约束,仍按照前一种情况的裕量去约束,结果就会使得建立时间多了没必要的裕量,而保持时间的裕量可能不足。所谓的多周期是相对单周期而言的,launch和latch默认间隔为单周期,当launch和latch间隔为多个周期时,就需要用到多周期约束了,一个完整的时序分析路径是由Tskew、Tco、Tdelay、Tsu、Th以及launch时刻和latch时刻等共同决定的,后两项会随着用户不同的需求而改变,TimeQuest无法自动获得,所以多周期约束语法规则设计的目的就是准确的告诉TimeQuest波形何时launch何时latch,进行适当的建立保持约束。
 
明确TimeQuest的需求
 
我们已经知道了TimeQuest无法自己获取launch时刻和latch时刻,必须由用户提供,那么TimeQuest具体需要哪些信息才能完全了解发送接收波形呢?
 
举一个典型的多周期波形,如图三所示,A时刻发送的数据B时刻锁存,B时刻发送的数据C时刻锁存,A为current launch,B即为current latch又是next launch,C是next latch。
3.jpg
图三
 
图三的发送接收关系,我们可以表示为下面几个式子:
current latch   - current launch = 2个时钟周期
current latch   - next launch     = 0个时钟周期
previous latch - current launch     = 0个时钟周期
 
由于波形的周期性,后两个表达式是完全等效的,图二的发送接收关系同样可以表示为:
current latch   - current launch = 2个时钟周期
current latch   - next launch     = 1个时钟周期
previous latch - current launch     = 1个时钟周期
 
将这几个表达式推广到更多不同的例子,会发现只要知道了current launch、current latch、next launch和previous latch就能确定任何形式的发送接收波形,因此TimeQuest只需获得这四个量,也就清楚波形的真实情况了。
 
明确用户的需求
 
假设用户的波形如图二所示,相比常见的图一单周期波形,建立时间宽裕了一个周期,而保持时间紧缩了一个周期,作为用户,其实并不关心current launch、current latch、next launch和previous latch这些量,只会关注如何把变化了的建立保持关系告知TimeQuest,让其在该放松的地方放宽约束,该紧缩的地方加强约束。
-------------------------------------------------------------------------------------------------------------
由于博客字数限制,还有整合TimeQuest和用户的需求,消除不确定性,等更多精彩内容放到“换位思考多周期约束(下)”中,点击这里http://bbs.ednchina.com/BLOG_ARTICLE_3003478.HTM
PARTNER CONTENT

文章评论2条评论)

登录后参与讨论

用户419742 2012-5-8 20:54

谢谢,欢迎交流。

ashly0903_595850101 2012-5-8 15:54

分析得很透彻,受益了,非常感谢
相关推荐阅读
用户419742 2016-06-16 11:06
【博客大赛】cache,你给我听话点
在上一篇“为什么程序越优化越慢?”里,详述了程序指令在cache里发生冲突后另运行效率变的完全不可预测的问题,并提出了两种将不老实的cache变乖的良方。本以为cache已经完全被驯服了,没过多久...
用户419742 2013-05-14 20:57
[博客大赛]程序为什么越优化越慢?
正在开发一个基于Nios II内核的项目,使用的开发环境是nios for eclipse,编译器是GCC,整体功能实现后,开始优化速度。默认没有开启gcc的优化选项,一段关键函数Key的运行...
用户419742 2012-06-13 21:33
再诡异的现象背后可能只是一个傻x的低级错误——谈调试心态
  今天调试一个小模块,FPGA的24号引脚作为输入端,在此引脚上外部给一个恒定的0电平,理论上程序应该一直读为0电平,在开机的前10s,程序内部读取该引脚为0,可是10s后始终读取为1...
用户419742 2012-06-02 20:07
【博客大赛】马克思教我们优化时序之补全if else
  时序优化中重要的一项就是提高模块的最高工作频率,工作频率由关键路径决定,通常的提高工作频率的步骤是:利用时序分析工具找到关键路径,分析关键路径主要延迟是布线延迟还是逻辑延迟,然后再轮番十八...
用户419742 2012-05-24 21:09
【博客大赛】TimeQuest约束外设之诡异的Create Generated Clocks用法
最近在altera FPGA里设计一个外设的驱动模块,模块本身逻辑很简单如下图所示,但是模块和外设之间的时序约束问题搞的很头疼,今天先讲讲总结的一些Timequest下外设约束方法,特别是那毫无用...
用户419742 2012-05-18 20:45
【博客大赛】TimeQuest之delay_fall clock_fall傻傻分不清楚
  这篇我想分享一个之前在用TimeQuest约束双边沿模块的input delay时犯得一个错误,有人看了可能会觉得傻傻的,什么眼神,delay_fall和clk_fall怎么会分不清呢,字...
我要评论
2
13
关闭 站长推荐上一条 /3 下一条