我们在综合时,为了面积和时序目标,常常开了很多优化选项,比如compile_ultra。这个命令会根据面积和时序的要求,自动ungroup部分子模块,并进行跨模块边界优化。为了优化动态功耗,我们还会自动插入门控时钟。还有DCT、DCG模式,会打开物理优化,为了修复Cap和Transition的违例,进行寄存器复制、子模块端口复制等。下面就这些选项做一些说明。
flatten hierarchy
顾名思义就是打平层次关系,特别是一些纯组合逻辑的小模块,或者以连线为主的粘合逻辑。我们知道时序分析(setup/hold)时有以下几种时序路径:in2reg、reg2reg、reg2out、in2out。判断一条路径是否满足时序要求,就是看路径上的总延时大小。而总延时是跨模块的,或者说是以逻辑锥(logic cone)为单位的。所以打平这些组合逻辑模块后,就不需要保持层次关系的端口,更有利于以逻辑锥为单位进行优化。相反,如果保留子模块pin,优化力度会打折扣。
那是不是把所有层次关系都去掉更好呢?对优化面积和时序,是的。但对LEC、ECO、后仿调试,会大大加大难度。所以,一般建议只flatten跨模块的大组合逻辑。并且建议设计时按逻辑锥来划分模块,即常讲的模块的信号总是用DFF打拍输出。