在做项目时,遇到了一些常用的setting,这些setting都比较重要,因此记录在这;
首先我们需要设置下面的变量:
set_app_var timing_remove_clock_reconvergence_pessimism true
这样工具会激活CRPR;
PT在计算CRPR时,基本过程如下
1、比较launch和capture clock path;
2、选择launch和capture clock path的common point;
3、将common point的 minimum/maximum arrival time的差值补偿到path slack中;
以下面的timing report为例:
工具设置为common point为Umux/Z pin,其max arrival time为:314ps, min arrival time为:122ps,两者的差值为192ps,而timing report中的CRPR值也是193(可能是小数点的原因);
造成minimum/maximum arrival difference的原因在于:
1、Minimum/maximum delay differences in the timing behavior of logic gates;
2、Minimum/maximum arrival differences caused by logic reconvergence
首先我们看下图
在激活CRPR后,由于U1和U2是common部分,max为2.2ns,min为1.8ns,而在实际情况下不能同时取fast和slow两种delay,因此工具在report timing时,会在slack中补偿0.4ns;
但是我们需要注意的是,上面的情况针对的是cell rise的情况,那么如果cell fall delay和cell rise delay不一样呢?看下图
可以发现,cell fall delay相比于cell rise delay更小,由于这两者之间存在区别,工具在实际计算CRPR时是分两种情况的,由变量timing_clock_reconvergence_pessimism决定:
1、normal,这种情况下,工具会分别计算rise crp和fall crp,并取这两者中的最小值;
rise_CRP = (late_rise_arrival - early_rise_arrival)
fall_CRP = (late_fall_arrival - early_fall_arrival)
而CRP = MIN(rise_CRP, fall_CRP)
2、same_transition,这种情况下,工具只会将相同transition的CRPR值;
CRPR对min pulse width也有影响,首先我们设置下面的constraints
create_clock -period 4 [get_ports CLK]
set_min_pulse_width -high 1.0 [get_clocks CLK]
set_min_pulse_width -low 1.0 [get_clocks CLK]
在看下图,是一个flop的clock tree,如下图所示
同时,考虑到cell的rise delay和fall delay不同,分别如下
为了保证flop的CP pin的pulse满足其要求,我们需要计算实际到达flop CP pin的pulse宽度;实际到达flop的CP pin的波形如下图所示
可以发现,对于rise edge来说,其max delay为3.3ns,min delay为2.7ns;对于fall edge,其max delay为3.6ns,min delay为2.4ns;
根据上面的波形,可以算出,高电平的最小宽度为:
(min fall edge+2)- (max rise edge)= 1.1ns
而低电平为最小宽度则为:1.1ns;
那么在计算min pulse width时,CRPR的影响是啥呢?
首先看下图
对于min pulse来说,分两种情况,分别是:
1、min pulse high width
2、min pulse low width
计算min pulse high width的方法为:
1、open edge clock latency = (max_rise clock arrival)
2、close edge clock latency = (min_fall clock arrival )
3、actual pulse width (high) = open edge latency – close edge latency + conservative static CRP – clock uncertainty
4、Slack = actual pulse width – required pulse width
这里需要注意的是,对于min pulse high width,其open edge为rise edge,close edge则为fall edge;
计算min pulse low width的方法为:
1、open edge clock latency = (max_fall clock arrival)
2、close edge clock latency = (min_rise clock arrival )
3、actual pulse width (low) = open edge latency – close edge latency + conservative static CRP – clock uncertainty
4、Slack = actual pulse width – required pulse width
这里需要注意的是,对于min pulse low width,open edge指的是fall edge,close edge指的是rise edge;
对于上面的design,设置下面的constraints:
create_clock [get_ports clk] -n clk -period 0.2
set_clock_latency -source -dynamic 0.0003 -late 0.003 clk
set_clock_latency -source -dynamic 0.0002 -early 0.002 clk
使用下面的命令可以查看min pulse width report:
report_min_pulse_width -path_type full_clock_expanded [get_pin ff2/CP]
产生的report如下
1、min pulse low width
2、min pulse high width
这里需要关注具体要看CRPR是怎么计算出来的,可以使用命令:
report_crpr -from ff2/CP -to ff2/CP -significant_digits 6
产生的report如下:
由于是min pulse check,也就是0 cycle check,所以工具省去了dynamic latency,分别计算:rise_crp和fall_crp;
rise_crp = late rise delay - early rise delay
fall_crp = late fall delay - early fall delay
计算后,取两者中的较小值,设置为min pulse wid