Vivado 节省编译时间系列 3:使用增量综合

Vivado 节省编译时间系列 3:使用增量综合

增量综合流程:

增量综合的工作方式与增量实现流程相似,但仅适用于综合阶段,并且不会对紧随其后的实现阶段给予引导。

此流程需独立的综合参考文件(综合后 DCP),因此您需完成初始综合运行以获取首个综合后 DCP 文件。增量运行会复用设计中未更改的部分,并且仅对已更改的部分进行重新综合。复用的各部分会在分区级别予以保留。

您可通过下文获取有关这些部分的保留方式的更多信息:

support.xilinx.com/s/article/9...

以下图表显示了含脚本的非工程流程:

图:增量流程图表

在 GUI 中支持通过以下两种方法来指定参考检查点:

  • 使用自动增量参考检查点(当前仅在 GUI 中受支持)
  • 使用用户指定的参考检查点

要在工程模式下启用自动模式,请打开综合设置,并选中"Automatically use the checkpoint from the previous run"(自动使用上一轮运行的检查点)选项。

在此模式下,综合运行将把最近的综合后网表自动复制到工程目录本地的 /project.srcs/utils_1/import/design 区域内。

完成整个流程后,新布线的检查点即可立即用作为下一轮运行的参考检查点,并在运行复位时进行更新。 如不勾选自动模式,也可输入用户指定的 DCP 作为参考检查点,以便引导后续轮次的运行。

图:设计运行设置

何时采用此流程

当设计所含实例数量超过 50K 时,始终建议启用此流程。如果设计太小,由于改善的空间不够大,将忽略增量模式,设计将以正常流程运行。

当综合运行超过 20 分钟时,采用增量综合流程前后的运行时间平均比值为 2.06,改善显而易见。 下图显示了 26 个大型设计的加速趋势,在对设计进行有限的更改时,可节省大量编译时间(低至更改前的四分之一)。

下表所示每项设计所耗用的时间也证明,小幅更改设计的前提下,参考运行时间越长,通过增量运行节省的时间就越多。因此,大型设计利用该流程获益颇丰。

建议您始终为大型设计启用自动模式来运行增量综合。但要立即使用增量综合,必须向参考检查点写入综合数据。为此,可使用 write_checkpoint -incremental_synth 开关。

图:部分设计示例中的编译时间节省效果

此处随附的 getSynStepsRunTime.sh 脚本可用于为 synth_design 的每个阶段生成时间剖析表。

要运行该脚本,您可按如下示例所示使用此命令并为初始运行和增量运行生成表格。"actual"(实际)列和"phase"(阶段)列中罗列了用于每个阶段的时间和累计时间。

getSynStepsRunTime.sh ./vivado.log

增量综合运行期间,下列步骤的编译时间都比参考运行更短:"RTL Optimization "(RTL 最优化)、"Area Optimization "(面积最优化)、"Timing Optimization "(时序最优化)和"Technology Mapping"(技术映射)。

下表显示了用户设计示例。请注意参考运行与增量运行中每个综合阶段所耗费的时间。由于这些阶段占用了大部分的参考编译时间,因此对总体运行时间影响尤为显著。

编译时间**** 参考运行(秒) 增量综合运行(秒 )
RTL 最优化 51 9
面积最优化 478 53
时序最优化 76 16
技术映射 202 15
其他阶段 611 502

增量综合期间,"RTL Elaboration "(RTL 细化)、"Constraint Validation "(约束确认)、"Applying XDC Timing Constraints "(应用 XDC 时序约束)、"I/O Insertion "(I/O 插入)、"Global Opt "(全局最优化)、"Netlist Generation"(网表生成)等其他阶段以及其余用于拼接的阶段在时间上所呈现的改善较少。

注释:非关联流程 (out-of-context) 另有所用,它能让子模块像各 IP 一样来运作,因此需要更多手动干预,如创建模块封装文件和限定约束作用域。它也有助于改善编译时间,如果您有静态且无需更改的大型模块,那么此流程能节省该模块的最优化时间。

可能影响增量综合的因素

采用此流程前,以下操作有助于您充分发挥增量流程的优势:

  • 选择正确的检查点。您需确保参考检查点与受引导的设计处于同一器件内,综合时采用的 Vivado 版本与当前运行采用的版本相同。不支持由不同版本生成的 DCP。最重要的是,参考 DCP 须在运行同一综合期间生成,并在 write_checkpoint 期间使用 -incremental_synth 开关来创建。
  • synth_design 设置应始终保持不变,时序约束应始终保持一致。
  • 对受该流程影响的对象数量和跨边界最优化的数量加以限制,确保设计收敛的一致性和时序收敛。设计逻辑更改过多 (>50%) 可能导致更多模块受到影响并且需要重新综合,由此导致增加编译时间或者引导的结果欠佳。
  • 另外,如果少量设计更改引入了参考设计中不存在的新时序问题,则可能需要增加工作量和运行时间,而且设计可能不满足时序。下图显示了 M1 模块和 M3 模块间路径因跨边界最优化而发生改变时,这两个模块进行重新综合的方式。
  • 尽可能将更改局限在单一模块中,否则任何发生更改或消隐的分区都需重新综合。另外,为了防止发生跨边界最优化,您可在层级模块名称上使用 PRESERVE_BOUNDARY 属性,前提是您已寄存输入/输出模块端口。例如:

set_property BLOCK_SYNTH.PRESERVE_BOUNDARY 1 [get_cells [list {M1 M3}]]

图:利用跨模块最优化情况下的综合参考运行对比增量运行

  • 如果在设计中多次例化某个设计模块,那么该模块中的任何小幅更改都会对模块的例化次数产生巨大影响。在此情况下,就需要考量设计更改的总量。
  • 就通过增量综合可减少编译时间的效果而言,大型设始终计比小型设计获益更多。

生成增量编译时间节省报告

综合运行 log 日志中包含网表复用百分比的详细信息。

在此示例中,仅对一个小型实例进行了修改,如果更改发生在某个子模块内,那么该表中也将列出该模块的名称。

总结

我们通过采用增量综合流程可以快速完成综合运行的迭代。该流程设置方便,并且对于设计一致性和编译时间节省都大有益处。如需了解更多详细信息,请参阅 (UG901)。 (微信公众号:小石头的芯语芯愿)

相关推荐
skywalk81636 天前
FPGA硬件设计语言:VHDL和System Verilog
fpga开发·芯片·设计语言
无名之逆14 天前
B树和B+树
javascript·数据结构·b树·算法·编译原理·期末速成
命运之光17 天前
如何让SD NAND芯片跑起来?
芯片·sdnand
Mr.Cssust18 天前
基于FPGA实现SD卡的数据读写(SD NAND FLASH)
嵌入式·verilog·fpga·芯片·sd·存储·flash
嚯呀怪怪怪21 天前
从零基础学Go(九)——Go的Goroutine
golang·线程·多线程·并发·编译原理·协程·gorountine
AUTO_150756759651 个月前
【SCT2617STER 芯洲代理 4.5V-60V Vin 1A 高效降压dc变换器】
芯片
ZenasLDR1 个月前
Type-C取电芯片LDR6500
接口·芯片·usb
Lambor_Ma1 个月前
【ARM】v8架构programmer guide(3)_ARMv8的寄存器
arm开发·架构·硬件架构·ic·fpga·soc·芯片
x-cmd2 个月前
[240727] Qt Creator 14 发布 | AMD 推迟 Ryzen 9000芯片发布
开发语言·qt·项目管理·lua·cpu·芯片·amd
代码改变世界ctw2 个月前
Armv8/Armv9架构的学习大纲-学习方法-自学路线-付费学习路线
arm·trustzone·soc·芯片·armv8·armv9·周贺贺