热度 28| |
后端刚入门的时候,师傅通常都会讲到top level blocks之间的信号遵循30/30/30的timing budget经验法则是 -- 30%给上游模块output data path,30%给top level routing,30%给input data path。按这个法则,假设周期为10ns,初学者常常会把input port的约束设成这样:
set_input_delay 7.0 -clock my_clock [get_ports my_input]
这样做语法没问题,但是有潜在风险。
先看看Innovus TCR怎么讲的。
这就是说如果set_input_delay不加-max,同一个约束值会被用在setup analysis和hold analysis。这显然是有风险的。
仍以set_input_delay 7.0 -clock my_clock [get_ports my_input]为例子。在hold analysis时候,这个约束等于告诉工具输入信号my_input到达的时间滞后于时钟my_clock 7ns。假设my_input由一个regA锁存,regA的时钟为my_clock,而且regA的hold requirement是1.5ns。在my_input滞后my_clock 7ns的情况下,只要P&R没发疯,这个regA的hold基本是铁定满足的。风险在哪里呢?假设上游模块信号出来很快,相对于时钟只滞后0.5ns,假设top level里两个模块紧挨着,top level routing delay只有0.5ns。这个场景下my_input到达的时间相对于my_clock只滞后1ns,regA的setup肯定是满足的,但是regA的hold就满足不了了。而由于set_input_delay约束没有加上-max, -min区分,这个hold违例在block P&R,STA的时候都没有发现。等到full chip的时候再发现,就已经非常晚了。
推荐的做法是set_input_delay加上-max,-min并使用不同的约束值。
set_input_delay -max 7.0 -clock my_clock [get_ports my_input]
set_input_delay -min 0.0 -clock my_clock [get_ports my_input]
这里-min 0.0是比较保守的做法。假设时钟到达上游模块,下游模块的时间相同,上游模块使用一个regB驱动输出,这个regB的clock-to-q延迟通常是大于0的,再加上top level routing的delay,-min 0.1-0.5都有可能是合理的。如果考虑top level时钟的skew,时钟到达上游模块下游模块的时间略微不同,那这个skew就要算进去。-min取一个小小的负值也是有可能的。实际上高速系统top level时钟的skew非常重要,要非常严格地控制到尽可能小,top level timing closure才能容易一些。
综合里时钟是ideal的,set_input_delay有没有-max, -min没差别,但还是推荐加上。虽然综合用不到set_input_delay -min,但至少让综合工具查了一下语法。P&R的时候可以用同一个SDC,减少一些麻烦。
时间有限,如有错误,请留言指正。