RTL的设计完成以后,用EDA软件跑完所有的流程。我们需要检查时序报告来确保设计的可用性。那么在检查时序报告的时候,我们要注意哪些事情呢?
有的人可能认为我只要看时序报告里是不是所有的时序都满足了,我的设计就算合格了。这是个误区。时序报告满足不能代表你的设计没有时序问题,我们也看到过一些设计,明明时序报告是挺好的,但上板子运行起来就是有问题。这说明我们在检查时序报告的时候有些重要的东西被遗漏了。
所以拿到一个设计和它的时序报告,我们还要检查以下几个方面:
-
设计约束的精确性
-
约束的覆盖率
-
设计约束是否留有余量
设计约束必须要与系统实际的运行情况一致,而不是越高越好。不合适的设计约束反而会带来更差的布局布线效果。约束的覆盖率是很多设计者容易忽略的问题。时序报告只是对你的设计约束进行报告,如果设计中的路径没有约束,在时序报告里是体现不出来这部分延时的。而没有被约束的路径在布局布线的时候软件也不会对其优化。系统运行的时候这一部分的延时就成为未知数,对运行结果可能会产生不可预料的影响。因为硬件系统运行的有些信号指标不是FPGA/CPLD可控的,比如输入时钟的Jitter。FPGA/CPLD只能假定输入的是个完美的时钟,Jitter为0。我们在做约束的就要适当的增加约束的余量,以抵消这些不确定性对性能的影响。
如果一个设计布局布线能通过,但timing不满足,我们需要做下面这些工作:
-
看看能否把一些设计约束做的宽松一些,只要能满足实际系统的要求就好。
-
添加一些可以是时序宽松的约束,比如Block或Multicyle。
-
检查约束的覆盖率,特别是跨时钟域的约束。
-
查一查有没有一些约束是“陷阱”,造成约束目标难以实现。
-
优化RTL代码。
-
运行多个布局布线已达到更好的效果。
如果一个设计连布局布线都通不过,我们就要进一步的修改设计了,或者让布局布线的约束更宽松些,或者减少设计中的信号连线。首先要保证设计能够布通,我们才能进行时序优化。
通过RTL改善时序的几个技巧之移位操作
随着讨论的深入,我们将更多的讨论一些技术实现上的细节问题。我争取能在更通用的层面上探讨时序问题。但具体描述的过程不可避免的会牵扯到器件的细节。正如我们前面说过的,你的设计和实际的器件和软件拟合度越好,你越能得到一个满意的时序结果。
我们已经说过,通过修改RTL代码,对时序的改进效果是最明显的。下面我们就谈谈RTL设计上,有哪些方法可以有效的提高时序。
实现移位寄存器的时候,用寄存器的方式,而不是分布式RAM的方式。
移位寄存器是我们在做逻辑设计的时候经常会用到的电路,例如对跨时钟信号的打拍处理,串行接口的输入输出处理等等。在Xilinx和Lattice的PLD中,一个基本的LUT除了可以做逻辑和运算,还能以分布式RAM的方式实现16×1的移位寄存器。国产的FPGA,比如Anlogic也有这样的功能。使用分布式RAM来实现移位寄存器一个显而易见的好处是节省逻辑资源。一个128位的移位如果用纯逻辑来实现,需要128个寄存器。如果用分布式RAM来做,只需要8个LUT就可以了。但这种实现方式带来的缺点是时序会变差,如果你的设计对时序要求不高但对逻辑资源的使用有较高的要求,可以采用这种方式。
如果通过时序报告,我们发现移位操作已经是影响时序的关键路径,就需要用寄存器的方式,而不是分布式RAM来实现移位操作。通过在RTL代码里加入相应的综合约束,可以实现两种方式的切换。我们后面讨论具体案例的时候再详细讨论实现手段。
更多精彩,持续更新!
接下来《时序漫谈》系列将为您介绍:
通过RTL改善时序的技巧之Block RAM的输出
通过RTL改善时序的技巧之状态机的编码
通过RTL改善时序的技巧之DSP模块的使用
没有回复内容