易灵思提供了相关时序约束的PPT,内容非常全面,但是我们还是发现很多客户在使用Efinity时,时序约束存在很多问题。
添加约束
添加约束的目的是为了告诉FPGA你的设计指标及运行情况。在上面的生成约束之后,在Result àxx.sdc中提供约束参考(请注意该文件不能直接添加到工程中,需要热复制到别的指定目录或者新建自己的SDC文件添加到工程)。
![图片[1]-时序约束实操-易灵思(Elitestek)社区-FPGA CPLD-ChipDebug](http://chipdebug.com/wp-content/uploads/2024/10/20241019144223193-01729320143.png?v=1729320143)
编译完成之后可以查看时序报告,也可以通过routing àxx.timing.rpt来查看路径详细延时信息,如果想查看更可以通过指令来打印或者通过print_critical_path来控制打印的路径数量 。
时钟约束
(1)通过IO输入的gclk。
如下图,因为时钟是通过外部IO输入的,所以FPGA并不知道这个时钟频率是多少。打开.pt.sdc可以看到提供相关约束参考。
![图片[2]-时序约束实操-易灵思(Elitestek)社区-FPGA CPLD-ChipDebug](http://chipdebug.com/wp-content/uploads/2024/10/20241019144224246-91729320144.png?v=1729320145)
我们只需要补充相关的时钟周期即可以使用。
![图片[3]-时序约束实操-易灵思(Elitestek)社区-FPGA CPLD-ChipDebug](http://chipdebug.com/wp-content/uploads/2024/10/20241019144226968-91729320146.png?v=1729320146)
比如,我们要约束adc_clk_in为100M:
create_clock -period 10.000
(2)PLL的输出的时钟约束 。
因为PLL的输入输出频率都是设置好的,所以软件可以检测到。如下图,输入输出时钟频率都是30MHz.
![图片[4]-时序约束实操-易灵思(Elitestek)社区-FPGA CPLD-ChipDebug](http://chipdebug.com/wp-content/uploads/2024/10/20241019144227239-41729320147.png?v=1729320147)
在pt.sdc文件中会提供相应的约束 。
create_clock -period 33.3333 pll_inst1_CLKOUT0
在时钟约束完成之后,可以查看Routing –>.timing.rpt文件中所有的时钟是否都进行了完整的约束 。
![图片[5]-时序约束实操-易灵思(Elitestek)社区-FPGA CPLD-ChipDebug](http://chipdebug.com/wp-content/uploads/2024/10/20241019144228485-81729320148.png?v=1729320149)
IO约束
首先我们要了解易灵思的架构是core和interface分开的,相对于core,interface内部的GPIO,LVDS,JTAG及其它都是外设。所以所有针对于input_delay和outpu_delay的约束都是针对于interface的。至于FPGA对于我们平时理解的外设,比如FPGA外部连接一片AD/DA,这种是没有办法约束的。
![图片[6]-时序约束实操-易灵思(Elitestek)社区-FPGA CPLD-ChipDebug](http://chipdebug.com/wp-content/uploads/2024/10/20241019144229715-11729320149.png?v=1729320150)
在pt.sdc文件中可以看到关于set_input_delay和set_output_delay的约束。可以看到有些约束是已经屏蔽,那是因为添加的IO没有打开寄存器。
![图片[7]-时序约束实操-易灵思(Elitestek)社区-FPGA CPLD-ChipDebug](http://chipdebug.com/wp-content/uploads/2024/10/20241019144231390-11729320151.png?v=1729320152)
如下图,易灵思建议把所有IO都添加上IO寄存器。
![图片[8]-时序约束实操-易灵思(Elitestek)社区-FPGA CPLD-ChipDebug](http://chipdebug.com/wp-content/uploads/2024/10/20241019144232290-81729320152.png?v=1729320153)
有的客户会有疑问,clock的PIN Name是什么?其实就是与core内连接的寄存器用什么时钟,interface中就用什么时钟。
![图片[9]-时序约束实操-易灵思(Elitestek)社区-FPGA CPLD-ChipDebug](http://chipdebug.com/wp-content/uploads/2024/10/20241019144233731-81729320153.png?v=1729320154)
(3)跨时钟域约束
在保证程序上对跨时钟域做了处理之后,约束上要对跨时钟进行约束 。跨时钟约束的语法是set_clock_groups或者set_false_path,关于用于网上很多,可以自行查找。
set_clock_groups -asynchronous -group {jtag_inst1_TCK jtag_inst1_DRCK}
在所有时钟约束完成之后要保证时序报告的slack都为正值。
![图片[10]-时序约束实操-易灵思(Elitestek)社区-FPGA CPLD-ChipDebug](http://chipdebug.com/wp-content/uploads/2024/10/20241019144235569-21729320155.png?v=1729320155)
编译完成之后可以查看时序报告,也可以通过routing àxx.timing.rpt来查看路径详细延时信息
如果时序上还有违例,在result–> Routing–>timing.rpt文件中查看具体的路径。根据路径来解决具体的时序问题。
![图片[11]-时序约束实操-易灵思(Elitestek)社区-FPGA CPLD-ChipDebug](http://chipdebug.com/wp-content/uploads/2024/10/20241019144236538-81729320156.png?v=1729320156)
如果想查看更可以通过指令来打印或者通过print_critical_path来控制打印的路径数量 。
![图片[12]-时序约束实操-易灵思(Elitestek)社区-FPGA CPLD-ChipDebug](http://chipdebug.com/wp-content/uploads/2024/10/20241019144237178-61729320157.png?v=1729320157)
也可以通过report_timing来报告具体的时序路径及数量。
![图片[13]-时序约束实操-易灵思(Elitestek)社区-FPGA CPLD-ChipDebug](http://chipdebug.com/wp-content/uploads/2024/10/20241019144238659-81729320158.png?v=1729320158)
先打开Tcl Command Console,如果Show/Hide Tcl command Console是灰色的,要先点击Load Place and Route Data加载布局和布线的数据。
![图片[14]-时序约束实操-易灵思(Elitestek)社区-FPGA CPLD-ChipDebug](http://chipdebug.com/wp-content/uploads/2024/10/20241019144239466-11729320159.png?v=1729320159)
打开Tcl command consolel,使用report_timing命令来查看需要的路径。
![图片[15]-时序约束实操-易灵思(Elitestek)社区-FPGA CPLD-ChipDebug](http://chipdebug.com/wp-content/uploads/2024/10/20241019144240763-11729320160.png?v=1729320161)
具体report_timing的用法,请参考Efinity® Timing Closure User Guide.pdf。





没有回复内容