采用相同工具输入的情况下,Vivado 结果是否可重复?
大多数情况下,答案是肯定的,在以下输入相同的情况下,Vivado 运行多次都应生成相同的结果:
. 设计源
. 约束
. Tcl 脚本及命令顺序
. 工具与命令选项
. Vivado 软件版本
. 操作系统
这适用于从 HDL 综合到比特流生成在内的设计流程的所有部分。例如,构建脚本反复在同一系统上运行或者在相似配置的机器上运行时,应该能生成相同的结果。
不同操作系统之间的结果一般可重复但无法保证,在 Linux 与 Windows 之间尤其如此。
已知例外
部分流程和工具选项不保证可重复性。这些包括:
. route_design -ultrathreads 选项:该选项牺牲可重复性以换取编译速度提升。
. place_design -ultrathreads 选项:该选项能为布局启用逐 SLR 多线程,与不使用 -ultrathreads 选项的布局相比,结果可能有所不同。
在使用 place_design -ultrathreads 时,使用“set_param general.maxThreads”分配的最大线程数也会影响可重复性。
如果最大线程数小于器件 SLR 的数量,则会禁用逐 SLR 多线程,与最大线程数大于或等于器件 SLR 数量时的布局相比,结果会有所不同。
请注意,从 2020.2 版起,使用布局器默认设置或指令选项 RuntimeOptimized 和 Quick 时,默认启用 place_design -ultrathreads。后续版本中,其他指令也可能启用
ultrathreads。
. 对于已包含在 Vivado 内存中的设计,加载已布线的设计检查点 (DCP) 并运行布线后 phys_opt_design 的结果与先运行 route_design 而后立即运行布线后 phys_opt_design 可能有所不同。
确定重复性问题
运行结果不同最常见的症状是布线后的时序结果不同。如果您怀疑存在不可重复性,并已验证工具输入完全相同,则可以使用校验和来进一步验证差异。
Vivado 在每条实现命令的每个中间阶段都会在 log 日志中报告校验和,校验和是基于设计网表和物理数据的签名。
校验和可用于在不同运行之间进行比较,校验和不匹配有助于发现结果中的分歧点所在。
示例:以下校验和开始出现分歧之后不再收敛。如果所有输入都完全相同,那么这很可能就是一个可重复性问题。
检查点对比存内运行
与等效的存内设计流程相比,检查点应产生可重复的结果。请注意以下命令序列,一个是在内存中运行整个设计流程,另一个是在 phys_opt_design 处使用来自存内流程的已布局的检查点重新进入流程。
这两轮运行应产生完全相同的结果。尽管在执行 open_checkpoint 命令后,可能因网表排序差异而产生不同校验和,但在执行第一条实现命令 phys_opt_design 后,校验和应该可以收敛:
每条实现命令都会先对网表进行自动排序,然后再运行,以确保网表一致性,以免因网表差异而导致结果不收敛。在极少数情况下,存内流程与检查点流程的结果可能会出现分歧,但两者间的结果是可以重复的。
报告不可重复问题
如果您遇到如上“解决方案”简介中所述的相同输入情况下出现的不可重复问题,请提交“Service Request”(服务请求),并提供测试用例用于演示问题。
如无测试用例,可能难以找出并解决任何问题,但提供尽可能多的信息会有所帮助。
Linux 和 Windows 之间偶尔会出现不可重复问题,建议限制 Vivado 仅在 Linux 上运行或者仅在 Windows 上运行。
不可重复问题的变通方法
如果您遇到不可重复问题,而可重复性对您的设计环境至关重要,那么以下方法可帮助您尽可能提高可重复性:
在单线程模式下运行。
在不同运行之间使用不同数量的 CPU 时,同步线程可能按不同顺序执行运算并造成结果出现分歧,即便使用相同的机器或系统来运行也是如此。
要在单线程模式下运行,请使用:
set_param general.maxThreads 1
这不仅可禁用多线程,而且还可消除关联的可重复性问题。
消除不可重复的已知根源
请参阅前述“已知例外”章节,了解可重复性,确保不存在其中提及的任何情况。
在相同机器上运行,或者在使用相同操作系统的机器上运行。
这样即可降低因不同操作系统之间(在 Windows 和 Linux 操作系统之间尤其如此)核功能和系统调用的实现方式而导致出现不可重复问题的概率。
通过以下方式可以进一步降低出现此问题的概率
1) 微调环境,消除所有下列情况:
. 使用相同操作系统的不同版本
. 使用不同的服务包级别 (Windows)
. 使用不同分发版或不同补丁级别 (Linux)
2) 消除计算硬件间的差异:
. 使用相同的通用物理及虚拟存储器容量。
. 使用相同的处理器架构和相同数量的核。
. 如果使用虚拟机,请确保使用相同配置。