前面我们文章中,我们聊了Verilog编码风格、module的划分以及其他一些方面,对Design Compiler综合电路的影响。当我们严格按照这些规则去编码之后,往往还是会在DC综合报告中看到有时序违反的情况出现,那我们这时候该怎么办呢?今天我们来探讨一下。 常用的DC命令 在DC脚本中,我们一般会使用默认编译条件,可以很快的得到一个相对准确的编译结果。之后再使用DC中的一些分析时序的命令,得到一些时序分析结果。比较常用命令有一下几个:report_constraint 这条命令能够报告出电路中的所有约束条件,一般含有Design Rule(设计规则)、Setup Time(建立时间)、Hold Time(保持时间)等。通过这条命令,可以一览全局。 report_timing –delay max 这条命令能够报出建立时间的检查路径(Critical Path)。在预综合阶段,Setup Time的路径,我们需要重点关注,并且必须把时序违例的路径修好。report_timing –delay min 这条命令能够报出保持时间的检查路径(Critical Path)。在预综合阶段,Hold Time的路径,我们可以不关注,这些时序违例的路径,在后端处理流程中,会有相应的处理手段。 通过以上的三个命令,我们需要清楚当前电路中的以下时序情况:是否有时序违例的路径存在;时序违例的类型属于哪一种(DC一般根据Startpoint/endpoint,将路径分为4种);时序违例的程度如何等等。 然后综合以上信息,选择相应的方法进行处理。 时序违例路径处理方法 在我们看到存在较大的时序违例情况时,我们一般采取以下的步骤进行处理。检查所添加的约束是否合理;检查是否有胶合逻辑,以及模块划分的合理性;修改RTL代码。 一般在检查了前两项之后,如果没有什么问题,就需要进行RTL修改。修改RTL之前,我们必须先认真分析Timing Report中的这个路径,看是否能通过重新切pipeline,或者逻辑运算前向、后向移动的方法,进行修改。 修改RTL是最有效果,但是也是最麻烦的方法。经过修改的RTL,DC会重新进行优化。通过之前文章所讲,我们知道在这个时候,DC可以使用的方法就比较多样了。 这个过程一般会出现DC综合->修改->DC综合->修改的循环,经过几轮的迭代,最终将时序收敛到我们期望的目标范围内。 几个常用的DC优化命令 我们除了上面的方法之外,DC还提供了一些编译命令,不需要进行RTL修改,也能达到优化时序路径的目标。map_effort 使用方法:compile -map_effort (low | medium | high)。 编译过程分为三个级别:低、中、高。编译效果从好到坏排序:高>中>低,但是相应的编译时间排序由长到短:高>中>低。 在已经出现时序违例的情况下,我们一般可以使用map_effort high来优化时序。incremental_mapping 使用方法:compile -incremental_mapping。 当使用这个命令时,DC在编译过程中,将不再将netlist mapping到GTECH中,故不再做logic level的优化(优化的level分级,可以参看我以前写的文章)。但是DC可以在这个阶段,做gate level的cell替换,可以选择延时更小的cell,以达到满足时序约束的目的。 小结 今天的内容,我们主要介绍了几个常用的DC命令,以及如何处理timing violation的一般步骤。如果您还有其他的方面的经验,欢迎和我进行讨论。 欢迎阅读、点赞、转发、评论。加关注"单眼皮老王",阅读IC设计、图像处理、ASIC、FPGA、AI等相关文章。