这种路径的约束是为了让FPGA设计工具能够尽可能的优化从输入端口到第一级寄存器之间的路径延迟,使其能够保证系统时钟可靠的采到从外部芯片到FPGA的信号。约束名称:input delay. 约束条件的影响主要有4个因素:外部芯片的Tco,电路板上信号延迟Tpd,FPGA的Tsu, 时钟延迟Tclk. Tco的参数通常需要查外部芯片的数据手册。计算公式:input delay = Tco+Tpd+Tsu-Tclk. FPGA的Tsu也需要查FPGA芯片的手册。 FPGA速度等级不同,这个参数也不同。 Tpd和Tclk需要根据电路板实际的参数来计算。通常,每10cm的线长可以按照1ns来计算. 例如:系统时钟100MHz, 电路板上最大延迟2ns, 时钟最大延迟 1.7ns, Tco 3ns, FPGA的Tsu(触发器固有的建立时间)为0.2ns. 那么输入延迟的值: max Input delay = 2+3+0.2-1.7=3.5ns. 这个参数的含义是指让FPGA的设计工具把FPGA的输入端口到第一级寄存器之间的路径延迟(包括门延迟和线延迟)控制在 10ns-3.5ns=6.5ns 以内。这个3.5ns在quartus timequest中的约束就是input delay。这个6.5ns在xilinx的约束中就是OFFSET IN。具体写法依约束参考对象不同有两种,NET DATA_IN OFFSET = IN 3.5ns AFTER CLK(这个clk是launch clk);NET DATA_IN OFFSET = IN 6.5ns BEFORE CLK(这个clk明显是latch clk了)。
这种路径的约束是为了让FPGA设计工具能够优化FPGA内寄存器到寄存器之间的路径,使其延迟时间必须小于时钟周期,这样才能确保信号被可靠的传递。由于这种路径只存在于FPGA内部,通常通过设定时钟频率的方式就可以对其进行约束。对于更深入的优化方法,还可以采用对寄存器的输入和寄存器的输出加入适当的约束,来使逻辑综合器和布线器能够对某条路径进行特别的优化。还可以通过设定最大扇出数来迫使工具对其进行逻辑复制,减少扇出数量,提高性能。
这种路径的约束是为了让FPGA设计工具能够优化FPGA内部从最后一级寄存器到输出端口的路径,确保其输出的信号能够被下一级芯片正确的采到。约束的名称: output delay, 约束条件的影响主要有3个因素:外部芯片的Tsu,电路板上信号延迟Tpd,时钟延迟Tclk. Tsu的参数通常需要查外部芯片的数据手册。计算公式:output delay = Tsu+Tpd-Tclk. 例如:系统时钟100MHz, 电路板上最大延迟2ns, 时钟最大延迟 1.7ns, Tsu 1ns, 输出延迟的值: max output delay = 1+2-1.7=1.3ns . 这个参数的含义是指让FPGA的设计工具把最后一级寄存器到输出端口之间的路径延迟(包括门延迟和线延迟)控制在 10ns-1.3ns=8.7ns 以内。
这种路径是指组合逻辑的延迟,指信号从输入到输出没有经过任何寄存器。给这种路径加约束条件,需要虚拟一个时钟,然后通过约束来指定哪些路径是要受该虚拟时钟的约束。在Synplifypro和Precision中都有相应的约束来处理这种路径。
8.对自己在做的一个工程,原先什么约束都没有加,运行结果会偶尔出现读写SRAM出错的情况,有时候加上chipscope反而没错了,稍作改动综合之后结果也不一样。再遇到这样的情况,肯定就能知道是关键路径的时序问题。就加了一个全局时钟的约束,它是DCM的输入。经过PR以后,看它的STA,发现提示了几个路径的错误,其中有一条就是从PC104接口过来的地址送到我内部一个模块的时候路径的setup time不满足,slack为负。slack是时序余量,是用周期减去时序通路上消耗的时间,正的为满足时序要求,负的就表示不满足。有网友说了几个改正的方案:
1)修改PR的布局布线策略,比如改成时间优化,允许duplication(禁止逻辑优化)等
2) 加强placement constraint
5)使用floorplanner
以上几点不需要修改设计。如果还不行就要优化code了。
3)减少fanout (尤其中间的组合逻辑)
4)插入额外的flip-flop等。
本项目实际的修改就是在中间将逻辑打断,加了一级flip-flop。然后就不报timing error了。
9.一般同一个时钟域的话不用考虑hold time,因为tco+tdelay>t_hold肯定可以满足,就算是加上始终偏斜,那么应该满足tco+tdelay-tpd>t_hold也是没有问题的,因为tdelay跟tpd和thold比不一个等级的。
三、详细看了一下ISE生成的timing report,做以下分析。
1.只做了一个输入全局时钟的约束,经过DCM以后生成三个时钟,一个CLK0,一个八倍频的时钟和一个八分频的时钟。timing report以时钟为条件分了四个部分做分析。
2.每一部分基本包括两个方面,一个是component switching limit,还有一个就是路径的分析。其中component switching limit是跟器件相关的,对输入时钟的占空比有一个容忍的范围,参数值包括低电平最低持续多长时间(low pulse limit)和高电平最低持续多长时间(high pulse limit),而这个两个值根据输入时钟的大小是有变化的,这个都是器件固有的特性。
3.路径的分析呢,分为setup和holdup进行分析,如果有不满足时序要求的路径(slack为负)那么就列出来,如果这个时钟下没有不满足时序要求的路径,那么同样会列出三个最坏情况的路径,setup的三个,holdup的三个。
这种路径的约束是为了让FPGA设计工具能够尽可能的优化从输入端口到第一级寄存器之间的路径延迟,使其能够保证系统时钟可靠的采到从外部芯片到FPGA的信号。约束名称:input delay. 约束条件的影响主要有4个因素:外部芯片的Tco,电路板上信号延迟Tpd,FPGA的Tsu, 时钟延迟Tclk. Tco的参数通常需要查外部芯片的数据手册。计算公式:input delay = Tco+Tpd+Tsu-Tclk. FPGA的Tsu也需要查FPGA芯片的手册。 FPGA速度等级不同,这个参数也不同。 Tpd和Tclk需要根据电路板实际的参数来计算。通常,每10cm的线长可以按照1ns来计算. 例如:系统时钟100MHz, 电路板上最大延迟2ns, 时钟最大延迟 1.7ns, Tco 3ns, FPGA的Tsu(触发器固有的建立时间)为0.2ns. 那么输入延迟的值: max Input delay = 2+3+0.2-1.7=3.5ns. 这个参数的含义是指让FPGA的设计工具把FPGA的输入端口到第一级寄存器之间的路径延迟(包括门延迟和线延迟)控制在 10ns-3.5ns=6.5ns 以内。这个3.5ns在quartus timequest中的约束就是input delay。这个6.5ns在xilinx的约束中就是OFFSET IN。具体写法依约束参考对象不同有两种,NET DATA_IN OFFSET = IN 3.5ns AFTER CLK(这个clk是launch clk);NET DATA_IN OFFSET = IN 6.5ns BEFORE CLK(这个clk明显是latch clk了)。
这种路径的约束是为了让FPGA设计工具能够优化FPGA内寄存器到寄存器之间的路径,使其延迟时间必须小于时钟周期,这样才能确保信号被可靠的传递。由于这种路径只存在于FPGA内部,通常通过设定时钟频率的方式就可以对其进行约束。对于更深入的优化方法,还可以采用对寄存器的输入和寄存器的输出加入适当的约束,来使逻辑综合器和布线器能够对某条路径进行特别的优化。还可以通过设定最大扇出数来迫使工具对其进行逻辑复制,减少扇出数量,提高性能。
这种路径的约束是为了让FPGA设计工具能够优化FPGA内部从最后一级寄存器到输出端口的路径,确保其输出的信号能够被下一级芯片正确的采到。约束的名称: output delay, 约束条件的影响主要有3个因素:外部芯片的Tsu,电路板上信号延迟Tpd,时钟延迟Tclk. Tsu的参数通常需要查外部芯片的数据手册。计算公式:output delay = Tsu+Tpd-Tclk. 例如:系统时钟100MHz, 电路板上最大延迟2ns, 时钟最大延迟 1.7ns, Tsu 1ns, 输出延迟的值: max output delay = 1+2-1.7=1.3ns . 这个参数的含义是指让FPGA的设计工具把最后一级寄存器到输出端口之间的路径延迟(包括门延迟和线延迟)控制在 10ns-1.3ns=8.7ns 以内。
这种路径是指组合逻辑的延迟,指信号从输入到输出没有经过任何寄存器。给这种路径加约束条件,需要虚拟一个时钟,然后通过约束来指定哪些路径是要受该虚拟时钟的约束。在Synplifypro和Precision中都有相应的约束来处理这种路径。
8.对自己在做的一个工程,原先什么约束都没有加,运行结果会偶尔出现读写SRAM出错的情况,有时候加上chipscope反而没错了,稍作改动综合之后结果也不一样。再遇到这样的情况,肯定就能知道是关键路径的时序问题。就加了一个全局时钟的约束,它是DCM的输入。经过PR以后,看它的STA,发现提示了几个路径的错误,其中有一条就是从PC104接口过来的地址送到我内部一个模块的时候路径的setup time不满足,slack为负。slack是时序余量,是用周期减去时序通路上消耗的时间,正的为满足时序要求,负的就表示不满足。有网友说了几个改正的方案:
1)修改PR的布局布线策略,比如改成时间优化,允许duplication(禁止逻辑优化)等
2) 加强placement constraint
5)使用floorplanner
以上几点不需要修改设计。如果还不行就要优化code了。
3)减少fanout (尤其中间的组合逻辑)
4)插入额外的flip-flop等。
本项目实际的修改就是在中间将逻辑打断,加了一级flip-flop。然后就不报timing error了。
9.一般同一个时钟域的话不用考虑hold time,因为tco+tdelay>t_hold肯定可以满足,就算是加上始终偏斜,那么应该满足tco+tdelay-tpd>t_hold也是没有问题的,因为tdelay跟tpd和thold比不一个等级的。
三、详细看了一下ISE生成的timing report,做以下分析。
1.只做了一个输入全局时钟的约束,经过DCM以后生成三个时钟,一个CLK0,一个八倍频的时钟和一个八分频的时钟。timing report以时钟为条件分了四个部分做分析。
2.每一部分基本包括两个方面,一个是component switching limit,还有一个就是路径的分析。其中component switching limit是跟器件相关的,对输入时钟的占空比有一个容忍的范围,参数值包括低电平最低持续多长时间(low pulse limit)和高电平最低持续多长时间(high pulse limit),而这个两个值根据输入时钟的大小是有变化的,这个都是器件固有的特性。
3.路径的分析呢,分为setup和holdup进行分析,如果有不满足时序要求的路径(slack为负)那么就列出来,如果这个时钟下没有不满足时序要求的路径,那么同样会列出三个最坏情况的路径,setup的三个,holdup的三个。