一文弄懂FPGA时序优化方法

       随着数据传输、处理的速率越来越高,FPGA或数字IC中的工作时钟频率也越来越高,从而使得设计的时序也越来越紧张,甚至时常出现时序违例的情况,导致原先的设计无法稳定在FPGA等硬件中运行,这个时候,掌握时序优化的方法对于设计开发人员来说变得十分重要。

      这里,有一句话和大家一起勉励:时序应该是写出来的,而不是改出来的。优秀的设计开发人员,应该充分认识和理解导致时序变差的因素,并在代码编写阶段尽量去避免引入这些因素,从源头避免出现时序违例的情况。

     在FPGA的时序优化过程中,面积和速度互换的原则贯穿始终。有时候为了让代码能运行在更高的速度,会对数据进行并行处理,牺牲资源来换取更快的速度;有时候,则会为了节省资源,对资源进行复用,从而达到节约资源的目的。

    一般说的时序分析,都是指静态时序分析(STA, static timing analysis),还有动态时序分析,但是目前本人还没接触过,所以没法讲。在静态时序分析中,最常见的时序违例就是建立时间违例、保持时间违例,也就是STA之后,建立时间、保持时间裕量为负数(可以理解为当前设计不满足建立时间、保持时间要求)。静态时序分析的路径大概可以分为三种:输入到寄存器的路径、寄存器到寄存器的路径、寄存器到输出的路径。

一般在设计中最常见的情况就是寄存器和寄存器之间的建立时间违例。即寄存器固有时延+逻辑时延+布线时延+建立时间要求+保持时间要求<1个工作时钟周期。

下面着重讲一下寄存器到寄存器之间的常见的建立时间违例的原因:1.寄存器之间的组合逻辑太复杂;2.时钟频率设置的过高;3.寄存器的扇出太大;4.一些跨时钟域的信号没有做好约束,例如常见的SPI读写寄存器和内部逻辑的交互。5.数据位宽过大。

1.寄存器之间的组合逻辑太复杂。(逻辑时延太大)

//1.bad setup timing codes
    reg [15:0] a;
always@(posedge i_clk or negedge i_rst_n)
if(!i_rst_n)
    a <= 16'd0;
else
    a <= b*c + d*e;

//2.good setup timing codes
    reg [14:0] a0;
    reg [14:0] a1;
    reg [15:0]  a;
always@(posedge i_clk or negedge i_rst_n)
if(!i_rst_n)
    begin
        a0 <= 15'd0;
        a1 <= 15'd0;
    end
else
    begin
        a0 <= b*c;
        a1 <= d*e;
    end

always@(posedge i_clk or negedge i_rst_n)
if(!i_rst_n)
    a <= 16'd0;
else
    a <= a0  + a1;

在上面的两段代码中,第一段代码是建立时间时序相对较差的,因为第一段代码需要在一个时钟内完成两个乘法和一个加法运算,而第二段代码在处理这个运算花了两个时钟周期,第一个时钟周期完成了两个乘法的并行计算,第二个时钟周期完成加法运算。相当于把原本一个时钟完成的事情分成了两个时钟周期完成,寄存器到寄存器之间的逻辑运算复杂度下降,所以建立时间时序更好。还有较为常见的组合逻辑过于复杂的情况是,嵌套了太多层的判断句,if语句下面嵌套了几个if语句。

2.时钟频率设置的过高。(1个工作时钟周期太短)

在设计的过程中,会发现一个256bit*256bit的乘法运算,在50MHz的时钟下,建立时间没有违例,但是在250MHz的时钟下,就可能会出现建立时间违例的情况。因为50MHz时,一个时钟周期为20ns,在一个时钟周期内,建立时间+保持时间+布线延迟+乘法计算的逻辑延迟+寄存器的内部固定时延<20ns这个条件是能满足的,但是始终频率到250MHz后,一个时钟周期为4ns,这个时候,建立时间+保持时间+布线延迟+乘法计算的逻辑延迟+寄存器的内部固定时延<4ns这个条件可能并不容易满足,就会出现时序违例。

3.寄存器的扇出太大。(布线时延过大)

可以理解为此信号和很多其它信号相连接,例如全局复位信号,导致布线困难,最后导致布线时延增加,从而压缩了处理组合逻辑的时间,让原本时序较为紧张的路径出现时序违例的情况。所以有时候,FPGA工程中资源、时序较为紧张的时候,部分开发人员会移除大部分模块中不必要的复位信号。寄存器的扇出太大,可以考虑将寄存器的数据先给到几个不同的寄存器,再用这几个寄存器的输出分别连接其它模块。

4.一些跨时钟域的信号没有做好约束,例如常见的SPI读写寄存器和内部逻辑的交互(布线时延增加)。

FPGA在综合和布局布线的时候,若是跨时钟域路径没约束好,综合和布局布线算法会化很大力气去优化这些伪时序违例路径,进而使得其它时序较为紧张的路径时序变得更差,所以在发现跨时钟域路径时序违例时,应该及时将路径约束好,再约束好跨时钟域路径的前提下再做新的综合和布局布线及静态时序分析等过程。

5.数据位宽过大(逻辑时延过大)。

在一些高速的协议中,数据位宽可能256bit,512bit,一般这种位宽,若时钟速率过高,往往很难在一个时钟周期内完成乘法等运算。常见的方法是将数据拆开,例如拆成高128bit和低128bit,然后并行计算,若还不行,可以进一步拆分为4个64bit的数据,再做并行运算。不管如何,速度面积互换的原则贯穿整个FPGA设计的时钟,想要逻辑能支撑更高的速率,那就得花费更多的计算资源,想要节省资源,那速率就得加快,对资源做时分复用,相对的时序的要求也更高。

以上仅是个人在工作中总结的一些个人经验,仅供参考,目的是分享一下可能会导致FPGA设计中时序违例的情况。还是那句,时序应该是写出来的,而不是改出来的。重要的是,速度面积互换原则需要贯穿设计的始终。如上内容若有错误,希望各位不吝赐教,多多指正。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值