前言
继续学习sdc的配置知识,这次思考的缘由是在写上一篇 【芯片前端】sdc学习日常——端口delay的正向设置与反向设置 中,写了这样一句话“还有一种方式,是把约束更恶劣的设置放在下面写,这样即使sigx被约束了两次,也会按更恶劣的配置进去。我理解更恶劣的应该是慢时钟的设置”。
但事实上写这句话时,我是非常困惑的,因为这和我之前工作里项目里的经验不一样的。我记得很清楚,之前的要求是把快时钟port的约束放在后面,这样当一个信号误被约束在两个port中时,令其约束在快时钟域的set_input_delay/set_output_delay中。在之前的实操中也一直是这样做的,当然我同时设置了-add并且进行细致的port review来保证没有错约和漏约的问题。
错约的后果
因此这次想讨论的问题就是,如果有错误约束,那么将慢信号约到快时钟域和快信号约到慢时钟域,哪一种会造成问题。
以set_input_delay示例,书中对其有明确的解释:
那么很明确的,input_delay = clk2Q + C1 + C2的时间,换句话说留给C1的时间就是clk_period - input_delay。通过dc timing report也可以印证此事:
从report的计算里也可以很明确的看出,计算时序时是通过endpoint的时钟clk_period - input_delay来计算的时序违规。
在实际的sdc约束中,一般会以对应port的clk_period * ratio来设置delay。那么如果将快信号约束到慢时钟,clk_period * ratio会偏大,等效于输入信号的时序预期更加恶劣;将慢信号约束到快时钟,clk_period * ratio会偏小,等效于输入信号的时序预期更加乐观。而在更加恶劣的预期下match了时序要求,在真实情况下也必然是match的。而在乐观预期下match时序了,在真实情况delay更大的场景下,就有可能出现时序问题。
所以是不是说,应该将慢时钟域的set_delay语句放在下面写才是合理的?