| |
近日看到http://blog.163.com/fpga_ip/blog/static/20444302420127101122794/
题为时序优化的若 干策略的博文,在此做转载,后续会对自己在IC设计过程中使用的优化策略做记录,也希望在此抛砖引玉。。
本文总结了一些可以优化时序的方法,主要是针对xilinx的virtex系列FPGA以及ISE软件。当然,对于其他厂商的FPGA和相应的开发工具,这些方法也是有一定借鉴意义的。这些优化方法全部来自一些实际项目的实践中,具有较强的实用性,希望能给大家带来帮助,也希望各位同行能提出建议和更好的解决办法,促进大家共同进步!
优化方向一:合理使用Blcok RAM和Distributed RAM
1. 均衡Block RAM和Distributed RAM的使用。如果Block RAM使用的过多而Distributed RAM使用的较少,建议将一些小型的fifo用Distributed RAM来实现;如果Distributed RAM使用的过多,而Block RAM有大量富余,建议将一部分由Distributed RAM实现的FIFO改用Block RAM来实现。
2. 当需要使用Block RAM来构建大型的FIFO用作缓存时,由于Block RAM也是分布在FPGA的不同位置,当构建一个FIFO使用的RAM太多时,会给布局布线带来很大的压力。所以建议实施的时候可以用多个中型的FIFO带代替一个大型的FIFO。
3. 不宜使用distributed RAM构建大位宽或者大深度的FIFO。
优化方向二:合理放宽时序约束
1. 当芯片设计中有多个时钟域时,对于那些通过FIFO隔开的时钟域之间,并不需要有太严格的约束。
2. 如果这些不相关的异步时钟是通过同一个MMCM产生的,如果不对这些异步时钟单独约束,那么按照软件的默认行为,这些异步时钟之间的路径是按同步路劲的分析方法进行分析的。这种默认行为的结果就是,一些不应该那么严格约束的路劲被过约束了。
3. 针对这种现象,一种可行的方案是:对同一个MMCM输出的多个异步时钟分别进行时序约束,并且只需约束两时钟域之间异步线路的最大布线延迟,而不需将异步线路中时序逻辑与LUT的响应时间纳入时序约束的范围。
4. Tip3中提及的时序约束方案的示例如下:
NET "CLKA" TNM_NET = "GRP_A";
NET "CLKB" TNM_NET = "GRP_B";
TIMESPEC TS_Path_A_B = FROM "GRP_A" TO "GRP_B" 5 ns DATAPATHONLY;
优化方向三:设置合理的实现工具属性
1. 尝试将synplify->Implementation option->Device->Enable advanced LUT combining属性关闭。
2. 尝试将ISE中Map Properties->Combinatorial logic optimization属性打开。
3. 尝试将ISE中Map Properties->Register duplication 属性打开。
4. 尝试将ISE中Map Properties->Allow logic optimization across hierarchy属性打开。
5. 尝试将ISE中Map Properties->LUT conbining属性关闭。
优化方向四:优化代码
1. 对于那些输出线扇出太大的寄存器,可以考虑在代码中手动复制。为避免复制的寄存器在综合阶段被优化掉,如果使用的是synplify综合工具,可在寄存器定义时使用综合指导属性/* synthesis syn_keep=1 */。
2. 不宜在一个寄存器前放置过多的组合逻辑,如果一个功能涉及的组合逻辑过于复杂,最好是将组合逻辑较均匀的分布在各个寄存器前面。