原创 BRAM和DSP间的纠缠(二)

2017-1-11 15:20 2140 11 11

在“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 [15:0] x;

output [31:0] y;


wire [15:0] 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[7])和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 [15:0] x;

output [31:0] y;


wire [15:0] x_n;

bram_delay #(.ADDR_WIDTH(7),.DATA_WIDTH(16))

bram_delay_u(

.clk(clk),

.rst(rst),

.idat(x),

.odat(x_n)

);


reg [15:0] 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


综上,这“纠缠”和解“纠缠”讲诉完毕,这边需要说明一下,这问题不一定适用于所有情况,在低速设计中或者资源不紧张的情况下此问题可以完全忽略。


文章评论0条评论)

登录后参与讨论
相关推荐阅读
Hoki 2017-01-11 17:35
LX9开发板呼吸灯实现
对LX9开发板硬件评测后,从这一节开始真正进入FPGA开发的世界。很多开发板的例程中必有跑马灯实验,老跑马也没意思,咱来把新潮的,整一个呼吸灯。 呼吸灯最初是出现在apple公司的笔记本产品中,当合上...
Hoki 2017-01-11 16:47
LX9的microblaze配置
虽然XC6SLX9芯片资源比较少,但是嵌一个microblaze还是搓搓有余的,这一节就来评测一下在XC6SLX9上microblaze的配置。 有两种方法配置microblaze,一是在ISE软件中...
Hoki 2017-01-11 16:32
zynq评测
Zynq芯片是业界第一款在FPGA中集成ARM核的芯片,由FPGA的发明者xilinx公司推出的。Zynq严格来说不能以FPGA来定义它,因为其是以处理器为中心的平台,能够在单芯片上提供软、硬件和 I...
Hoki 2017-01-11 16:19
u-boot
Zyny芯片启动加载分为3步: 1. 芯片上电启动,首先读取BootROM中的程序,初始化一些必要的外设,然后根据专用引脚电平判断该从何处启动first stage Bootloader(FSBL),...
Hoki 2017-01-11 16:09
基于zynq的交叉编译平台
Zynq芯片的最大特点是其集成了双ARM Cortex-A9处理器,因此zynq的应用基本是以这个ARM核为核心,再配合FPGA逻辑作为协处理器,几乎能实现所有较复杂的应用。并且在ARM上可以跑操作系...
Hoki 2017-01-11 15:54
u-boot image生成
这节介绍一下如何生成u-boot image文件,在SDK软件中点击Xilinx Tools→Create Boot Image工具即可生成,但是生成image文件需要首先集齐3个文件:u-boot....
我要评论
0
11
1
2
3
4
5
6
7
8
9
0
关闭 站长推荐上一条 /3 下一条