在RTL里,将现有时钟定义点(比如某个分频计数器输出cnt_div[3])经过一个buffer,这个buffer直接调用库里的单元,综合约束里设置dont_touch。新的时钟定义点设置在这个buffer的输出。
这样不论在RTL里,还是综合网表之后,这个定义点永远都在。
在RTL里,将现有时钟定义点(比如某个分频计数器输出cnt_div[3])经过一个buffer,这个buffer直接调用库里的单元,综合约束里设置dont_touch。新的时钟定义点设置在这个buffer的输出。
这样不论在RTL里,还是综合网表之后,这个定义点永远都在。
SDC里加了dont touch,后端流程也受这个约束,不会被优化掉。
我们最后需要得到的结果是:全流程走完后时钟树能满足时序要求,而在后端的CTS流程中,会将这个时钟树上所有的cell列入考虑,包括手动加上的这个buffer。
而且出于各种设计因素考虑,ICG单元,甚至delay cell都可以事先人为添加,何况buffer,inverter之类。工具仅仅是工具,都是按照人的指令干活,最后做出一个符合人为定义的目标。
顶层端口使用 get_ports
内部模块端口使用 get_pins
hierarchy是从顶层模块的下一层开始