fpga系列 HDL: 长组合链路优化(setup violation) & 流水线寄存器

FPGA长组合链优化与流水线设计

代码

代码一

         组合逻辑链过长 可能导致 setup violation

module test(
    input         clk,
    input  [7:0]  a, b, c,
    output reg [15:0] y
);
    reg [15:0] tmp;

    always @(posedge clk) begin
        // 一大串组合逻辑,级联太长
        tmp <= (((((((a+b)+c)+a)+b)+c)+a)+b)+c +a;
        y   <= tmp;
    end
endmodule
  • 在时序收敛分析时,触发器的建立时间(setuptime)是在时钟信号到来之前数据需要保持稳定的时间。但是,在上例的RTL中可以看到,寄存器前有很长的组合逻辑电路,这可能(若时钟频率较高)导致时钟到来时组合逻辑还没有计算完成,而导致setup violation。
    在这里插入图片描述

代码二

  • 通过 流水线寄存器 来优化。打断长链,流水线化:
module test(
    input         clk,
    input  [7:0]  a, b, c,
    output reg [15:0] y
);
    reg [15:0] tmp1, tmp2;

    always @(posedge clk) begin
        // 第一段逻辑
        tmp1 <= (((a+b)+c)+a)+b;
        // 第二段逻辑
        tmp2 <= ((c+a)+b)+c+a;
        // 输出
        y    <= tmp1 + tmp2;
    end
endmodule

效果对比

Quaruts

  • 下面是在Quaruts上优化前后能跑到的最高频率(基于某款十几年前的芯片):
    在这里插入图片描述

多角时序分析(Multicorner Timing Analysis)结果

在这里插入图片描述
在这里插入图片描述

  • 对比上表,可以看到,在最坏情况时序裕量(Worst-case Slack)的Minimum Pulse Width 有所提高

  • 对比上表,可以看到,在最坏情况时序裕量(Worst-case Slack)的Setup时间也有所提高

    • Slack(adj.松弛的;萧条的;n.(绳索的)松弛部分;闲置部分;煤屑) 指在某条时序路径上,实际可用时间所需时间 之间的差值。( T c 2 q T_{c2q} Tc2q: 时钟到输出延迟(寄存器)、 T l o g i c T_{logic} Tlogic: 组合逻辑延迟、 T s e t u p T_{setup} Tsetup: 目标寄存器的建立时间、 T s k e w T_{skew} Tskew: 时钟偏移(可正可负))

      • S l a c k = 可用时间 − 所需时间 S l a c k S e t u p = ( T c l o c k + T s k e w ) − ( T c 2 q + T l o g i c + T s e t u p ) Slack = 可用时间 - 所需时间\\ Slack_{Setup} = (T_{clock} + T_{skew}) - (T_{c2q} + T_{logic} + T_{setup}) Slack=可用时间所需时间SlackSetup=(Tclock+Tskew)(Tc2q+Tlogic+Tsetup)

vivado

  • 代码一
    在这里插入图片描述

在这里插入图片描述

  • 代码二
    在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值