UltraFast设计法实践(1) -- Report_Failfast

平台:Vivado16.4

项目:EADCH_2.3.0_Beta

根据《UltraFast Design Methodology Timing Closure Quick Reference Guide 》(UG1292)中的设计流程,第一个阶段是"初始化设计流程检查",该阶段主要要读懂三个操作生成的报告,这三个操作是:

report_failfast

report_timing_summary

report_methodology

1. 初体验report_failfast

有的平台一开始并不能直接使用report_failfast命令,需要安装Xilinx Tcl Store,安装方法见:干掉Vivado幺蛾子(1)-- Xilinx Tcl Store。

在工程综合完成之后,需要打开synthesized design(open synthesized design),使用Tcl命令:xilinx::designutils::report_failfast ,会在Tcl Console窗口得到一张图表,如下图所示:

UltraFast设计法实践(1) -- Report_Failfast

这张表反映的是工程对资源的使用情况,包括参考(推荐)比例、实际比例和状态。当各项实际使用率都符合参考的话,工程进行后续的过程才会相对可靠。我们尤其要关注状态为“REVIEW”的项,它表示超过的参考推荐值,可能存在风险。

我的报告中状态为“review”的有两项:LUT Combining和Control Sets。

2.优化 2.1 LUT Combining

先看LUT Combining,查阅《UltraFast Design Methodology Guide for the Vivado Design Suite》(UG949)中关于它的含义。文中对其的描述如下:

LUT combining reduces logic utilization by combining LUT pairs with shared inputs into single dual-output LUTs that use both O5 and O6 outputs. However, LUT combining can potentially increase congestion because it tends to increase the input/output connectivity for the slices. If LUT combining is high in the congested area (> 40%), you can try using a synthesis strategy that eliminates LUT combining to help alleviate congestion. The Flow_AlternateRoutability synthesis strategy and directive instructs the synthesis tool to not generate any additional LUT combining.

大意是有的LUT pairs共用一些LUT的输入,从而把O5和O6都用上,然后导致线路拥堵。

随后看到这样一个tip:

UltraFast设计法实践(1) -- Report_Failfast

意思是让我执行report_qor_suggestions,试试看,反馈了一些结果,建议opt_design -remap,完成之后再report_failfast,结果反而恶化,但LUT使用减少,如下图

UltraFast设计法实践(1) -- Report_Failfast

随后,UG949中建议尝试方法:

synthesis setting -- strategy -- Flow_AlternateRoutability

说可以采取修改综合策略的方式来优化,将策略改为Flow_AlternateRoutability可以减少LUT combining,从而可以优化拥堵的情况。改后综合,report_failfast报告如下,LUT combining确实减少了,但LUT增加了,这是可以理解的,因为LUT Combining就是复用一些LUT的结果,现在不复用了,所以LUT的使用率增加了。

UltraFast设计法实践(1) -- Report_Failfast

2.2 control_sets

先不管LUT,因为这个可以后期优化掉或者精简代码实现。现在只剩control_sets了,查UG949中对control_sets的描述,如下:

Often not much consideration is given to control signals such as resets or clock enables. Many designers start HDL coding with "if reset" statements without deciding whether the reset is needed or not. While all registers support resets and clock enables, their use can significantly affect the end implementation in terms of performance, utilization, and power.

大致理解是跟一些使能或者复位信号的不合理使用相关。使用report_control_sets -verbose 获取control_sets的详细情况,貌似是导致control_sets的一些设计,然后发现我的模块中大量的跟以下这样一个信号有关,而这个信号大量的作为使能信号。

assign w_divisor_valid = (mult_cnt == 6'd39); // control set 过高可能有这个原因

这样设计是有问题的,故改为时序设计:

always@(posedge clk or negedge rst_n) begin if(rst_n == 1'b0) begin w_divisor_valid <= 1'b0; end else if(mult_cnt == 6'd38) begin w_divisor_valid <= 1'b1; end else begin w_divisor_valid <= 1'b0; end end

之后,再综合--report_failfast,满足要求了!!

UltraFast设计法实践(1) -- Report_Failfast

3.总结

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpwfds.html