热度 20
2014-3-7 15:49
2603 次阅读|
0 个评论
在“ BRAM 和 DSP 间的纠缠 ( 一 ) ”中介绍了 Xilinx FPGA 中 BRAM 和 DSP 的使用,可能大家会奇怪为什么博文标题中会有“纠缠”二字,那在本文中将会详细道来。 笔者在 FPGA 项目中多次遇到一个问题:设计中关键路径在 BRAM 和 DSP 之间。也许有读者会问,是不是 BRAM 和 DSP 之间没有寄存器分割路径?答案是有,输出寄存、输入也寄存了,至于为什么产生这个问题,请看以下分析: 以一个简单设计为例,结构如图 1 所示,算法也一目了然 y(n)=x(n)*x(n-128) ,其中 BRAM 延时 128 个时钟, DSP 作为乘法单元。 图 1 顶层 Verilog 代码如下,其中 bram_delay 和 mult 分别为封装 BRAM 原语和 DSP48E1 原语后的模块,模块代码见附件。 以下是代码片段: module top( clk, rst, x, y ); input clk; input rst; input x; output y; wire x_n; bram_delay #(.ADDR_WIDTH(7),.DATA_WIDTH(16)) bram_delay_u( .clk(clk), .rst(rst), .idat(x), .odat(x_n) ); mult #(16,16,32)( .clk(clk), .rst(rst), .a(x), .b(x_n), .p(y) ); endmodule 加入全局时钟约束 491MHz ,经过 vivado 软件综合实现后,时序报告关键路径如图 2 所示,果不其然, setup slack=-0.742 不收敛,是从 BRAM 到 DSP 的这条路径,下面两图分别是综合后框图(左下)和布局布线后结果图(右下)。 图 2 详细的关键路径报告如图 3 所示,在 Data Path 由两部分组成: RAMB36E1(Prop ramb36e1 CLKARDCLK DOADO ) 和 net(fo=1, routed) 。前者属于 BRAM 输出寄存器的 clock_to_out 延时,而后者属于布线延时,显然这个布线延时 0.608ns 过大,对于 491MHz 时钟频率下只有 2.037ns 的余量的情况下。另外当前设计只是时钟频率较高,在设计资源紧缺的情况下,布局不可能如此好, BRAM 和 DSP 是紧挨着的两列布局,因此实际情况中这段布线延时至少会大于 0.608ns 。 图 3 以上算是复现了问题,究其问题的原因是布线过长,布线过长是因为没有寄存器分割,但是 BRAM 和 DSP 之间是有寄存器分割的呀,只不过寄存器是在 BRAM 和 DSP 内部,而 BRAM 和 DSP 的布局位置被限制在资源列中,布局不是那么灵活,至此答案已经很清晰了,只要中间再加入一级寄存器( slice 实现)分割路径即可,修改后的顶层 Verilog 实现代码如下,由于多了一级延时,相应的在 BRAM 中需要减少一级延时: 以下是代码片段: module top( clk, rst, x, y ); input clk; input rst; input x; output y; wire x_n; bram_delay #(.ADDR_WIDTH(7),.DATA_WIDTH(16)) bram_delay_u( .clk(clk), .rst(rst), .idat(x), .odat(x_n) ); reg x_n_rg; always@(posedge clk) begin if(rst) x_n_rg=0; else x_n_rg=x_n; end mult #(16,16,32)( .clk(clk), .rst(rst), .a(x), .b(x_n_rg), .p(y) ); endmodule 修改后的关键路径如图 4 所示虽然 setup clack=-0.272 还是未收敛,但是已经得到了很大的改善,可以发现中间加入寄存器之后, BRAM 和 DSP 间的布线从中间被割断。 图 4 综上,这“纠缠”和解“纠缠”讲诉完毕,这边需要说明一下,这问题不一定适用于所有情况,在低速设计中或者资源不紧张的情况下此问题可以完全忽略。