原创 【博客大赛】【原创】TimeQuest约束外设之ddio的潜规则

2012-3-8 20:47 3706 12 15 分类: FPGA/CPLD

 

最近调试了下altera里的ddio模块,在Timequest约束ddio_out输出时,遇到了一个其实不算是问题的问题。
ddio_out模块如图1所示。
ddio.jpg
图1
DH和DL在clk上升沿采样,时钟的高电平随即使能DH通道输出高位数据,下降沿到来时使能DL通道输出低位数据,这样就实现了数据的双边沿输出。
 
为了实现ddio_out的数据和时钟的源同步,必须要对输出ddr_out进行约束,简化后工程如图2所示。
系统图.jpg
图2
整个约束过程和其他外设类似,详情可以查看http://bbs.ednchina.com/BLOG_ARTICLE_3002035.HTM。首先创建衍生时钟,然后set output delay from衍生时钟 to ddr_out,最后查看输出的建立保持余量。
 
奇怪的事情发生了,Timing报告里只有从sysclk (pll_inst|altpll_component|auto_generated|pll1|inclk[0]其实就是sysclk,下文都用sysclk代替) 到ddr_out的路径,如图3所示。按经验,约束一个系统的输出延迟,Timequest会自动列出输出寄存器的路径,ddio_out模块的输出寄存器有DH和DL,但是DHDL到ddr_out的时序路径报告哪去了呢?
时序分析.jpg
图3
查看set false path,是否有将data_l和data_h到输出设为伪路径,结果sdc文件里没有关于ddio的伪路径。
查看Technology map viewer,DHDL寄存器是否被优化了,结果两个寄存器都还健在。
更改时序报告生成方式,试了Report Setup Summary、Report ALL I/O Timings...结果都一样。
最后换工程、换quartus 11(当前是9.1)、换电脑...就差没换人品了,Timing报告就是不显示DHDL的输出路径。
 
对我非常确定及其肯定的经验,最终,还是妥协了,现在从头开始分析ddio_out的工作本质。Technology map viewer sysclk分析唯一的线索从sysclk到ddr_out的路径,如图4所示。源寄存器不在ddio里,而在pll模块里,Timequest将这条看似毫无关联的路径认为是影响ddr_out输出延迟的关键路径,嗯,这个问题开始有点意思。
pll路径.jpg
图4
绘制出ddio_out的时序图如图5所示,sysclk和sysclk(sel)为同一个时钟,都由pll驱动,前者为DH和DL的采样时钟,后者控制选择器的选择端,由于路径不同,存在一定的sysclk_skew,Tco为约束对象ddr_out的输出延迟。
d1.jpg
图5
 
假设改变DL、DH的输出dataout_ldataout_h的路径延迟,保持sysclk(sel)的延迟不变,ddr_out延迟会怎么变化呢?结果如图6所示,ddr_out的输出延迟没有变化。
 
d2.jpg
图6
假设保持图6中的dataout_ldataout_h的路径延迟,增大sysclk和sysclk(sel)的延迟sysclk_skew,ddr_out还会不变吗?结果如图7所示,ddr_out的输出延迟变大了。
d3.jpg
图7
从上述3个图的假设和结果可以证明,sysclk(sel)才是真正的关键路径,决定了ddr_out的输出延迟,而dataout_ldataout_h的路径应该就是伪路径了,所以Timequest只显示出这条路径信息,但是伪路径为什么没有出现在sdc文件的set false path呢? 我的回答是:它们不能算是伪路径。
 
dataout_ldataout_h的路径延迟虽然不会影响输出延迟,但会改变输出数据,如图8所示,同时增大dataout_ldataout_h的路径延迟,输出数据变混乱了,由于dataout_h延迟过大,在sysclk(sel)的高电平的前半阶段,仍然会输出上一个高位数据,dataout_l延迟过大也导致低电平阶段前期会输出了上一个低位数据。
d4.jpg
图8
数据混乱,当然不是我们所期望的,所以dataout_ldataout_h的路径肯定还是要被约束的,既然在Timequest里都没有显示,我们肯定是没法操作了,那最大的可能就是被潜规则了,Timequest自己完成了这两条路径的约束,可以从图8推测出这条潜规则:0 < Tco_datah < sysclk_skew,sysclk_skew< Tco_datal < T/2。
 
综上所述,推测Timequest约束ddio_out输出延迟的过程:
1.根据约束要求,改变sysclk到ddr_out的路径延迟,满足约束要求。
2.潜规则,sysclk到ddr_out的路径延迟确定后,sysclk_skew也就定了,约束ddio_out的Dl,DH寄存器满足0 < Tco_datah < sysclk_skew,sysclk_skew< Tco_datal < T/2,保证输出数据正确。
 
为了简化用户的操作,Timequest内部还会有很多类似的潜规则约束。虽然无法得知DH、DL被潜规则后的心情是否和XXX一样无奈,只希望大家在遇到此类问题,不用再纠结了。
 
PARTNER CONTENT

文章评论3条评论)

登录后参与讨论

用户377235 2014-8-2 15:45

好多图都看不到了,这可如何是好?

用户403664 2012-3-12 15:50

图文并茂,很详细!谢谢分享!

用户1458878 2012-3-10 14:44

很好
相关推荐阅读
用户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怎么会分不清呢,字...
我要评论
3
12
关闭 站长推荐上一条 /4 下一条