The Vivado Design Suite respects the DONT_TOUCH property during logic optimization. It does not optimize away nets or cells with these properties. To speed up the net selection process, nets with DONT_TOUCH properties are pre-filtered and not considered for physical optimization. For more information, see section Synthesis Attributes in the Vivado Design Suite User Guide: Synthesis (UG901).
You would typically apply the DONT_TOUCH property to leaf cells to prevent them
from being optimized. DONT_TOUCH on a hierarchical cell preserves the cell boundary,
but optimization might still occur within the cell and constants can still be
propagated across the boundary. To preserve a hierarchical net, apply the DONT_TOUCH
property to all net segments using the -segments
option of get_nets
.
The tools automatically add DONT_TOUCH properties of value TRUE to nets that have MARK_DEBUG properties of value TRUE. This is done to keep the nets intact throughout the implementation flow so that they can be probed at any design stage. This is the recommended use of MARK_DEBUG. However, on rare occasions DONT_TOUCH might be too restrictive and could prevent optimization such as constant propagation, sweep, or remap, leading to more difficult timing closure. In such cases, you can set DONT_TOUCH to a value of FALSE, while keeping MARK_DEBUG TRUE.
The recommended approach for managing MARK_DEBUG usage is the config_flows -mark_debug
option, which allows you to
control optimization of objects with MARK_DEBUG without modifying source files or
constraints. The following three values are supported:
- enable
- Do not optimize MARK_DEBUG nets. This is a default value.
- disable
- Allow both synthesis and implementation to freely optimize MARK_DEBUG nets.
- synthesis_only
- Synthesis will not optimize MARK_DEBUG nets so that they are available at the beginning of implementation, but MARK_DEBUG nets can be freely optimized during implementation.