FPGA时序约束学习

时序(timing)是与FPGA速度相关的三大指标之一,其余两个为延时(latency)和吞吐量(throughput),这三个指标是相互影响的,设计时需要权衡。如更高的吞吐量通常意味着更多的寄存器,这有可能会增加延时;更低的延时通常意味着更少的流水线(pipeline),更大的组合逻辑,这可能会降低系统工作频率。接下来就讲讲lattice芯片中与时序约束相关的东西吧,我也是初学者,有很多不足之处。

  • 一,时序要求与约束

首先,FPGA中的每个时钟域的时钟都需要设置一个频率,且都需要上时钟树;对于两个时钟域,如果它们之间关系不确定(如两个top层的时钟输入引脚;pll产生的时钟不需要,因为它们之间关系确定),需要确定它们之间的skew,否则diamond综合时不会分析这两个时钟域之间的路径。使用到两个语句:

1,FREQUENCY PORT “CLK” MHZ,该语句用于约束相应时钟的频率。

2,CLKSKEWDIFF CLKPORT "CLK2" CLKPORT "CLK1" NS,该语句用于建立两个时钟之间的关系,即时钟2滞后于时钟1多久。

其次,如果FPGA与板上其他设备通信,可能还需要约束IO口时序,分为输入和输出两种。下图是FPGA作为输入设备时,IO口需要考虑的时序。Input Delay为输入延时,即FPGA输入捕获到时钟上升沿到数据到达输入引脚的时间;Input Setup为输入建立时间,即数据到大FPGA引脚到下一个捕获时钟上升沿,两者相加等于1个时钟周期。它们两个的约束语句如下:

1,INPUT_SETUP PORT “INPUT” ,设置输入setup时间
             HOLD CLKPORT “CLK”,设置hold时间

2,INPUT_SETUP PORT “INPUT” INPUT_DELAY ,设置输入延时时间

      HOLD CLKPORT “CLK”,设置hold时间

FPGA时序约束学习_第1张图片

下图是FPGA作为输出设备时,需要考虑的约束。Clock_to_Out为启动时钟上升沿到数据从FPGA引脚输出的时间,Output Delay为数据从FPGA引脚输出到下一个启动时钟的上升沿,两者之和为一个时钟周期。它们两个的约束语句如下:

1,CLOCK_TO_OUT PORT “OUTPUT” ,设置CLOCK_TO_OUT时间
             MIN CLKPORT “CLK”,设置hold时间

2,CLOCK_TO_OUT PORT “OUTPUT” OUTPUT_DELAY ,设置OUTPUT_DELAY 时间
             MIN CLKPORT “CLK”,设置hold时间

FPGA时序约束学习_第2张图片

最后,时序约束还应考虑一些特殊情况。例如对于一些电源口、接地口,可能不需要分析它们的时序,这时可以使用block,将net或者path屏蔽掉,不做时序分析。又例如对于两个寄存器之间,需要多个时钟周期才能稳定的情况,即多周期路径,可以使用multicycle放宽约束条件,而不是以一个周期作为约束。具体multicycle用法可以参考diamond的help文档。

  • 二,解决时序问题的方法

 首先,写RTL代码时,应该采用规范的代码风格。如设计时应遵循至上而下的准则 , top层尽量只包含模块例化和信号声明;子模块输出尽量register;子模块间的耦合尽量小,这样方便模块修改;组合逻辑应避免latch产生;如果条件相对独立,尽量使用case语句,而不要使用if语句;组合逻辑不要太大,适当采用流水线设计;尽量少使用门控时钟,用使能信号替代门控时钟;尽量不要使用原语去搭建分布式ram;乘法计算时尽量使用三级流水的形式,第一级取值,第二级乘法,第三级输出;对于顶层IO口,为了保证数据进入或输出FPGA时的一致性,可以考虑使用IO寄存器;采用ebr的地方,输出寄存应该开启。

 然后,阅读map trace的时序报告。主要关注路径覆盖率是否在95%以上以及时序不过的地方。map trace报告是lattice采用理想的算法分析布局布线时序,其中延时都是固定的,并不是按实际计算的,主要看看RTL代码逻辑深度有没有问题。

最后,阅读par trace的时序报告。主要看一下时钟资源使用是否合理以及时序不过的地方。需要确认时钟资源不要超过芯片的时钟树资源。对于时序不过的地方,首先看看路径中哪一块延时最大,然后去优化代码。如对于扇出太大的地方,可以考虑用syn_maxfan控制扇出;对于使用分布式移位寄存器的地方,可以考虑用syn_srlstyle控制使用register去搭建;对于无需使用dsp的运算,可以考虑用syn_multstyle设置其运算用逻辑实现;对于时钟使能信号造成的延迟(lattice里pfu单元,ce信号的延时大于数据),可用syn_useenables禁止使用寄存器时钟使能。

你可能感兴趣的:(Lattice学习)