Vivado synthesis supports the use of custom attributes in RTL. A custom attribute is an attribute who’s behavior synthesis is not already aware. Often, custom attributes are intended for use in other tools downstream from the synthesis process.
CAUTION! When Vivado synthesis encounters unknown attributes, it attempts to forward those attributes to the synthesis output netlist, but you need to understand the risk. A custom attribute does not stop synthesis optimizations from occurring, which means that if synthesis can optimize an item with a custom attribute, it does so, and the attribute is lost.
If you need custom attributes go through synthesis, you must use the DONT_TOUCH or KEEP_HIERARCHY attributes to prevent synthesis from optimizing the objects that need the attributes.
There are two types of objects that can have custom attributes: hierarchies and signals.
When using custom attributes on hierarchies, the -flatten_hierarchy switch must be set to none or a KEEP_HIERARCHY placed on that level, because synthesis by default flattens the design, optimizes the design, and then rebuilds the design.
After a design if first flattened, the custom attribute on the hierarchy is lost.