setup和hold的本质来源
——主锁存器的锁存机制
触发器电路图
时序特性
Set-up修法
理论公式
T - Tclk-q - Tcomb + Tskew > Tset-up
从公式可以看到,修set-up可以从以下几个方面入手:
(1)增加T,也就是降频,会损害性能,一般不推荐;
(2)增加skew,也就是在时钟网络中引入有用的skew;
(3)减小Tcomb,也就是优化寄存器间的组合逻辑延时;
(4)减小Tclk-q和Tset-up,也就是更换更快的标准单元库,HVT->LVT
具体措施
RTL阶段
(1)插入寄存器(pipeline)
(2)并行化设计:基本思想是将一个大的逻辑函数分解为几个小的逻辑函数并行计算,例如将大位宽的乘法器分解为小位宽的乘法器并行计算,乘法和加法之间再插寄存器
(3)逻辑展平:优化if……else……等优先级逻辑,展平成case语句
(4)均衡设计:合理分配不同寄存器间组合逻辑的延时,即“寄存器配平”
(5)优化路径或路径重组:通过优化数据流的路径来缩短 Critical Path ,提升系统性能。重新布局和 Critical Path 在一起的路径,让Critical Path上的逻辑门可以更靠近目标寄存器,即“迟滞信号后移”。如
module randomlogic(
output reg [7:0] Out,
input [7:0] A,B,C,
input clk,
input Cond1,Cond2);
always @(posedge clk)
if(Cond1)
Out <= A;
else if(Cond2&&(C<8))
Out <= B;
else
Out <= C;
endmodule
//改进后
module randomlogic(
output reg [7:0] Out,
input [7:0] A,B,C,
input clk,
input Cond1,Cond2);
wire CondB = (Cond2 &!Cond1);
always @(posedge clk)
if(CondB&& (C<8))
Out <= b;
else if(Cond1)
Out <= A;
else
Out <= C;
endmodule
综合阶段
利用DC工具本身功能
(1)利用auto-ungroup和boundary timing优化修复,打散design中的层次;
(2)细分group_path,将某些重要的逻辑挑出来设为一个group_path并且赋予相对高的weight;
(3)基于DCT的flow,用物理信息做指导;
(4)对delay比较大的组合路径加set_max_delay;
(5)设置DRC,合理化扇出;
利用库的特性
(6)在不影响功能的前提下选用delay小驱动大的cell;
(7)选用低阈值库。
布局布线阶段
(1)修改floorplan;
(2)CTS时 确保holdtime时,增加时钟路径延时(useful_skew);
(3)Route时是否因为detour造成较大线延时
Hold 修法
理论公式
Tclk-q + Tcomb - Tskew > Thold
从公式可以看到,修hold可以从以下几个方面入手:
(1)减小skew,也就是在做好时钟树的balance;
(2)增加Tcomb,也就是增加寄存器间的组合逻辑延时。
具体措施
RTL阶段
好像做不了什么
综合阶段
将综合后的网表导入PT,利用PT命令“fix_eco_timing -type hold -buffer list {}”和“write_changes -format dctcl -output fix_hold_in_dc.tcl”生成tcl文件到DC中source,其实也是插buffer
布局布线阶段
(1)CTS时减小skew;
(2)在数据路径上插buffer,增大延时。