在之前的博客里介绍过了层次化的综合方法。
但在使用该方法时有一个特殊问题需要注意,对于需要多次例化的模块来说,直接设置set_dont_touch属性会导致pr阶段时工具报ununique问题。
参考如下文章,可以知道问题的来源是如果Non_uniquified 网表,多次实例化模块在网表中只有一个定义,而多次引用同一定义的各个实例内部的flop都需要各自的时钟,从而时钟树上这些模块的clock_net名是不同的,来自layout 工具的时钟树的信息和DC中原网表无法对应,所以会出现两个不同的net和一个相同的port连结,这是不允许的。
https://blog.csdn.net/hepiaopiao_wemedia/article/details/123334713
https://blog.csdn.net/kevindas/article/details/115920834
尽管在综合阶段时,compile_ultra命令会自带uniquify的功能,但如果在约束时就对网表设置了set_dont_touch属性,那么compile_ultra阶段时的uniquify功能就会失败。因此解决的方案其实也很简单,只需要在set_dont_touch属性前运行uniquify,完成多次实例化模块的定义重命名后,再设置set_dont_touch属性就可以了。
通过对比网表,对于non_uniquified网表来说,多个被实例化的模块只能找到一个定义,例如
module U (...)
...
endmodule
module TOP (...)
U U1 ();
U U2 ();
...
endmodule
而uniquify之后就可以发现定义也区分开了:
module U_1 (...)
...
endmodule
module U_2 (...)
...
endmodule
module TOP (...)
U_1 U1 ();
U_2 U2 ();
...
endmodule
因此也不会再出现之前的ununique问题。
标签:层次化,...,set,dont,uniquify,module,touch From: https://www.cnblogs.com/sasasatori/p/18669530