【精品博文】关于时序约束的一点总结
SDRAM数据手册有如张时序要求图。
如何使SDRAM满足时序要求?
方法1:添加时序约束。由于Tpcb和时钟频率是固定的,我们可以添加时序约束,让FPGA增加寄存器延时、寄存器到管脚的延时,从而使上述满足建立时间和保持时间要求。
方法2:添加随路时钟
如上图所示,信号a是在时钟clk时钟域产生的信号。sdram_clk是与clk同源、频率相同、相位不同的时钟信号。当sdram_clk输出作为sdram的工作时钟,通过调整sdram_clk的相位就能调整时序,从而满足建立时间和保持时间的要求。
那么sdram_clk如何产生呢?可以通过PLL来产生,PLL可以保证频率相同、相位偏移量,所以该系统的结构如图:
晶振过来的fpga_clk经过PLL,产生两个时钟clk和sdram_clk,clk作为sdram接口模块的工作时钟,而sdram_clk则直接送给SDRAM,作为SDRAM的工作时钟。
以上2种方法有什么优缺点?如何取舍?
方法1是比较正规的传统方法,不用再产生时钟。但调试起来麻烦,这是由于时钟约束是比较飘渺的东西,不知道有没有起作用(也有可能自己约束错了而不知道,也有可能约束太紧而满足不了)。
方法2调试起来简单,PLL设置简单,出错可能性小。通过不断调整相位,最终肯定可以正确通信。缺点也明显,接口一多,每个都要做随路时钟就浪费了。
最近一直在做时序约束,总结一下时序约束过程。
(1)根据时序约束报告找到相关路径。看是什么原因导致的违规。违规的原因有可能是路径本身需要多周期约束,或者程序代码if嵌套太多,判断条件太长,组合逻辑乱用等。如果是代码问题,看是否能优化设计。能够通过TimeQuest发现时序的不足,重新优化自己的设计,而不是一味的改变约束命令,这才是TimeQuest存在的最大意义
(2)像SDRAM,DDR,MAC核这种设计,可以通过PLL位移时钟,达到改变输入输出延时的效果
其他总结:
get_registers 对应多周期约束;
get_ports 对应时钟约束
get_nets 对应IO约束
get_clocks 对应跨时钟约束
做时序约束还是要多参考官方文档,多做一些官方的参考设计,细心,耐心优化自己的设计。做了时序约束,才发现自己原来的设计有很多不合理的地方,有些逻辑设计一定要注意。