I never used the hard macro feature in ISE but you can do something similar in Vivado using pblocks. The general workflow I've used is:
- Synthesis the design
- Create an appropriately-sized pblock with the EXCLUDE_PLACEMENT and CONTAIN_ROUTING directives set (these stop other parts of the design being placed or routed through the pblock)
- Assign the appropriate cells to the pblock then complete the design implementation
- Once complete, extract the cell placement within the pblock
- Next time you need the block, recreate the pblock and create an identical placement within it (using place_cells) post-synthesis.
Most of this requires tcl scripting. There might be a better way of doing this using the partial reconfiguration workflow, though.