该设计咨询所描述的问题是 ILA 探针安放在可驱动其它 LUT 逻辑的 LUT1 逆变器上时,会出现错误的 LUT 方程。
在本示例设计中,已针对调试添加了 ILA 内核。可以看出,opt_design 之后的 LUT 方程与 opt_design 之前的 LUT 方程不匹配。
下面是 LUT 在 opt_design 前后的原理图和真值表。
请注意,在以下前后截屏中 LUT3 的真值表方程在变化,以便让逆变器推进适应 LUT3 的 I1 引脚,但驱动 I1 引脚的 LUT1 逆变器没有按规定从之后的原理图中去除。
运行 opt_design 前:
运行 opt_design 后:
这是因为一个优化过程中的逆变器推进问题,为路径错误地添加了额外的逆变。
加载 LUT 的 LUT 方程在变化,但推进的逆变器因为有探针存在而没有从路径中移除,因此就为该路径增加了额外的逆变。
症状:
在 ILA 探针添加至设计后,这个问题会导致硬件设计失败。
以下 INFO 消息会出现在有关逆变器推进的日志里。
INFO: [Opt 31-138] Pushed 2 inverter(s) to 38 load pin(s).
分辨率:
Vivado 2016.3 中已经修复了该问题,同时也为 2016.1 和 2016.2 的使用提供了几个解决方法:
选项 1:
设置以下参数:
set_param logicopt.enablePartialInvPushingInPresenceOfDTBoundaries 0
该参数可禁用错误的逆变器推进行为。可为 init.tcl 文件添加该参数设置,以便针对所有项目对其进行自动设置。
请查看 (UG894) 第 18 页,了解有关使用 init.tcl 的详细信息。建议使用这个解决方案确保所有用户和项目不受该逆变器损坏的影响。
选项 2:
在任何一个采用以下 XDC 约束所涉及的 LUT 单元上将 DONT_TOUCH 属性设置为 TRUE:
set_property DONT_TOUCH TRUE [get_cells LUT_instance_name]
为本答复记录添加了一个 Tcl 脚本 (find_lut1_md.tcl),其可检查驱动 MARK_DEBUG 网络的 LUT1 逆变器。它不仅可报告 LUT1 的名称,而且还可为其应用一个 DONT_TOUCH 属性。
在 opt_design 之前运行,该脚本可用于防止这个问题,而在 opt_design 之后运行,则可用于检查该问题。tcl.pre 特性可在 opt_design 之前用于运行该脚本。
选项 3:
请将该探针从 LUT1 逆变器输出上移除。此外,这还会减少逻辑级数,因为探针会干扰逆变器推进。
文件名 | 文件大小 | File Type |
---|---|---|
find_lut1_md.tcl | 354 Bytes | TCL |
AR# 67439 | |
---|---|
日期 | 08/02/2016 |
状态 | Active |
Type | 设计咨询 |
器件 | |
Tools |