仅对英特尔可见 — GUID: jbr1446662770544
Ixiasoft
2.4.2.1. 高速时钟域(High-Speed Clock Domains)
2.4.2.2. 重构环路(Restructuring Loops)
2.4.2.3. 控制信号反压(Control Signal Backpressure)
2.4.2.4. 使用FIFO状态信号的流程控制
2.4.2.5. 包含skid缓冲器的流程控制
2.4.2.6. Read-Modify-Write存储器
2.4.2.7. 计数器和累加器
2.4.2.8. 状态机
2.4.2.9. 储存器
2.4.2.10. DSP模块
2.4.2.11. 一般逻辑
2.4.2.12. 求模与除法
2.4.2.13. 复位
2.4.2.14. 硬件重用
2.4.2.15. 算法要求
2.4.2.16. FIFO
2.4.2.17. 三元加法器(Ternary Adders)
5.2.1. 不足的寄存器(insufficient Registers)
5.2.2. 短路径/长路径(short path/long path)
5.2.3. 快进限制(Fast Forward Limit)
5.2.4. 环路(loop)
5.2.5. 每个时钟域一个关键链
5.2.6. 相关时钟组中的关键链
5.2.7. 复杂的关键链
5.2.8. 延伸到可定位的节点
5.2.9. 域边界入口和域边界出口(Domain Boundary Entry and Domain Boundary Exit)
5.2.10. 包括双时钟存储器的关键链
5.2.11. 关键链比特和总线
5.2.12. 延迟线
仅对英特尔可见 — GUID: jbr1446662770544
Ixiasoft
4.1.2. 步骤2:添加流水线级和移除异步复位
第一个优化步骤在Fast Forward建议的设计位置添加了五个级别的流水线寄存器,并删除了设计模块中存在的异步复位。在ALM之间的互连上添加额外的流水线级可以消除一些长的布线延迟。此优化步骤将fMAX性能提高到Fast Forward估计的水平。
添加流水线级并从设计中移除异步复位:
- 打开Median_filter_<version>/Step_1/rtl/hyper_pipe.sv。此文件定义了一个可参数化的hyper_pipe流水线组件,您可以在任何设计中轻松使用此组件。以下是此组件的代码,包括可参数化的宽度(WIDTH)和深度(NUM_PIPES):
module hyper_pipe #( parameter WIDTH = 1, parameter NUM_PIPES = 1) ( input clk, input [WIDTH-1:0] din, output [WIDTH-1:0] dout); reg [WIDTH-1:0] hp [NUM_PIPES-1:0]; genvar i; generate if (NUM_PIPES == 0) begin assign dout = din; end else begin always @ (posedge clk) hp[0] <= din; for (i=1;i < NUM_PIPES;i++) begin : hregs always @ ( posedge clk) begin hp[i] <= hp[i-1]; end end assign dout = hp[NUM_PIPES-1]; end endgenerate endmodule
- 使用可参数化的模块在Fast Forward建议的位置添加一些级别的流水线级。下面的实例显示了如何在dff_3_pipe模块的q输出之前添加延迟:
. . . hyper_pipe #( .WIDTH (DATA_WIDTH), .NUM_PIPES(4) ) hp_d0 ( .clk(clk), .din(d0), .dout(q0_int) ); . . . always @(posedge clk) begin : register_bank_3u if(~rst_n) begin q0 <= {DATA_WIDTH{1'b0}}; q1 <= {DATA_WIDTH{1'b0}}; q2 <= {DATA_WIDTH{1'b0}}; end else begin q0 <= q0_int; q1 <= q1_int; q2 <= q2_int; end end
- 通过将寄存器更改为同步寄存器就可以移除dff_3_pipe模块中的异步复位,如下所示。请参考复位策略来了解有效复位实现的一般示例。
always @(posedge clk or negedge rst_n) // Asynchronous reset begin : register_bank_3u if(~rst_n) begin q0 <= {DATA_WIDTH{1'b0}}; q1 <= {DATA_WIDTH{1'b0}}; q2 <= {DATA_WIDTH{1'b0}}; end else begin q0_reg <= d0; q1_reg <= d1; q2_reg <= d2; q0 <= q0_reg; q1 <= q1_reg; q2 <= q2_reg; end end always @(posedge clk) begin : register_bank_3u if(~rst_n_int) begin // Synchronous reset q0 <= {DATA_WIDTH{1'b0}}; q1 <= {DATA_WIDTH{1'b0}}; q2 <= {DATA_WIDTH{1'b0}}; end else begin q0 <= q0_int; q1 <= q1_int; q2 <= q2_int; end end
这些RTL变更将五级流水线添加到median_wrapper设计的输入(word0,word1和word2总线),并将五级流水线添加到dff_3_pipe模块。下面步骤显示了这些变更的结果。 - 要实现这些变更,保存全部设计变更,然后点击Compilation Dashboard上的Compile Design。
- 编译之后,再次查看Fast Forward Details报告中的Clk时钟域的编译结果。
报告显示了RTL变更对设计Base Performance fMAX的影响。设计性能现在提升到495 MHz。
该报告指出,通过移除更多的异步寄存器,添加更多的流水线寄存器以及解决短路径和长路径的优化限制可以进一步提高性能。以下步骤描述了在设计RTL中这些建议的实现。
注: 作为完成上述步骤的替代方法,您可以打开并编译Median_filter_<version>/Step_1/median.qpf工程文件(此文件已包含这些变更),然后观察结果。