首先先介绍几个概念:
建立时间(Tsu):即时钟有效沿到来前数据应该保持的稳定的时间。
保持时间(Th):即时钟有效沿到来后数据应该保持的稳定的时间。
建立时间余量(Tsu_slack):数据要求到达的时间-数据实际到达的时间。即为满足建立时间最晚可以延迟的时间。
保持时间余量(Th_slack):数据结束时间-数据理论结束时间需求。即为满足保持时间需求,富余出来的时间长度。
接下来用两个寄存器的电路传输模型来进行分析:
对Reg2的建立时间进行分析。
其中:
Tclk1为FPGA PAD 时钟引脚到寄存器1的时钟延迟。
Tco为寄存器1时钟到Q端输出的延迟时间。
Tdata为寄存器1的Q端到寄存器2的D端中间经过的组合逻辑电路的延迟时间。
根据上面电路模型可知:
数据实际到达Reg2的D端的时间为:
T arrival time =Tclk1+Tco+Tdata
Lunch edge:发射沿 Latch edge:采样沿
根据上面电路模型可知:
数据理论上应到达的时间为:
T data_req =Tcycle+Tclk2-Tsu
分析完数据的实际到达时间与理论到达时间,接下来对Reg2的建立时间裕量进行分析:
根据建立时间裕量定义以及上图分析,可得建立时间裕量计算如下:
T setup slack = Tcycle+Tclk2-Tsu-(Tclk1+Tco+Tdata)
对于时钟的最大频率,当T setup slack为0时,可以得到最大时钟频率。
即 F = 1/(Tcycle-Tsetup slack)
对Reg2的保持时间进行分析。
根据上面电路模型可知:
数据到达Reg2实际结束的时间:
T finish time =Tclk1+Tco+Tdata + Tcycle.
Lunch edge:发射沿 Latch edge:采样沿
根据上面电路模型可知:
数据理论上结束的时间为:
T data_req =Tcycle+Tclk2+Th.
分析完数据的实际结束时间与理论结束时间,接下来对Reg2的保持时间裕量进行分析:
根据保持时间裕量定义以及上图分析,可得保持时间裕量计算如下:
Th_slack = Tclk1+Tco+Tdata- (Tclk2+Th)
可以看到Th_slack与时钟频率没有关系。
综上所述,可以得出寄存器建立时间裕量与保持时间裕量计算如下:
Tsetup_slack = Tcycle+Tclk2-Tsu-(Tclk1+Tco+Tdata)
Th_slack = Tclk1+Tco+Tdata- (Tclk2+Th)
而电路中经常会发生建立时间与保持时间违例的情况。根据建立时间裕量与保持时间裕量的计算公式可以提出相应的解决办法。
对于建立时间违例,解决办法如下:
1、降低频率
通过增加公式中的Tcycle,从而增加建立时间裕量。
2、提升芯片工艺
通过提升工艺减小寄存器时钟端到输出端Q的时间Tco,从而增加建立时间裕量。
3、减小组合逻辑延迟
通过减小Tdata,增加建立时间裕量。
- 路径优化(并行化,减小延时)
- 优化电路设计
- 卡诺图化简,减小门电路资源
- 插入寄存器,形成流水线
4、后端设计
通过布局布线增加Tskew(即Tclk2-Tclk1),从而增加建立裕量。
对于保持时间违例,解决办法如下:
1、在组合逻辑中插入延时buffer,或者链路拉长,使Tdata时间延长,从而增加保持时间裕量。
2、后端设计
后端版图设计、布局布线调整减小Tskew,从而增加保持时间裕量。
说明:以上内容都是从V3学院课程中总结得到的,博主也是新人,如有错误请不吝指出,谢谢!